Неинициализированная переменная

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

Описание

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

Риск

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

Фиксация

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

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

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

Если вы не хотите устранять проблему, добавьте комментарии в свой результат или код, чтобы избежать другого анализа. Смотрите Результаты 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++
Значение по умолчанию: на
Синтаксис командной строки: NON_INIT_VAR
Влияние: высоко
ID CWE: 456, 457, 908

Введенный в R2013b