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