CERT.ERR.UNCAUGHT_STATIC_INIT

main() の実行開始前にスローされた例外を処理する。

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

CERT.ERR.UNCAUGHT_STATIC_INIT チェッカーは、構築、破棄、または初期化の際に、キャッチ可能なスコープの外で例外をスローする可能性のある静的オブジェクトおよびスレッドローカルオブジェクトを検出します。静的初期化中にスローされた例外は、main() が開始する前にプログラムを終了させる可能性があります。スローする可能性のあるデストラクターも、プログラム終了時またはスレッド終了時にプログラムを終了させる可能性があります。

脆弱性とリスク

静的初期化中にスローされた例外は、main() 内の try ステートメントでは処理されません。構築または初期化中にスローされた場合、ランタイムは main() が開始する前に std::terminate() を呼び出します。静的オブジェクトまたはスレッドローカルオブジェクトの noexcept ではないデストラクターは、プログラム終了時またはスレッド終了時に例外をスローする可能性があります。

軽減と防止

静的記憶域期間およびスレッド記憶域期間を持つオブジェクトのコンストラクタ、デストラクタ、および初期化子が例外を投げないようにしてください。該当する場合には `noexcept` を指定し、静的初期化の前、または明示的なエラー報告メカニズムを通じてエラーを処理するようにしてください。

脆弱コード例

コピー
#include <stdexcept>

int load_value();

struct Config {
    Config() : value(load_value()) {}
    int value;
};

Config global_config; // CERT.ERR.UNCAUGHT_STATIC_INIT

main() が開始する前に、ランタイムがオブジェクトを初期化する際、global_config のコンストラクターが例外をスローする可能性があります。

修正コード例

コピー
#include <optional>

int load_value() noexcept;

struct Config {
    Config() noexcept : value(load_value()) {}
    int value;
};

Config global_config; // No CERT.ERR.UNCAUGHT_STATIC_INIT defect

修正例では、例外をスローしない初期化子とコンストラクターを使用しています。この原則は、静的デストラクターおよびスレッドローカルデストラクターにも適用されます。

制限事項

このチェッカーは、最新の AST に対する浅いレベルのカバレッジを提供します。このチェッカーは、完全なパスベースの例外フロー解析を提供せず、また、例外をスローする可能性のあるすべての間接呼び出しをモデル化することもありません。