メインコンテンツ

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

Each operand of a logical && or || shall be a postfix-expression

説明

ルール定義

Each operand of a logical && or || shall be a postfix-expression. 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) など) の例外を許容します。

トラブルシューティング

ルール違反が想定されるものの、Polyspace® から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

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 がこのルールに違反しています。&& の右側のオペランドと || の左側のオペランドが後置式でないためです。

チェック情報

グループ: Expressions
カテゴリ: 必要

バージョン履歴

R2013b で導入


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.