Dead code

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

Описание

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

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

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

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

Риск

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

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

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

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

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

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

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

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

Примеры

расширить все

#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. The 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++
По умолчанию: On
Синтаксис командной строки: DEAD_CODE
Влияние: Низкое
ИДЕНТИФИКАТОР CWE: 561
Введенный в R2013b