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
, u
i v
są używane przed ich zainicjowaniem, i pokazuje rodzaj wartości bezużytecznej, która może spowodować. Zmienne x
, y
i 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
, u
i v
są niezainicjowane, a dane wyjściowe dla elementu s
są nieprzewidywalne:
Value in s: 37816963
Value in w: 42