UNINIT.CTOR.MIGHT.UNCLEAR
未解決の条件下で初期化されていないクラスメンバーが使用される可能性があります
UNINIT.CTOR.MIGHT.UNCLEAR チェッカーは、条件が成立する場合にのみ関数がクラスフィールドを読み取り、その条件を Klocwork が証明も否定もできないケースを検出します。このチェッカーをレポートするには、KW_RW_CONDITIONAL 環境変数を 0 以外の値に設定します。このチェッカーはデフォルトで無効です。
脆弱性とリスク
C++ では、プリミティブデータ型の変数は明示的に初期化する必要があります。メソッドまたはヘルパー関数が、解決できない条件の下でクラスフィールドを読み取ると、予想外の動作につながり、セキュリティに影響を及ぼす可能性があります。
軽減と防止
メソッドまたはヘルパー関数がクラスフィールドを読み取る前に、コンストラクタがすべてのクラスフィールドを初期化するようにします。KW_RW_CONDITIONAL で条件付き R/W ナレッジベースのサポートを有効にすると、一部のプロジェクトでは解析時間が長くなることがあります。
脆弱コード例
コピー
extern bool enabled();
class C {
public:
int value;
C(bool init) {
if (init) {
value = 0;
}
}
};
void use_if_enabled(C *arg) {
if (enabled()) {
int copy = arg->value;
(void)copy;
}
}
int main() {
C item(false);
use_if_enabled(&item);
return 0;
}
Klocwork は 23 行目にフラグを立てます。これは、use_if_enabled 内の条件を解決できない場合、use_if_enabled の呼び出しによって未初期化のクラスフィールド item.value が読み取られる可能性があるためです。