MISRA C++:2008 Rule 15-3-5
A class type exception shall always be caught by reference.
説明
ルール定義
A class type exception shall always be caught by reference. 1
根拠
クラス型の例外が値によってキャッチされると、例外オブジェクトがスライスされる可能性があります。次に例を示します。
class baseException();
class derivedException : public baseException {};
void foo() {
try {
//...
throw derivedException();
}
catch (baseException e) { //slices the thrown exception
//...
}
} foo() 内の catch ブロックで derivedException オブジェクトがキャッチされる場合、そのオブジェクトは derivedException オブジェクトの状態に維持されると想定されます。このオブジェクトは値によってキャッチされるため、baseException オブジェクトにスライスされます。想定外のオブジェクトのスライスは、実行時に予期しないコードの動作につながるリスクがあります。オブジェクトのスライスを回避するには、参照または const 参照によってクラス型の例外をキャッチします。 Polyspace 実装
Polyspace® は、クラス型の例外を値によってキャッチする catch ステートメントにフラグを設定します。
トラブルシューティング
ルール違反が想定されるものの、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.