Useless if

Ненужный, если условный

Описание

Этот дефект возникает на if-операторы, где условие всегда верно. Этот дефект возникает только в операторах if, у которых нет оператора else-.

Этот дефект показывает ненужные if-операторы, когда нет различий в выполнении кода, если if-оператор удаляется.

Риск

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

Зафиксировать

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

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

См. примеры исправлений ниже.

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

Примеры

расширить все

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 всегда рассчитывает значение true, потому что card может быть самое большее 5. The if оператор не нужен.

Коррекция - Изменение условия

Одной из возможных коррекций является изменение условия if в коде. В этой коррекции значение 7 изменяется на UNKNOWN_SUIT непосредственно относиться к типу 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 > UNKNOWN_SUIT) {
        do_something(card);
    }
}
Коррекция - Удалить, если

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

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;
    }

    do_something(card);
}

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

Группа: Поток данных
Язык: C | C++
По умолчанию: On
Синтаксис командной строки: USELESS_IF
Влияние: Средний
Введенный в R2013b