メインコンテンツ

MISRA C++:2008 Rule 15-5-3

The terminate() function shall not be called implicitly

説明

ルール定義

The terminate() function shall not be called implicitly 1

Polyspace 実装

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

  • 例外がキャッチされずにエスケープする。これは、MISRA C++:2008 Rule 15-3-2 にも違反します。次に例を示します。

    • 例外がキャッチされる前に、キャッチされていない例外をスローする別の関数によって例外がエスケープする。たとえば、catch ステートメントまたは例外ハンドラーが、キャッチされていない例外をスローするコピー コンストラクターを呼び出します。

    • 空の throw 式により、キャッチされない例外が再発生します。

  • クラス デストラクターが例外を発生する。デストラクターでの例外は、MISRA C++:2008 Rule 15-5-1 にも違反します。

  • 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(){//Noncompliant
	try{
		//...
		obj localObject = globalObject;
		std::atexit(atexit_handler);
	}catch(std::exception& e){
		
	}
}

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

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

  • main() 関数は、コードで発生するすべての例外を処理するわけではありません。未処理例外が原因で std::terminate() の暗黙的な呼び出しが行われる可能性があるため、Polyspace は main() 関数にフラグを設定します。

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

チェック情報

グループ: Exception Handling
カテゴリ: 必要

バージョン履歴

R2018a で導入

すべて展開する


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.