メインコンテンツ

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

MISRA C++:2023 Rule 18.1.1

An exception object shall not have pointer type

R2024b 以降

説明

ルール定義

An exception object shall not have pointer type. 1

根拠

throw 式が動的に割り当てられたオブジェクトへのポインターの場合は、割り当てられたリソースの割り当て解除ポイントがあいまいになります。このようなあいまいさはメモリ リークにつながる可能性があります。ポインターを例外としてスローすると、有効期間が終了したオブジェクトに関数がアクセスできるようになり、未定義の動作が発生する場合があります。

ポインターを例外として使用することは避けてください。代わりに、参照によって例外をスローします。<> を参照

Polyspace 実装

チェッカーは、throw ステートメントがポインター型の例外をスローする場合に違反を報告します。

チェッカーは、NULL ポインターが例外としてスローされる場合、違反を報告しません。

トラブルシューティング

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

すべて展開する

extern int flag;
class A{/**/};
void foo(void){
	A a;
	A* a_pointer = new A;
	A& a_ref = a;
	if(flag==0){
		throw a;
	}
	
	else if(flag==2){
		throw a_pointer;//Noncompliant
	}
	
	else if(flag==-1){
		throw a_ref;
	}
	else if(flag==-2){
		throw &a; //Noncompliant
	}
}

この例では、関数 foo() がいくつかの例外をスローします。Polyspace は、throw オペランドがポインターになっている throw ステートメントにフラグを設定します。コピーまたは参照による例外の報告は、このルールに準拠しています。

チェック情報

グループ: Exception Handling
カテゴリ: Required

バージョン履歴

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.