CXX.EMPTY.CATCH

空の catch 句は例外を暗黙に破棄する

このチェッカーは、モダンエンジンにのみ適用されます。

CXX.EMPTY.CATCH は、ボディが空の例外ハンドラーを検出します。例外をキャッチしても何のアクションも実行しない、型指定の catch ブロックと catch-all ハンドラーの両方を報告します。空の catch ハンドラーは、例外の処理、ログ記録、伝播を行わず、例外を暗黙に抑制してしまいます。これにより、エラーが隠され、障害の診断が困難になり、デバッグやメンテナンスが複雑化する可能性があります。

軽減と防止

catch ハンドラーのボディは絶対に空にしないでください。少なくとも、例外を無視するという判断を明示的かつ監査可能にするステートメントを追加してください。コンパイラ (および本チェッカー) が解釈できないコメントに頼るのではなく、ログ記録呼び出し、アサーション、明示的な no‑op マーカー関数などを使用してください。例外をさらに伝播させる必要がある場合は、例外を握りつぶさず、再スロー (throw;) してください。

脆弱コード例 1: 空の型指定 catch

コピー
void nonCompliant() {
  try {
    mightThrow();
  } catch (const std::exception &e) {   // CXX.EMPTY.CATCH — exception silently discarded
  }
}

脆弱コード例 2 (空の catch-all)

コピー
void alsoNonCompliant() {
  try {
    mightThrow();
  } catch (...) {                       // CXX.EMPTY.CATCH
  }
}

脆弱コード例 3: コメントのみのボディ (この場合も検出される。既知の制限事項)

コピー
void commentOnly() {
  try {
    mightThrow();
  } catch (...) {
    // intentionally ignored, logged elsewhere   -- CXX.EMPTY.CATCH still fires: comments
  }                                              -- are invisible to the AST
}

修正コード例 1: 処理またはログ記録

コピー
void compliant() {
  try {
    mightThrow();
  } catch (const std::exception &e) {
    log(e.what());
  }
}

修正コード例 2: デストラクターでの握りつぶし (例外、コード変更不要)

コピー
class Resource {
public:
  ~Resource() {
    try {
      release();
    } catch (...) {                     // exempt: nearest enclosing function is a destructor
    }
  }
};

関連チェッカー