MISRA C++:2008 Rule 15-3-3
Handlers of a function-try-block implementation of a class constructor or destructor shall not reference non-static members from this class or its bases.
説明
ルール定義
Handlers of a function-try-block implementation of a class constructor or destructor shall not reference non-static members from this class or its bases. 1
根拠
関数 try ブロックのハンドラー catch ブロックは、関数本体および初期化子リストから発生した例外を処理します。これらの catch ブロックは、クラスのコンストラクターおよびデストラクターで使用されている場合、クラスの非静的メンバーの作成中または破棄中に発生した例外を処理する可能性があります。つまり、クラスの非静的メンバーの有効期間が始まる前、または終わった後に、catch ブロックが実行される可能性があります。このような catch ブロックでクラスの非静的メンバーにアクセスする場合、コンパイラはまだ作成されていないオブジェクトまたは削除済みのオブジェクトにアクセスしようとする可能性があります。これは未定義の動作です。次に例を示します。
class C{
private:
int* inptr_x;
public:
C() try: inptr_x(new int){}
catch(...){
intptr_x = nullptr;
//...
}
};C のコンストラクターを実装するために、関数 try ブロックを使用して、初期化子リストでのメモリ割り当て操作で発生した例外を処理します。この function-try-block の catch ブロックで、クラス メンバー C.intptr_x にアクセスします。catch ブロックは、intptr_x のメモリ割り当てが失敗すると実行されます。つまり、catch ブロックは、メンバーの有効期間が始まる前にこのメンバーへのアクセスを試行します。これは未定義の動作です。未定義の動作を回避するには、コンストラクターおよびデストラクターの function-try-block 実装の catch ブロックで、オブジェクトの非静的データ メンバーや基底クラスを使用しないようにします。
Polyspace 実装
コンストラクターまたはデストラクター function-try ブロックの catch ブロックに含まれるステートメントが次のいずれかにアクセスする場合、Polyspace® はそのステートメントにフラグを設定します。
オブジェクトの非静的メンバー
オブジェクトの基底クラス
基底クラスの非静的メンバー
トラブルシューティング
ルール違反が想定されるものの、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.