警告 C6001
初期化されていないメモリ 'variable' の使用。
解説
この警告は、初期化されていないローカル変数が値を割り当てる前に使用されると報告されます。 この使用は、予期しない結果につながる可能性があります。 変数は常に、使用前に初期化する必要があります。
コード分析名: USING_UNINIT_VAR
例
変数が true の場合b
にのみ初期化されるためi
、次のコードではこの警告が生成されます。
int f( bool b )
{
int i;
if ( b )
{
i = 0;
}
return i; // i is uninitialized if b is false
}
この警告を解決するには、次のコードに示すように変数を初期化します。
int f( bool b )
{
int i = -1;
if ( b )
{
i = 0;
}
return i;
}
ヒューリスティック
次の例は、参照によって関数に変数を渡すと、コンパイラが初期化されていることを前提としていることを示しています。
void init( int& i );
int f( bool b )
{
int i;
init(i);
if ( b )
{
i = 0;
}
return i; // i is assumed to be initialized because it's passed by reference to init()
}
これにより、変数へのポインターを初期化関数に渡すパターンがサポートされます。
多くの関数では、初期化されたデータを指すポインターが必要であるため、このヒューリスティックによって偽の否定が発生する可能性があります。 SAL 注釈 (and _Out_
など_In_
) を使用して、関数の動作を記述します。 次の例では、引数が初期化されることを期待する関数を呼び出して、警告が生成されます。
void use( _In_ int& i );
int f( bool b )
{
int i;
use(i); // uninitialized variable warning because of the _In_ annotation on use()
if ( b )
{
i = 0;
}
return i;
}