Aviso C6001
Usando memória não inicializada 'variável'.
Comentários
Esse aviso é relatado quando uma variável local não inicializada é usada antes de ser atribuída a um valor. Esse uso pode levar a resultados imprevisíveis. Você sempre deve inicializar variáveis antes do uso.
Nome da análise de código: USING_UNINIT_VAR
Exemplo
O código a seguir gera esse aviso porque a variável i
só é inicializada se b
for true:
int f( bool b )
{
int i;
if ( b )
{
i = 0;
}
return i; // i is uninitialized if b is false
}
Para corrigir esse aviso, inicialize a variável conforme mostrado no seguinte código:
int f( bool b )
{
int i = -1;
if ( b )
{
i = 0;
}
return i;
}
Heurística
O exemplo a seguir mostra que passar uma variável para uma função por referência faz com que o compilador assuma que ela foi inicializada:
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()
}
Isso dá suporte ao padrão de passar um ponteiro para uma variável em uma função de inicialização.
Essa heurística pode levar a falsos negativos porque muitas funções esperam ponteiros que apontam para dados inicializados. Use anotações SAL, como _In_
e _Out_
, para descrever o comportamento da função. O exemplo a seguir chama uma função que espera que seu argumento seja inicializado, portanto, um aviso é gerado:
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;
}