C and C++


LANG.STRUCT.UCTCH : Unreachable Catch

要旨

An exception handler will never be executed because an earlier handler catches all its exceptions.

There are three possible cases.

プロパティ

クラス名 Unreachable Catch
日本語クラス名 Unreachable Catch
クラス分類 冗長性 (redundancy)
ニーモニック LANG.STRUCT.UCTCH
カテゴリー
AUTOSARC++14 AUTOSARC++14:M15-3-6 Where multiple handlers are provided in a single try-catch statement or function-try-block for a derived class and some or all of its bases, the handlers shall be ordered most-derived to base class.
  AUTOSARC++14:M15-3-7 Where multiple handlers are provided in a single try-catch statement or function-try-block, any ellipsis (catch-all) handler shall occur last.
MisraC++2008 MisraC++2008:15-3-6 Where multiple handlers are provided in a single try-catch statement or function-try-block for a derived class and some or all of its bases, the handlers shall be ordered most-derived to base class.
  MisraC++2008:15-3-7 Where multiple handlers are provided in a single try-catch statement or function-try-block, any ellipsis (catch-all) handler shall occur last.
CWE CWE:561 Dead Code
  CWE:703 Improper Check or Handling of Exceptional Conditions
CERT-CPP CERT-CPP:ERR51-CPP Handle all exceptions
  CERT-CPP:ERR54-CPP Catch handlers should order their parameter types from most derived to least derived
JSF++ JSF++:186 There shall be no unreachable code.
対応言語 C++ のみ利用可能です。 C は利用できません。
有効/無効設定 このワーニングクラスのチェックはデフォルトで無効になっており、プロジェクトには非正規の C向けAST が必要になります。有効にするにはプロジェクト設定ファイル (configuration file) に以下の WARNING_FILTER ルールと RETAIN_UNNORMALIZED_C_AST 設定を追加してください。
RETAIN_UNNORMALIZED_C_AST = Yes
WARNING_FILTER += allow class="Unreachable Catch"
注:非正規化された AST を継続して使用した場合、使用ディスク容量が増加し解析時間が長くなる可能性があります。

#include <exception>

class derived_excp : public std::exception {};
class more_derived_excp : public derived_excp {};

namespace lang_struct_uctch{

  void most_to_least(void){
    try {
    } catch ( more_derived_excp ) {
    } catch ( derived_excp ) {                 // ok: base class of more_derived_excp 
    } catch ( std::exception ) {               // ok: base class of derived_excp and more_derived_excp 
    }
  }

  void least_to_most(void){
    try {
    } catch ( std::exception ) {
    } catch ( derived_excp ) {      // 'Unreachable Catch' warning issued here
    } catch ( more_derived_excp ) { // 'Unreachable Catch' warning issued here
    }
  }

  void excp_ptr(void){
    try {
    } catch ( std::exception* ) {
    } catch ( derived_excp* ) {     // 'Unreachable Catch' warning issued here
    }
  }

   void excp_ref(void){
    try {
    } catch ( std::exception& ) {
    } catch ( derived_excp& ) {     // 'Unreachable Catch' warning issued here
    }
  }

  void void_ptr(void){
    try {
    } catch ( void*) {
    } catch ( std::exception* ) {   // 'Unreachable Catch' warning issued here
    }
  }

  void ellipsis(void){
    try {
    } catch (...) {
    } catch ( std::exception ) {    // 'Unreachable Catch' warning issued here
    }
  }

}

関連のある設定ファイルパラメータ

設定ファイルの以下のパラメータがこのワーニングクラスのチェックに影響します。