2026-09-07
read_after_free.c
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *p = malloc(sizeof(int));
*p = 42;
free(p);
printf("%d\n", *p);
}
このコードはたいてい42を出力しますが、それに頼るべきではない危険なコードです。何が問題で、どう直せばよいでしょうか?
Answer
free(p)を呼んだ時点でpが指していたメモリ領域は解放され、p自身はダングリングポインタになります。その後の*pはすでに手放した領域を読むことになり、未定義動作です — たまたま中身が書き換えられずに残っていれば42が出ますが、他の確保がその領域を再利用していればゴミが出ますし、クラッシュすることもあります。最小限の修正は、値を使い終えてからfreeすることです:
int *p = malloc(sizeof(int));
*p = 42;
printf("%d\n", *p);
free(p);