メインコンテンツ

AUTOSAR C++14 Rule A15-5-3

The std::terminate() function shall not be called implicitly

説明

ルール定義

関数 std::terminate() を暗黙的に呼び出してはなりません。

Polyspace 実装

チェッカーは、関数 std::terminate() を暗黙的に呼び出す結果となる可能性がある状況にフラグを設定します。このような状況には以下が含まれます。

  • 例外が未処理のままである。次に例を示します。

    • 例外が処理されているものの、未処理例外を発生させる別の関数によりエスケープする。たとえば、catch ステートメントまたは例外ハンドラーが、未処理例外を発生する別の関数を呼び出す。

    • 空の throw ステートメントにより未処理例外が再発生する。

    詳細は、キャッチされていない例外を参照してください。

  • クラス デストラクターが例外を発生する。

  • std::atexit に渡される終了ハンドラーにより未処理例外が発生する。

トラブルシューティング

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

すべて展開する

#include <stdexcept>
#include <new>
class obj
{
public:
	obj() noexcept(false){}
	obj(const obj& a){
		//...
		throw -1;
	}
	~obj()
	{
		try{
			// ...
			throw std::runtime_error("Error2"); // Noncompliant
		}catch(std::bad_alloc& e){
			
		}
	}
};
obj globalObject;
void atexit_handler(){//Noncompliant
	throw std::runtime_error("Error in atexit function");
}
void main(){
	try{
		//...
		obj localObject = globalObject; //Noncompliant
		std::atexit(atexit_handler);
	}catch(std::exception& e){
		
	}
}

この例では、未処理例外が原因で std::terminate() の暗黙的な呼び出しが行われるため、Polyspace が未処理の例外にフラグを設定します。

  • デストラクター ~obj() は、throw ステートメントによって発生した例外をキャッチしません。デストラクターでの未処理例外が原因で、std::terminate の暗黙的な呼び出しが行われ、プログラムの突然の停止につながります。Polyspace は obj のデストラクターで throw ステートメントにフラグを設定します。

  • main() 関数は、コードで発生するすべての例外を処理するわけではありません。たとえば、obj のコピー コンストラクターによって発生した例外を処理するための catch ブロックが main 関数にない場合などです。未処理例外が原因で std::terminate() の暗黙的な呼び出しが行われる可能性があります。Polyspace は、コピー コンストラクターが呼び出されるステートメントに対する違反を報告します。

  • 終了ハンドラー atexit_handler で、キャッチされない例外が発生します。関数 atexit_handler は、main の実行完了後に実行されます。この関数の未処理例外は他の場所では処理できないため、std::terminate() の暗黙的な呼び出しが行われる可能性があります。Polyspace はこの関数にフラグを設定します。

チェック情報

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

バージョン履歴

R2019a で導入

すべて展開する