Useless if

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

Описание

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

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

Риск

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

Фиксация

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

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

Смотрите примеры мер ниже.

Если избыточное условие представляет защитные методы кодирования, и вы не хотите устранять проблему, добавлять комментарии в ваш результат или код, чтобы избежать другого анализа. Смотрите Результаты 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 всегда оценивает к истине потому что card может быть самое большее 5. 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);
    }
}
Коррекция — удаляет если

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

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