UNINIT.STACK.ARRAY.MIGHT

初期化されていない配列の可能性があります

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

脆弱性とリスク

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

軽減と防止

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

脆弱コード例

コピー
  extern void pfoo(int *);
  extern int some_condition();
  
  void uninit_array_might() {
      int *a[10];
      if (some_condition()) {
          int i;
          for(i = 0; i < 10; i++) {
              a[i] = 0;
         }
     }
     pfoo(a[4]);
 }

Klocwork は、配列 'a' が初期化されない可能性があるときに、この配列のメモリが使用される可能性があることを示す 12 行目にフラグを立てます。