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

时间:2016-04-17 12:16:32

标签: linux exploit c glibc

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

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

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

free(a);

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

free(b);

free(a); //No crash

1 个答案:

答案 0 :(得分:5)

因为在C lingo中,未定义的行为就是:undefined。任何事都可能发生。

另见man 3 free

  

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