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

Confira também

Aviso do compilador (níveis 1 e 4) C4700