FMM.MIGHT

一致しない関数でのメモリの解放の可能性があります

割り当て済みメモリを解放または割り当て解除する場合は、対応する割り当て解除関数を使用して行う必要があります。メモリを、1 つのメカニズムを使用して割り当て、他のメカニズムを使用して解放する場合、たとえば、C と C++ のメモリ管理関数の混合使用、スカラーメモリ管理関数とベクターメモリ管理関数の混合使用などの場合、未定義の動作が生じる可能性があります。FMM.MIGHT チェッカーは、メモリの割り当てと割り当て解除に、一致しない関数が使用されている可能性のあるインスタンスにフラグを立てます。

脆弱性とリスク

メモリの割り当てと割り当て解除に、一致しない関数を使用すると、一般には予期しないプログラム動作になる結果になり、アプリケーションをサービス拒否 (DoS) 攻撃にさらす可能性やメモリ破損問題を引き起こす可能性があります。特にオブジェクトの配列では、メモリの間違った要素が解放されると、ヒープメモリが破損する可能性があります。重大なメモリリークが発生し、DoS 攻撃またはプログラムクラッシュに悪用される可能性があります。

軽減と防止

割り当て関数と割り当て解除関数には、次のテーブルに示す対応するペアを必ず使用してください。

割り当て関数 割り当て解除関数
malloc()、calloc()、realloc() free
演算子 new() 演算子 delete()
演算子 new[]() 演算子 delete[]()
配置子 new() デストラクタ

脆弱コード例

コピー
  class A {
          int *data;
          A(const A&) { /* prohibited */ }
          A& operator =(const A&) { /* prohibited */ }
      public
          A() {
              data = new int [10];
          }
  
         ~A() {
             delete[] data;
         }
 };
 
 void foo(A **pp, bool t) {
     if (!*pp) {
         *pp = new A[5];
     }
     if (t) {
         delete *pp;
         *pp = 0;
     }
 }

Klocwork は、17 行目で '*pp' で指されるメモリが new[] 演算子によって割り当てられ、20 行目で delete[] ではなく、delete 演算子によって解放される可能性があることを指摘する、一致しない割り当て解除レポートを生成します。このような割り当て関数と割り当て解除関数の不一致は、予想できないプログラム動作を引き起こし、アプリケーションを悪意のある攻撃に対して脆弱にする可能性があります。

拡張機能

このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、C/C++ 解析のチューニングを参照してください。