Недостижимый код

Код, не выполненный из-за предыдущих операторов управления

Описание

Недостижимые дефекты кода происходят на коде, который не может быть достигнут из-за предыдущего перерыва в потоке управления.

Операторы, такие как break, goto, и return, перемещают поток программы к другому разделу или функции. Из-за этого Escape потока не выполняются операторы в соответствии с кодом потока управления, статистически, и поэтому операторы недостижимы.

Эта проверка также находит код после тривиальных бесконечных циклов, таких как while(1). Эти типы циклов только выпускают поток программы путем выхода из программы. Этот тип выхода заставляет код после бесконечного цикла быть недостижимым.

Риск

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

Фиксация

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

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

Примеры

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

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

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

    if (card < HEARTS) {
        guess(card);
    }
    return card;
}

В этом примере, там пропускают фигурные скобки и вводящее в заблуждение добавление отступа. Первый оператор return возвращает поток кода туда, где функция была вызвана. Из-за этого оператора возврата if - не выполняются блок и второй оператор return.

Если вы исправляете добавление отступа и фигурные скобки, ошибка становится более ясной.

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

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

    if (card < HEARTS) {
        guess(card);
    }
    return card;
}

Исправление — удаляет, возвращаются

Одно возможное исправление должно удалить оператор Escape. В этом примере удалите первый оператор return, чтобы достигнуть итогового оператора if.

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

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

    if(card < HEARTS)
    {
        guess(card);
    }
    return card;
}

Исправление — удаляет недостижимый код

Другое возможное исправление должно удалить недостижимый код, если вам не нужен он. Поскольку функция не достигает второго if - оператор, удаляя его упрощает код и не изменяет поведение программы.

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

suit deal(void){
    suit card = nextcard();
    if( (card < SPADES) || (card > CLUBS) )
    {
        card = UNKNOWN_SUIT;
    }
    return card;
}
int add_apples(int apple) { 
    int count = 1;
    while(1) {
        if(apple < 99){
            apple++; 
            count++;
        }else{
            count--;
        }
    }
    return count;
}

В этом примере оператор while(1) создает бесконечный цикл. Оператор return count после этого бесконечного цикла недостижим, потому что единственный способ выйти из этого бесконечного цикла состоит в том, чтобы выйти из программы.

Исправление — условие цикла перезаписи

Одно возможное исправление должно изменить условие цикла сделать цикл while конечным. В исправлении в качестве примера здесь, цикл использует оператор от условия if: apple < 99.

int add_apples1(int apple) { 
    int count = 0;
    while(apple < 99) { 
        apple++; 
        count++;
    }
    if(count == 0)
        count = -1;
    return count;
}

Исправление — добавляет оператор завершения

Другое возможное исправление должно добавить пропуск от бесконечного цикла, таким образом, существует возможность достигающего кода после бесконечного цикла. В этом примере break добавляется к блоку else, делающему достижимый оператор return count.

int add_apples(int apple) { 
    int count = 1;
    while(1) {
        if(apple < 99)
        {
            apple++; 
            count++;
        }else{
            count--;
            break;
        }
    }
    return count;
}

Исправление — удаляет недостижимый код

Другое возможное исправление должно удалить недостижимый код. Это исправление очищает код и облегчает рассматривать и поддерживать. В этом примере удалите оператор возврата и измените функциональный тип возврата на void.

void add_apples(int apple) { 
    int count = 1;
    while(1) {
        if(apple < 99)
        {
            apple++; 
            count++;
        }else{
            count--;
        }
    }
}

Проверяйте информацию

Группа: Поток данных
Язык: C | C++
Значение по умолчанию: на
Синтаксис командной строки: UNREACHABLE
Влияние: носитель
ID CWE: 561

Введенный в R2013b