exponenta event banner

Мертвый код

Код не выполняется

Описание

Этот дефект возникает, когда блок кода не может быть достигнут из-за состояния, которое всегда является истинным или ложным. Этот дефект исключает:

  • Code deactivated by constant false condition, который проверяет директивы с константами времени компиляции, такими как #if 0 или if(0).

  • Unreachable code, который проверяет код после перехода к управлению, например, goto, break, или return.

  • Useless if, который проверяет наличие всегда истинных операторов.

Риск

Мертвый код расходует время разработки, память и циклы выполнения. Разработчики должны поддерживать код, который не выполняется. Команды, которые не выполняются, по-прежнему должны храниться и кэшироваться.

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

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

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

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

См. примеры исправлений ниже.

Если вы видите мертвый код от использования таких функций, как isinf и isnan, включите режим анализа, учитывающий неграничные значения. Посмотрите Consider non finite floats (-allow-non-finite-floats).

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

Примеры

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

#include <stdio.h>

int Return_From_Table(int ch){

    int table[5];

    /* Create a table */
    for(int i=0;i<=4;i++){
        table[i]=i^2+i+1;
    }

    if(table[ch]>100){ /* Defect: Condition always false */
         return 0;  
    }
    return table[ch];
}

Максимальное значение в массиве table является 4^2+4+1=21, поэтому тестовое выражение table[ch]>100 всегда возвращает значение false. return 0 в if инструкция не выполнена.

Исправление - удаление мертвого кода

Одной из возможных корректировок является удаление if условие из кода.

#include <stdio.h>

int Return_From_Table(int ch){

    int table[5];

    /* Create a table */
    for(int i=0;i<=4;i++){
        table[i]=i^2+i+1;
    }

    return table[ch];
}
typedef enum _suit {UNKNOWN_SUIT, SPADES, HEARTS, DIAMONDS, CLUBS} suit;
suit nextcard(void);
void do_something(suit s);

void bridge(void)
{
    suit card = nextcard();
    if ((card < SPADES) || (card > CLUBS))
        card = UNKNOWN_SUIT;

    if (card > 7) {
        do_something(card);
    }
}

Тип suit перечисляется с пятью параметрами. Однако условное выражение card > 7 всегда имеет значение false, поскольку card может быть не более 5. Содержимое в if инструкция не выполнена.

Корректировка - изменение условия

Одной из возможных корректировок является изменение условия if в коде. В этой коррекции 7 изменяется на HEART непосредственно относится к типу card.

typedef enum _suit {UNKNOWN_SUIT, SPADES, HEARTS, DIAMONDS, CLUBS} suit;
suit nextcard(void);
void do_something(suit s);

void bridge(void)
{
    suit card = nextcard();
    if ((card < SPADES) || (card > CLUBS))
        card = UNKNOWN_SUIT;

    if (card > HEARTS) {
        do_something(card);
    }
}

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

Группа: Поток данных
Язык: C | C++
По умолчанию: Вкл.
Синтаксис командной строки: DEAD_CODE
Воздействие: Низкий
CWE ID: 561
Представлен в R2013b