Unreachable code

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

Описание

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

Операторы, такие как 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++
Значение по умолчанию: On
Синтаксис командной строки: UNREACHABLE
Удар: Средняя
ID CWE: 561
Введенный в R2013b