Unreachable code

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

Описание

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

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

Эта проверка также находит код, следующий за тривиальными бесконечными циклами, такими как 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) оператор создает бесконечный цикл. The 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

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

int add_apples(int apple) { 
    int count = 1;
    while(1) {
        if(apple < 99)
        {
            apple++; 
            count++;
        }else{
            count--;
            break;
        }
    }
    return count;
}
Коррекция - удаление недоступного кода

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

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

Информация о результатах

Группа: Поток данных
Язык: C | C++
По умолчанию: On
Синтаксис командной строки: UNREACHABLE
Влияние: Средний
ИДЕНТИФИКАТОР CWE: 561
Введенный в R2013b