Avviso C6001
Uso della memoria non inizializzata 'variable'.
Osservazioni:
Questo avviso viene segnalato quando viene usata una variabile locale non inizializzata prima che venga assegnato un valore. Questo utilizzo potrebbe causare risultati imprevedibili. È consigliabile inizializzare sempre le variabili prima dell'uso.
Nome dell'analisi del codice: USING_UNINIT_VAR
Esempio
Il codice seguente genera questo avviso perché la variabile i
viene inizializzata solo se b
è true:
int f( bool b )
{
int i;
if ( b )
{
i = 0;
}
return i; // i is uninitialized if b is false
}
Per correggere questo avviso, inizializzare la variabile come illustrato nel codice seguente:
int f( bool b )
{
int i = -1;
if ( b )
{
i = 0;
}
return i;
}
Euristica
L'esempio seguente mostra che il passaggio di una variabile a una funzione per riferimento fa sì che il compilatore presupporrà che sia inizializzato:
void init( int& i );
int f( bool b )
{
int i;
init(i);
if ( b )
{
i = 0;
}
return i; // i is assumed to be initialized because it's passed by reference to init()
}
Questo supporta il modello di passaggio di un puntatore a una variabile in una funzione di inizializzazione.
Questa euristica può causare falsi negativi perché molte funzioni prevedono puntatori che puntano ai dati inizializzati. Usare annotazioni SAL, ad esempio _In_
e _Out_
, per descrivere il comportamento della funzione. Nell'esempio seguente viene chiamata una funzione che prevede l'inizializzazione dell'argomento, in modo che venga generato un avviso:
void use( _In_ int& i );
int f( bool b )
{
int i;
use(i); // uninitialized variable warning because of the _In_ annotation on use()
if ( b )
{
i = 0;
}
return i;
}