C6328
警告 C6328: <型> はパラメーター <数値> として渡されました。<型> は <関数> への呼び出しに必要です
is* で始まるルーチンで char 型の引数を渡すと、予測できない結果が発生する可能性があります。 たとえば、0x7F を越える値を持つ char 型の SBCS または MBCS のシングルバイト文字は負になります。 char が渡されると、コンパイラはその値を符号付き int または符号付き long に変換します。 この値は、コンパイラによって符号拡張されることがあり、予想外の結果になることがあります。 たとえば、isspace は int 型の引数を受け取りますが、その入力引数の有効な値の範囲は次のようになります。
0 <= c <= 255 に、特殊な値 EOF を加えます。
使用例
Visual C++ では、既定で char は signed 型です。そのため、char 型の変数の値の範囲は -128 <= c <= 127 です。 次のコードを使用するとします。
#include <iostream>
void f( )
{
char c = -37;
int retVal = isspace( c );
// code...
}
この場合、c は値 -37 の符号付き int に符号拡張されます。これは isspace の有効範囲外です。
この問題を解決するには、次のコードに示すように static_cast を使用します。
#include <iostream>
void f( )
{
char c = -37;
int retVal = isspace( static_cast<unsigned char> (c) );
// code...
}
警告 C6328 の目的は、このバグをキャッチすることです。 7 ビットの ASCII 範囲にある文字の場合、このキャストは不要ですが、実行時にこの範囲の外に文字があると、アサートやクラッシュが発生します。