exponenta event banner

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

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

Описание

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

Риск

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

Зафиксировать

Исправление зависит от первопричины дефекта. Например, вы назначили значение переменной, но назначение недоступно, или вы назначили значение переменной в одной из двух ветвей условного оператора. Исправьте недоступный код или отсутствующее назначение.

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

См. примеры исправлений ниже. Рекомендуется инициализировать переменную при объявлении.

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

Примеры

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

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
Воздействие: Высокое
CWE ID: 456, 457, 908
Представлен в R2013b