コンパイラの警告 (レベル 1 およびレベル 4) C4700

初期化されていないローカル変数 'name' が使用されています

解説

ローカル変数 name は、値が割り当てられる前に使用されています。つまり、読み取られています。 C および C++ では、ローカル変数は既定では初期化されません。 初期化されていない変数には任意の値を含めることができ、その使用によって未定義の動作が発生します。 警告 C4700 は、ほとんどの場合、プログラムで予測できない結果やクラッシュを引き起こす可能性があるバグを示します。

この問題を解決するには、ローカル変数が宣言されたときに初期化するか、使用する前に値を割り当てることができます。 関数を使用して、参照パラメーターとして渡される変数を初期化するか、そのアドレスがポインター パラメーターとして渡されるときに使用できます。

/sdl (追加のセキュリティ チェックを有効にする) コンパイラ オプションは、この警告をエラーに昇格させます。

このサンプルでは、変数tuv初期化される前に使用されるときに C4700 が生成され、結果として生じる可能性のあるガベージ値の種類が示されます。 変数xyz、使用する前に初期化されるため、警告は発生しません。

// 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、初期化uvされていない場合、出力sは予測できません。

Value in s: 37816963
Value in w: 42