メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

MISRA C++:2023 Rule 7.0.2

There shall be no conversion to type bool

R2024b 以降

説明

ルール定義

There shall be no conversion to type bool. 1

根拠

基本型から bool への変換は、コンパイラが非ゼロ値を true として扱うことを利用しています。これは、POSIX 標準に準拠しており、特定の整数リターン コードを使用する API と競合します。たとえば、戻り値が -1 の場合はエラーを示す可能性がありますが、コンパイラはこの値を暗黙的に true に変換します。

さらに、bool へのコンテキスト変換の結果は、開発者の想定に反する場合があります。したがって、if ステートメントなどの bool 変換が必要な状況では、明示的に bool 型に評価される式を使用します。

Polyspace 実装

ルール チェッカーは、基本型から bool 型へのコンテキスト変換を実行した場合に違反を報告します。

以下の状況の bool への変換は準拠しています。

  • サイズが 1 のビットフィールドを持つ値から bool への変換。値 0false に変換され、値 1true に変換されるためです。

  • explicit operator bool 式が含まれるクラス タイプでの static_cast<bool> の使用。

  • explicit operator bool 式が含まれるポインターまたはクラスから bool へのコンテキスト変換の実行。

  • type-specifier-seq declarator 形式の条件がある while ループの使用。while ループと同じ結果が得られる同様の方法では、不必要にスコープが広いオブジェクトが必要になるため、これは準拠しています。

トラブルシューティング

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

すべて展開する

int exampleA(){
	class BoolConvertible {
	public:
		explicit operator bool() const { return true; } 
	};

	BoolConvertible obj;
	if (obj) {                        //Compliant
		//...
	}

	struct MyClass {
		int data;
	};
	
	
	int MyClass::*mptr = nullptr;
	if (mptr) {                        //Noncompliant
		//...
	}

	enum Color { RED, GREEN, BLUE };
	Color color = GREEN;
	if (color) {                       //Noncompliant
		//...
	}

	double value = 0.0;
	while (value) {                    //Noncompliant
		//...
	}

	int num = 42;
	if (num) {                         //Noncompliant
		//...
	}
}

この例では以下のようになります。

  • クラス BoolConvertible には explicit operator bool 式が含まれているため、obj から bool 型への変換は準拠になります。

  • 変数 mptrcolorvaluenum はすべて、非準拠の状況で bool 型にコンテキスト変換されます。

チェック情報

グループ: 標準変換
カテゴリ: 必要

バージョン履歴

R2024b で導入


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.