メインコンテンツ

CERT C++: ERR51-CPP

説明

ルール定義

すべての例外を処理します。1

Polyspace 実装

ルール チェッカーは、"処理されない例外がキャッチされない" をチェックします。

すべて展開する

問題

チェッカーは、main 関数の中に try/catch がないか、catch ブロックで catch(...) ブロックを使用してすべての例外を処理していない場合、違反を示します。main 関数が存在しない場合、このルールはチェックされません。

チェッカーは、処理されない型の例外が実際に main に伝播するかどうかは判断しません。

リスク

使用しているハードウェアとソフトウェアによっては、未処理例外が std::abort() 呼び出しにつながる可能性があり、これにより、スタック内の変数を削除せずにプログラムの実行が中止されます。このような異常終了はメモリ リークやセキュリティの脆弱性につながります。

修正方法

未処理例外を回避します。たとえば、main() またはタスクのメイン関数の操作を try-catch ブロック内で実行します。catch ブロックで以下を行います。

  • std::exception 型の例外を該当する catch ブロックで明示的に処理する。

  • サードパーティ ライブラリから発生する例外の基底クラスを処理する。

  • 予期せぬ例外を catch(...) ブロックで処理する。

例 — 例外が未処理のままになる
#include <stdexcept>
int main(){   // Noncompliant
  try {
    // program code
  } catch (std::runtime_error& e) {
    // Handle runtime errors
  } catch (std::logic_error& e) {
    // Handle logic errors
  } catch (std::exception& e) {
    // Handle all expected exceptions
  }
  return 0;
}

この例では、main() で特定の型の例外を処理していますが、catch(...) ブロックがありません。予期せぬ例外は未処理のままです。main()"すべて" の例外を処理するわけではないため、Polyspace® はこの欠陥を報告します。

修正

1 つの修正方法として、catch(...) ブロックを組み込んで予期せぬ例外を処理します。

#include <stdexcept>
int main(){   // Compliant
  try {
    // program code
  } catch (std::runtime_error& e) {
    // Handle runtime errors
  } catch (std::logic_error& e) {
    // Handle logic errors
  } catch (std::exception& e) {
    // Handle all expected exceptions
  }
  catch(...){
	  //Exit gracefully
  }
  return 0;
}

チェック情報

グループ: 08.例外とエラーの取り扱い (ERR)

バージョン履歴

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.