AUTOSAR C++14 Rule A15-4-2
If a function is declared to be noexcept, noexcept(true) or noexcept(<true condition>), then it shall not exit with an exception
説明
ルール定義
If a function is declared to be noexcept, noexcept(true) or noexcept(<true condition>), then it shall not exit with an exception.
根拠
呼び出し可能なエンティティが例外を発生させないように指定するには、それを noexcept、noexcept(true)、または noexcept(<true condition>) として指定します。コンパイラは、関数 noexcept が例外で終了することを想定していません。そのため、コンパイラは、関数 noexcept の例外処理プロセスを省略します。関数 noexcept が例外で終了すると、コンパイラが処理不能になります。
関数 noexcept が例外で終了する場合、コンパイラは std::terminate() を暗黙的に呼び出します。関数 std::terminate() は処理系定義の方法でプログラム実行を終了します。つまり、プログラム終了の具体的なプロセスは、使用しているソフトウェアとハードウェアの特定の組み合わせに応じて異なります。たとえば、std:terminate() は std::abort() を呼び出してスタックのアンワインドを行わずに実行を異常終了する可能性があり、リソース リークとセキュリティの脆弱性につながります。
関数が例外を発生させないことがわかっている場合にだけ、その関数を noexcept または noexcept(true) として指定します。関数の例外指定が判断できない場合は、noexcept(false) を使用して指定します。
Polyspace 実装
noexcept、noexcept(true)、または noexcept(<true condition>) を使用して呼び出し可能なエンティティを指定した場合は、Polyspace® が呼び出し可能なエンティティの未処理例外をチェックし、例外で終了する可能性がある場合に呼び出し可能なエンティティにフラグを設定します。
呼び出し可能なエンティティが他の呼び出し可能なエンティティを呼び出すと、Polyspace が特定の前提に基づいて未処理例外の可能性があるかどうかを計算します。
関数: 関数
noexceptが別の関数を呼び出すと、Polyspace は、呼び出された関数がnoexcept(<false>)として指定されている場合にのみ、例外を発生させる可能性があるかどうかをチェックします。呼び出された関数がnoexceptとして指定されている場合、Polyspace は例外を発生させないものと仮定します。std::stringのコンストラクターなど、一部の標準ライブラリ関数ではメモリ割り当てを実行するため関数へのポインターを使用し、これによって例外が発生する可能性があります。このような関数はnoexcept(<false>)としては指定されないので、Polyspace はこのような標準ライブラリ関数を呼び出す関数にフラグを設定しません。外部関数:関数
noexceptが外部関数を呼び出すとき、外部関数がnoexcept(<false>)として指定されている場合、Polyspace は関数宣言にフラグを設定します。バーチャル関数:関数がバーチャル関数を呼び出すとき、そのバーチャル関数が派生クラスで
noexcept(<false>)として指定されている場合、Polyspace は関数宣言にフラグを設定します。たとえば、関数noexceptが基底クラスでnoexcept(<true>)として宣言され、派生クラスではnoexcept(<false>)として宣言されたバーチャル関数を呼び出す場合、Polyspace は関数noexceptの宣言にフラグを設定します。関数へのポインター:関数
noexceptが関数へのポインターを呼び出した場合、Polyspace は関数へのポインターが例外を発生させないものと仮定します。
関数によって未処理例外が発生するかどうかを解析するとき、Polyspace は以下を無視します。
デストラクターで発生する例外
atexit()操作で発生する例外
Polyspace は、例外のチェックの際に動的なコンテキストも無視します。たとえば、ある関数が特定の動的コンテキストでのみ未処理例外を発生させる可能性があるとします。Polyspace は例外が発生しない可能性があってもそのような関数にフラグを設定します。
トラブルシューティング
ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。
例
チェック情報
| グループ: Exception Handling |
| カテゴリ: Required、Automated |