説明
メモリの割り当て方式と対応しない解放関数を使うと、脆弱性につながります。new[] で確保した配列を delete で解放する場合や、カーネルプールの割り当てを通常の free で解放する場合などが該当します。
想定される影響
- ヒープやプールのメタデータが破損し、クラッシュするおそれがあります。
- デストラクターが正しく呼び出されず、リソースリークや未定義の動作が発生する可能性があります。
対処方法
malloc系列の割り当てはfreeで解放してください。newにはdelete、new[]にはdelete[]を使用してください。- プラットフォームやカーネル専用の割り当てには、対応する解放APIを使用してください。
例
変更前
cpp
void run() {
int *items = new int[16];
delete items;
}
変更後
cpp
void run() {
int *items = new int[16];
delete[] items;
}
解説:
- 変更前: 配列の割り当てに
deleteを使用しているため、割り当てと解放の方式が一致しません。 - 変更後:
new[]に対応するdelete[]を使用しています。