コンパイラの警告 (レベル 1 およびレベル 4) C4700
初期化されていないローカル変数 'name' が使用されています
解説
ローカル変数 name は、値が割り当てられる前に使用されています。つまり、読み取られています。 C および C++ では、ローカル変数は既定では初期化されません。 初期化されていない変数には任意の値を含めることができ、その使用によって未定義の動作が発生します。 警告 C4700 は、ほとんどの場合、プログラムで予測できない結果やクラッシュを引き起こす可能性があるバグを示します。
この問題を解決するには、ローカル変数が宣言されたときに初期化するか、使用する前に値を割り当てることができます。 関数を使用して、参照パラメーターとして渡される変数を初期化するか、そのアドレスがポインター パラメーターとして渡されるときに使用できます。
/sdl
(追加のセキュリティ チェックを有効にする) コンパイラ オプションを使用すると、この警告がエラーに昇格されます。
例
このサンプルでは、変数が初期化される前に変数 t
、 u
、および v
を使用すると C4700 が生成され、結果として生じる可能性のあるガベージ値の種類が示されます。 変数 x
、 y
、および z
は、使用する前に初期化されるため、警告は発生しません。
// c4700.cpp
// compile by using: cl /EHsc /W4 c4700.cpp
#include <iostream>
// function takes an int reference to initialize
void initialize(int& i)
{
i = 21;
}
int main()
{
int s, t, u, v; // Danger, uninitialized variables
s = t + u + v; // C4700: t, u, v used before initialization
std::cout << "Value in s: " << s << std::endl;
int w, x; // Danger, uninitialized variables
initialize(x); // fix: call function to init x before use
int y{10}; // fix: initialize y, z when declared
int z{11}; // This C++11 syntax is recommended over int z = 11;
w = x + y + z; // Okay, all values initialized before use
std::cout << "Value in w: " << w << std::endl;
}
このコードを実行すると、 t
、 u
、および v
が初期化されておらず、 s
の出力は予測できません。
Value in s: 37816963
Value in w: 42