上級 › free()した後のポインタを使っても動いてしまう(use-after-free) › パターン1
free()した後のポインタを使っても動いてしまう(use-after-free)
free()で解放したメモリに対して読み書きを続けても、多くの場合その場ではクラッシュせず、直前まで入っていた値がそのまま読めてしまいます。
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main(void) { 5 int *p = malloc(sizeof(int)); 6 *p = 42; 7 _________________ ^ 8 printf("%d\n", *p); 9 return 0; 10 }
出力: 42とは無関係な値(実行のたびに変わる)期待: 42
空欄を埋めてコンパイル・実行を通す
free()は解放した領域の中身をその場で消しません。ただし多くの実装では、解放した領域の先頭に管理用のポインタ(次に再利用する空き領域への情報)を書き込みます。そのため、free()の直後に読むだけでも書き込んだ値(42)ではなく無関係な値が出ることがあり、しかも実行のたびに変わります。
次の問題