Udostępnij za pośrednictwem


Ostrzeżenie C4700 kompilatora (poziom 1 i 4)

użyto niezainicjowanej zmiennej lokalnej "name"

Uwagi

Użyto nazwy zmiennej lokalnej, czyli odczytanej z, zanim została przypisana wartość. W językach C i C++zmienne lokalne nie są domyślnie inicjowane. Niezainicjowane zmienne mogą zawierać dowolną wartość, a ich użycie prowadzi do niezdefiniowanego zachowania. Ostrzeżenie C4700 prawie zawsze wskazuje usterkę, która może powodować nieprzewidywalne wyniki lub awarie w programie.

Aby rozwiązać ten problem, możesz zainicjować zmienne lokalne po ich zadeklarowaniu lub przypisać do nich wartość przed ich zastosowaniem. Funkcja może służyć do inicjowania zmiennej, która jest przekazywana jako parametr odwołania, lub gdy jego adres jest przekazywany jako parametr wskaźnika.

Opcja kompilatora /sdl (Włącz dodatkowe kontrole zabezpieczeń) podnosi to ostrzeżenie do błędu.

Przykład

Ten przykład generuje C4700, gdy zmienne t, ui v są używane przed ich zainicjowaniem, i pokazuje rodzaj wartości bezużytecznej, która może spowodować. Zmienne x, yi z nie powodują ostrzeżenia, ponieważ są inicjowane przed użyciem:

// 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;
}

Po uruchomieniu tego kodu , t, ui v są niezainicjowane, a dane wyjściowe dla elementu s są nieprzewidywalne:

Value in s: 37816963
Value in w: 42