メインコンテンツ

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

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

NULL shall not be thrown explicitly.

説明

ルール定義

NULL shall not be thrown explicitly. 1

根拠

マクロ NULL は一般に、NULL ポインターを参照するために使用されます。コンパイラは、NULL をポインターではなく値がゼロの整数として解釈します。throw ステートメントで NULL を明示的に使用する場合、このステートメントによってポインター型の例外が報告されることがあります。throw(NULL)throw(0) と等価であり、整数例外を報告します。この動作は開発者の想定に反しており、見つけにくいバグの原因となる可能性があります。throw ステートメント内での NULL の明示的な使用を回避します。

Polyspace 実装

Polyspace® は、NULL を明示的に報告する throw ステートメントにフラグを設定します。Polyspace は、特定の型へのキャストまたはポインター型への割り当て後に NULL が報告される場合には、ステートメントにフラグを設定しません。

トラブルシューティング

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

すべて展開する

typedef          char         char_t;
typedef signed   int          int32_t;

#include <cstddef>

void foo()
{
	try {
		char_t * p1 = NULL;		
		throw ( NULL );            // Noncompliant
		throw(p1); //Compliant
		throw ( static_cast < const char_t * > ( NULL ) ); // Compliant
	} catch ( int32_t i ) {        // NULL exception handled here
		// /*...*/
	} catch ( const char_t * ) { // Other two exceptions are handled here
		// /*...*/
	}
}

この例では、throw ステートメントを使用することで 3 つの例外が直接報告されます。

  • Polyspace は、throw(NULL) ステートメントが NULL を例外として明示的に報告するため、このステートメントにフラグを設定します。このステートメントが報告するポインター型例外が、2 番目の catch ブロックで処理される場合があります。このステートメントで実際に報告される int 例外は、1 番目の catch ブロックで処理されます。

  • 他の throw ステートメントは、throw ステートメントでの NULL 使用が、準拠した方法であることを示します。たとえば 2 番目の throw ステートメントでは、値 NULL が割り当てられている char* が報告されます。3 番目の throw ステートメントでは、NULLchar* にキャストすることで char* が報告されます。これらのステートメントは NULL を明示的に報告しないので、Polyspace はこれらにフラグを設定しません。

チェック情報

グループ: Exception Handling
カテゴリ: 必要

バージョン履歴

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.