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
}
}
};
関連チェッカー
- CS.EMPTY.CATCH
- ECC.EMPTY (Java) および KT.EMPTY_CATCH_BLOCK (Kotlin)
- CERT.EXCEPTION.SAFETY.ASSIGN_ORDER