双重免费 - 崩溃或没有崩溃

use*_*312 -1 c linux exploit glibc

有人可以解释一下为什么连续两次释放导致崩溃,但释放第一个,然后是b,然后再次不会崩溃?

我知道free会将堆块插入双链接空闲列表中.释放两次会在空闲列表中两次插入相同的块.但为什么崩溃发生?

int *a = malloc(8);
int *b = malloc(8);

free(a);

// free(a); //Would crash!

free(b);

free(a); //No crash
Run Code Online (Sandbox Code Playgroud)

Jen*_*ens 6

因为在C lingo中,未定义的行为就是:undefined.什么都可能发生.

另见man 3 free:

[...]如果free(ptr)之前已经调用过,则会发生未定义的行为.