不正なメモリ解放

動的に確保していないメモリの解放

説明

動的に確保していないメモリ、スタック変数、寿命が終了したローカルオブジェクトのアドレスなどを free、delete、カーネルプールの解放関数に渡すと、不正なメモリ解放が発生します。

想定される影響

  • プロセスのクラッシュやカーネルパニックによるサービス拒否が発生する可能性があります。
  • ヒープのメタデータ破損により、予測できない動作やセキュリティ上の脆弱性につながるおそれがあります。

対処方法

  1. malloc、calloc、realloc 系列で確保したメモリには free を使用してください。
  2. delete は new で確保したオブジェクトに使用してください。
  3. スタック変数やグローバル変数のアドレスを解放関数に渡さないでください。

例

変更前

c
void run(void) {
    int value = 0;
    int *p = &value;
    free(p);
}

変更後

c
void run(void) {
    int *p = malloc(sizeof(int));
    if (p == NULL) {
        return;
    }
    free(p);
}

解説:

  • 変更前: p はスタック変数 value のアドレスを指すため、free(p) は不正な解放です。
  • 変更後: p は malloc で確保したヒープメモリを指し、対応する free で解放します。

参考資料