MISRA C++:2008 Rule 5-2-1

Каждый операнд логического && или || должен быть постфиксным выражением

Описание

Управляйте определением

Каждый операнд логического && или || должен быть постфиксным выражением.

Объяснение

Это правило эффективно требует что операнды логического && или || операция быть соответственно заключенным в скобки. Например, вместо a + b || c, правило требует (a + b) || c или a + (b || c). В обоих совместимых случаях, левом операнде ||, это - (a + b) или b, первичное выражение и поэтому также постфиксное выражение. Для получения дополнительной информации о постфиксных выражениях смотрите C++ 03 Стандарта (Раздел 5.2).

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

Реализация Polyspace

Средство проверки повышает нарушение если логический && или || операнд не является постфиксным выражением.

Постфиксное выражение может быть первичным выражением, таким как простой идентификатор или комбинация идентификаторов, заключенных в круглые скобки, но также и одно из следующего:

  • Вызов функции, такой как func().

  • Доступ к элементу массива, такой как arr[].

  • Доступ к элементу структуры, такой как aStructVar.aMember.

Для полного списка постфиксных выражений смотрите C++ 03 Стандарта (Раздел 5.2).

Средство проверки позволяет исключения на ассоциативных цепях, таких как (a && b && c) или (a || b || c).

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

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

bool Operations(bool a, bool b, bool c, bool priority) {
    bool res;
    if(priority) {
        res = a && b || c;  //Noncompliant
    }
    else {
        res = a && (b || c); //Compliant
    }
    return res;
}

В этом примере, выражение a && b || c нарушает правило потому что правильный операнд && и левый операнд || не постфиксные выражения.

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

Группа: Выражения
Категория: необходимый
Введенный в R2013b