メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

CERT C++: DCL57-CPP

Do not let exceptions escape from destructors or deallocation functions

説明

ルール定義

Do not let exceptions escape from destructors or deallocation functions.1

Polyspace 実装

ルール チェッカーは、"例外で終了するクラス デストラクター" をチェックします。

すべて展開する

問題

チェッカーは以下にフラグを設定します。

  • try-catch ブロック外部にあるデストラクター本体の明示的な throw ステートメント。デストラクターで別の関数が呼び出されていても、チェッカーはその呼び出された関数で例外が発生するかどうかを検出しません。

  • デストラクター宣言での例外指定 noexcept(false)

チェッカーは以下を検出しません。

  • catch ステートメントで、スローされているすべての型の例外がキャッチされていない。

    チェッカーは、try ブロックに対応する catch ステートメントの存在を、例外がキャッチされていることを示すものだと見なします。

  • throw ステートメントが catch ブロック内にある。

リスク

デストラクターはコード実行の最後に呼び出されます。この段階で例外が発生すると処理されなくなります。このような未処理例外が発生すると、使用しているハードウェアとソフトウェアによっては、コンパイラはスタック内のオブジェクトを削除せずにプログラムの実行を突然終了する可能性があります。このような突然の終了はリソース リークやセキュリティの脆弱性につながる可能性があります。

修正方法

この問題を回避するには:

  • デストラクターを noexcept(true) として宣言する。

  • catch(...) ブロックを含む try-catch ブロックを使用して、デストラクターで発生する可能性がある例外を処理する。

#include<stdexcept>
class C {
	//...
	~C() noexcept(false) { //Noncompliant
		//...
		throw std::logic_error("Error"); //Noncompliant
	}
	
};

この例では、クラス C のデストラクターが noexcept(false) として指定されています。Polyspace® は宣言にフラグを設定します。デストラクターに try-catch ブロックで囲まれていない明示的な throw ステートメントが含まれています。Polyspace は throw ステートメントにフラグを設定します。

修正

1 つの修正方法として、デストラクターを noexcept(true) として宣言し、throw ステートメントがあれば try-catch ブロックで囲みます。

#include<stdexcept>
class C {
	//...
	~C() noexcept(true) { //Compliant
		//...
		try{
			throw std::logic_error("Error"); //Compliant
		}catch(...){
			
		}
	}
	
};

チェック情報

グループ: 01.宣言と初期化 (DCL)

バージョン履歴

R2019a で導入


1 This software has been created by MathWorks incorporating portions of: the “SEI CERT-C Website,” © 2017 Carnegie Mellon University, the SEI CERT-C++ Web site © 2017 Carnegie Mellon University, ”SEI CERT C Coding Standard – Rules for Developing safe, Reliable and Secure systems – 2016 Edition,” © 2016 Carnegie Mellon University, and “SEI CERT C++ Coding Standard – Rules for Developing safe, Reliable and Secure systems in C++ – 2016 Edition” © 2016 Carnegie Mellon University, with special permission from its Software Engineering Institute.

ANY MATERIAL OF CARNEGIE MELLON UNIVERSITY AND/OR ITS SOFTWARE ENGINEERING INSTITUTE CONTAINED HEREIN IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT.

This software and associated documentation has not been reviewed nor is it endorsed by Carnegie Mellon University or its Software Engineering Institute.