Dead code

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

Описание

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

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

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

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

Риск

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

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

Фиксация

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

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

Смотрите примеры мер ниже.

Если вы видите мертвый код от использования функций, таких как 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 всегда оценивает ко лжи. 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 всегда оценивает ко лжи потому что card может быть самое большее 5. Содержимое в 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
Удар: низко
ID CWE: 561
Введенный в R2013b