Предупреждение 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;
}