説明
動的に確保していないメモリ、スタック変数、寿命が終了したローカルオブジェクトのアドレスなどを free、delete、カーネルプールの解放関数に渡すと、不正なメモリ解放が発生します。
想定される影響
- プロセスのクラッシュやカーネルパニックによるサービス拒否が発生する可能性があります。
- ヒープのメタデータ破損により、予測できない動作やセキュリティ上の脆弱性につながるおそれがあります。
対処方法
malloc、calloc、realloc系列で確保したメモリにはfreeを使用してください。deleteはnewで確保したオブジェクトに使用してください。- スタック変数やグローバル変数のアドレスを解放関数に渡さないでください。
例
変更前
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で解放します。