メインコンテンツ

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

The right hand operand of a logical && or || operator shall not contain side effects.

説明

ルール定義

The right hand operand of a logical && or || operator shall not contain side effects. 1

根拠

評価されると、二次的影響のある式はその式内の 1 つ以上の変数を変更します。たとえば、n++ は二次的影響のある式です。

以下の右側のオペランドについて:

  • 論理 && 演算子の場合は、左側のオペランドが true に評価された場合にのみ評価されます。

  • 論理 || 演算子の場合は、左側のオペランドが false に評価された場合にのみ評価されます。

その他の場合は、右側のオペランドが評価されないため、式の二次的影響が及びません。プログラムが二次的影響に依存している場合は、予期せぬ結果が生じる可能性があります。

Polyspace 実装

チェッカーは、右側のオペランドが二次的影響を含む式となっている論理的な && 演算子または || 演算子にフラグを設定します。Polyspace® は次のように仮定します。

  • 変数を 1 つ以上変更する式には二次的影響が含まれる。

  • 宣言されているが定義されていない明示的なコンストラクターまたは変換関数には、二次的影響は含まれない。定義されている変換関数には、二次的影響が含まれる。

  • volatile アクセスと関数呼び出しには二次的影響が含まれない。

トラブルシューティング

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

すべて展開する

class real32_T {
public:
	real32_T() = default;

	/* Casting operations */
	explicit real32_T(float a) {
		// ...
	}
	/* Relational operators */
	bool operator==(real32_T a) const;
	bool operator>(real32_T a) const;
};

void bar() {
	real32_T d;


	
	if ((d == static_cast<real32_T>(0.0F))
	|| (static_cast<real32_T>(0.0F) > d)) {//Noncompliant
		/**/
	}
}



void foo(int i, int j){
	if(i==0 && ++j==i){ //Noncompliant
		--i;
	}
}

関数 foo&& 演算子の右オペランドには、二次的影響があるインクリメント演算が含まれています。Polyspace はこの演算子にフラグを設定します。関数 bar|| 演算子の右オペランドには、クラスに実装されている変換関数が含まれています。Polyspace ではこのようなコンストラクターには二次的影響が含まれると見なされています。右演算子には二次的影響が含まれるので、この演算子にフラグが設定されます。

チェック情報

グループ: 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.