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 が読み取られる可能性があるためです。

関連チェッカー