Non-initialized variable

Переменная, не инициализированная перед использованием

Описание

Этот дефект происходит, когда переменная не инициализируется, прежде чем ее значение читается.

Риск

Если переменная явным образом не инициализируется, значение переменных непредсказуемо. Вы не можете использовать переменную, имеющую определенное значение.

Фиксация

Фиксация зависит от первопричины дефекта. Например, вы присвоили значение переменной, но присвоение недостижимо, или вы присвоили значение переменной в одной из двух ветвей условного оператора. Зафиксируйте недостижимый код или недостающее присвоение.

Часто детали результата показывают последовательность событий, которые привели к дефекту. Можно реализовать закрепление на любом событии в последовательности. Если детали результата не показывают историю события, можно проследить использование, щелкните правой кнопкой по опциям по исходному коду и смотрите предыдущие связанные события. См. также Интерпретируют Результаты Bug Finder в Пользовательском интерфейсе Рабочего стола Polyspace.

Смотрите примеры мер ниже. Это - хорошая практика, чтобы инициализировать переменную в объявлении.

Если вы не хотите устранять проблему, добавьте комментарии в свой результат или код, чтобы избежать другого анализа. Смотрите Результаты Polyspace Адреса Через Исправления ошибок или Выравнивания.

Примеры

развернуть все

int get_sensor_value(void)
{
    extern int getsensor(void);
    int command;
    int val;

    command = getsensor();
    if (command == 2) 
      {
        val = getsensor();
      }

    return val;              
    /* Defect: val does not have a value if command is not 2 */
}

Если command не 2, переменная val является неприсвоенным. В этом случае, возвращаемое значение функционального get_sensor_value является неопределенным.

Коррекция — инициализирует во время объявления

Одна возможная коррекция должна инициализировать val во время объявления так, чтобы инициализация не была исключена на некоторых путях к выполнению.

int get_sensor_value(void)
{
    extern int getsensor(void);
    int command;
    /* Fix: Initialize val */
    int val=0;

    command = getsensor();
    if (command == 2) 
      {
        val = getsensor();
      }

    return val;              
 }

val присвоен начальное значение 0. Когда command не равно 2, функциональный get_sensor_value возвращает это значение.

Информация о результате

Группа: Поток данных
Язык: C | C++
Значение по умолчанию: On
Синтаксис командной строки: NON_INIT_VAR
Удар: высоко
ID CWE: 456, 457, 908
Введенный в R2013b