Предупреждение C6001

Использование неинициализированной памяти "переменная".

Замечания

Это предупреждение сообщается, когда неинициализированная локальная переменная используется перед назначением значения. Это использование может привести к непредсказуемым результатам. Перед использованием всегда следует инициализировать переменные.

Имя анализа кода: USING_UNINIT_VAR

Пример

Следующий код создает это предупреждение, так как переменная i инициализирована только в том случае, если b имеет значение true:

int f( bool b )
{
   int i;
   if ( b )
   {
      i = 0;
   }
   return i; // i is uninitialized if b is false
}

Чтобы исправить это предупреждение, инициализировать переменную, как показано в следующем коде:

int f( bool b )
{
   int i = -1;

   if ( b )
   {
      i = 0;
   }
   return i;
}

Эвристика

В следующем примере показано, что передача переменной в функцию по ссылке приводит к тому, что компилятор предполагает, что он инициализирован:

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()
}

Это поддерживает шаблон передачи указателя на переменную в функцию инициализации.

Эта эвристика может привести к ложным отрицательным значениям, так как многие функции ожидают указателей, указывающих на инициализированные данные. Используйте заметки SAL, такие как _In_ и _Out_, чтобы описать поведение функции. В следующем примере вызывается функция, которая ожидает инициализации его аргумента, поэтому создается предупреждение:

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

См. также

Предупреждение компилятора (уровни 1 и 4) C4700