UNINIT.STACK.MIGHT.UNCLEAR

未解決の条件下で初期化されていない変数が使用される可能性があります

UNINIT.STACK.MIGHT.UNCLEAR チェッカーは、条件が成立する場合にのみ関数が非クラスタイプのローカル変数を読み取り、その条件を Klocwork が証明も否定もできないケースを検出します。このチェッカーをレポートするには、KW_RW_CONDITIONAL 環境変数を 0 以外の値に設定します。このチェッカーはデフォルトで無効です。

脆弱性とリスク

C++ では、スタック変数はデフォルトで初期化されていません。通常、スタックメモリの現在の内容の、ランダムなジャンクデータがスタック変数に含まれます。呼び出し元で解決できない条件の下で関数がその値を読み取る場合でも、予想外の動作につながり、セキュリティに影響を及ぼす可能性があります。

軽減と防止

変数を読み取る可能性がある関数を呼び出す前に、変数が初期化されていることを確認します。KW_RW_CONDITIONAL で条件付き R/W ナレッジベースのサポートを有効にすると、一部のプロジェクトでは解析時間が長くなることがあります。

脆弱コード例

コピー
  extern int get_id(void);

  struct copy {
    int id;
    int len;
  };

  void set(struct copy *arg) {
    if (arg->id != 0) {
      int my_len = arg->len;
      (void)my_len;
    }
  }

  int main() {
    struct copy var;
    var.id = get_id();
    set(&var);
    return 0;
  }

Klocwork は 18 行目にフラグを立てます。これは、set 内の条件を解決できない場合、set の呼び出しによって未初期化の変数 var.len が読み取られる可能性があるためです。

関連チェッカー