メモリの割り当てと解放の不一致

割り当て方式と一致しない方法によるメモリ解放

説明

メモリの割り当て方式と対応しない解放関数を使うと、脆弱性につながります。new[] で確保した配列を delete で解放する場合や、カーネルプールの割り当てを通常の free で解放する場合などが該当します。

想定される影響

  • ヒープやプールのメタデータが破損し、クラッシュするおそれがあります。
  • デストラクターが正しく呼び出されず、リソースリークや未定義の動作が発生する可能性があります。

対処方法

  1. malloc 系列の割り当ては free で解放してください。
  2. new には delete、new[] には delete[] を使用してください。
  3. プラットフォームやカーネル専用の割り当てには、対応する解放APIを使用してください。

例

変更前

cpp
void run() {
    int *items = new int[16];
    delete items;
}

変更後

cpp
void run() {
    int *items = new int[16];
    delete[] items;
}

解説:

  • 変更前: 配列の割り当てに delete を使用しているため、割り当てと解放の方式が一致しません。
  • 変更後: new[] に対応する delete[] を使用しています。

参考資料