メインコンテンツ

AUTOSAR C++14 Rule A15-4-1

Dynamic exception-specification shall not be used

R2021a 以降

説明

ルール定義

Dynamic exception-specification shall not be used.

根拠

動的例外指定は、関数宣言で throw(<list of exceptions>) ステートメントを使用して、例外が発生した場合の関数の動作を指定する手法です。動的例外指定の使用には、以下の問題が伴います。

  • パフォーマンス コスト:動的例外指定は実行時にチェックされることから、オーバーヘッドが増え、コードのパフォーマンスが低下する可能性があります。

  • 汎用のプログラミングに適していない:通常、関数またはクラス テンプレートによって報告される例外の正確なタイプを事前に知ることはできないため、汎用のコードでは throw ステートメントの使用が難しくなる可能性があります。

これらの理由から、throw(<list of exceptions>) ステートメントを使用して例外を指定しないようにしてください。代わりに、noexcept キーワードを使用します。noexcept ステートメントはコンパイル時にチェックされるため、汎用プログラミングに適しており、通常は throw ステートメントよりもパフォーマンスが向上します。C++11 規格では、将来的に動的例外指定を C++ から除去すると規定しています。

Polyspace 実装

throw(<list of exceptions>) ステートメントが関数宣言で使用されている場合、Polyspace®throw ステートメントにフラグを設定します。Polyspace は、例外を報告するために使用されている throw ステートメントにはフラグを設定しません。

トラブルシューティング

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

すべて展開する

#include <string>
// throw for raising exception is compliant
void F9 () throw(std::runtime_error) {   //Non-compliant
	throw (std::runtime_error("foo"));   //Compliant
}
// Both declaration and definition is flagged
void F11 () throw(std::runtime_error);   //Noncompliant
void F11 () throw(std::runtime_error) {} //Noncompliant
// Instantiated and Noninstantiated templates are flagged
template <class T>
void F10 () throw(std::runtime_error) {  //Noncompliant
	throw (std::runtime_error("foo"));   //Compliant
}

template <class T>
void F12 () throw(std::runtime_error);   //Noncompliant
template <class T>
void foo() noexcept(noexcept(T())) {}//Compliant

void bar () {
	foo<int>();  // noexcept(noexcept(int())) => noexcept(true)
	F10<std::string> ();                 //Compliant
	
}

Polyspace は、関数宣言および定義で動的例外指定として使用されている throw(std::runtime_error) などのステートメントにフラグを設定します。動的例外指定は回避してください。代わりに、noexcept キーワードを使用します。foo テンプレートでは noexcept キーワードを例外指定として使用しているため、このルールに準拠しています。

チェック情報

グループ: Exception handling
カテゴリ: Required、Automated

バージョン履歴

R2021a で導入