Condividi tramite


Avviso del compilatore (livelli 1 e 4) C4700

variabile locale non inizializzata 'name' usata

Osservazioni:

Il nome della variabile locale è stato usato, ovvero leggere da, prima che sia stato assegnato un valore. In C e C++ le variabili locali non vengono inizializzate per impostazione predefinita. Le variabili non inizializzate possono contenere qualsiasi valore e l'uso comporta un comportamento non definito. Avviso C4700 indica quasi sempre un bug che può causare risultati imprevedibili o arresti anomali nel programma.

Per risolvere questo problema, è possibile inizializzare le variabili locali quando vengono dichiarate o assegnare un valore prima che vengano usate. Una funzione può essere usata per inizializzare una variabile passata come parametro di riferimento o quando il relativo indirizzo viene passato come parametro puntatore.

L'opzione del /sdl compilatore (Abilita controlli di sicurezza aggiuntivi) eleva questo avviso a un errore.

Esempio

Questo esempio genera l'errore C4700 quando le variabili t, ue v vengono usate prima dell'inizializzazione e mostra il tipo di valore di Garbage che può risultare. Le variabili x, ye z non causano l'avviso, perché vengono inizializzate prima dell'uso:

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

Quando questo codice viene eseguito, t, ue v non sono inizializzati e l'output per s è imprevedibile:

Value in s: 37816963
Value in w: 42