AUTOSAR C++14 Rule M15-1-1
The assignment-expression of a throw statement shall not itself cause an exception to be thrown
説明
ルール定義
The assignment-expression of a throw statement shall not itself cause an exception to be thrown.
根拠
C++ では、throw
ステートメントを使用して、例外を明示的に発生させることができます。コンパイラは、このような throw
ステートメントを次の 2 段階で実行します。
まず、
throw
ステートメントの引数を作成します。コンパイラは、コンストラクターを呼び出すか、代入式を評価して引数オブジェクトを作成します。次に、作成したオブジェクトを例外として発生させます。コンパイラは、例外オブジェクトを互換性のあるハンドラーと一致させようとします。
コンパイラが throw
ステートメントで予期された例外を作成しているときに予期せぬ例外が発生した場合は、予期された例外ではなく、予期せぬ例外が発生します。throw
ステートメントでクラス myException
の明示的な例外が発生する次のコードを考えます。
class myException{ myException(){ msg = new char[10]; //... } //... }; foo(){ try{ //.. throw myException(); } catch(myException& e){ //... } }
myException
オブジェクトの構成中に、new
演算子が bad_alloc
例外を発生させる可能性があります。このような場合は、throw
ステートメントが myException
ではなく bad_alloc
例外を発生させます。myException
は予期された例外のため、catch ブロックには bad_alloc
との互換性がありません。bad_alloc
例外は未処理例外になります。この例外は、スタックのアンワインドを行わずにプログラムの異常終了を引き起こす可能性があり、リソース リークやセキュリティの脆弱性につながります。throw
ステートメントの引数から発生する予期せぬ例外がリソース リークやセキュリティの脆弱性を引き起こす可能性があります。このような望ましくない結果を防ぐには、throw
ステートメント内の引数として例外を発生させる可能性のある式の使用を避けます。
Polyspace 実装
Polyspace® は、例外を発生させる可能性のある throw
ステートメント内の式にフラグを設定します。例外を発生させる可能性のある式:
noexcept(false)
として指定された関数明示的な
throw
ステートメントが複数含まれている関数メモリ割り当て操作を実行するコンストラクター
動的キャスティングを含む式
トラブルシューティング
ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。
例
チェック情報
グループ: Exception handling |
カテゴリ: Required、Automated |
バージョン履歴
R2020b で導入