exponenta event banner

Мертвый код

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

Описание

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

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

  • Unreachable code, который проверяет на код после Escape управления, такого как goto, break или 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++
Значение по умолчанию: на
Синтаксис командной строки: DEAD_CODE
Влияние: низко
ID CWE: 561

Введенный в R2013b