FREE.INCONSISTENT

一貫性のないメモリの解放

一貫性なしにメモリを解放すると、場合によってはメモリリークを起こす可能性があります。メモリは関数のすべてのパスで確実に解放することが重要です。FREE.INCONSISTENT チェッカーは、直接または一連の逆参照操作とフィールド操作によりメモリがアクセスされ、その後、関数のパスの 1 つで解放され、他のパスでは解放されないインスタンスにフラグを立てます。通常、この問題はエラー状態中またはセッションに予期しない中断があった場合に発生します。

脆弱性とリスク

一貫性のないメモリ解放は、メモリリークを引き起こし、ソフトウェアは信頼を失います。そして攻撃者が意図的にリークをトリガーすると、サービス拒否 (DoS) 攻撃を受ける可能性があります。

軽減と防止

この問題を回避するには、エラー状態とその他の例外状態を含めて、関数のすべてのパスで確実にメモリを解放し、そして、プログラムのどの部分がメモリの解放を担当するのかで混乱を起こさないことです。

脆弱コード例

コピー
  void my_free(char *p, int flag) {
      if (flag == 17) {
          p = 0;
          return;
      }
      if (flag == 34) {
          return;
      }
      free(p);
 }

Klocwork は、'p' によって指されるメモリが、9 行目で解放されるが、関数が終了する 4 行目または 7 行目では解放されないことを示す、一貫性のないメモリ解放レポートを生成します。一般に、メモリの解放されるパスは、実際のコードではこの例よりさらに後に削除されるポイントになるので、そのような状況を認識するのは困難になります。いずれにせよ、1 つの関数のパスでメモリの解放に失敗すると、メモリリークを引き起こし、攻撃に対して脆弱になる可能性があります。

拡張機能

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