UNINIT.STACK.ARRAY.PARTIAL.MUST

部分的に初期化されていない配列

UNINIT.STACK.ARRAY.PARTIAL.MUST チェッカーは、メモリがまだ完全には初期化されていないときにローカル配列のメモリが読み取られるインスタンスを検出します。

脆弱性とリスク

C++ では、スタック変数はデフォルトで初期化されていません。通常、スタックメモリの現在の内容の、ランダムなジャンクデータがスタック変数に含まれます。初期化されていないデータには、プログラムフローを意図しない方法で変更し、セキュリティに影響を及ぼす可能性のある値が含まれていることがあります。

軽減と防止

初期化の問題を回避するには、最初に使用する前に、すべての変数およびリソースが明示的に初期化されていることを確認します。複雑な条件の状況についてはメモをとり、すべてのパスに初期化が含まれていることを確認します。

脆弱コード例

コピー
  int incomplete_init() {
      int a[10];
      int i;
      for (i = 9; i > 0; i--) {
          a[i] = i;
      }
      return a[0];
  }

Klocwork は、インデックスが 0 に等しい初期化されていない配列 'a' の要素が使用されていることを示す 7 行目にフラグを立てます。