メインコンテンツ

AUTOSAR C++14 Rule A15-1-2

An exception object shall not be a pointer

説明

ルール定義

例外オブジェクトはポインターであってはなりません。

根拠

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

ポインターを例外として使用することは避けてください。代わりに、コピーによる例外を報告します。

Polyspace 実装

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

チェッカーは、NULL ポインターが例外としてスローされる場合、違反を報告しません。NULL ポインターのスローは、AUTOSAR C++14 Rule M15-1-2 に従って禁止されています。

トラブルシューティング

ルール違反が想定されるものの、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、Automated

バージョン履歴

R2019a で導入