linux - 双重免费 - 崩溃或不崩溃

标签 linux exploit c glibc

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

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

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

free(a);

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

free(b);

free(a); // No crash.

最佳答案

因为在 C 语言中,未定义行为就是:未定义。任何事情都可能发生。

另请参阅man 3 free:

[…] if free(ptr) has already been called before, undefined behavior occurs.

关于linux - 双重免费 - 崩溃或不崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36682186/

相关文章:

linux - 了解 sed 表达式 's/^\.\///g'

linux - 这个 bash 脚本如何启动程序?

c - 为什么 printf() 即使没有被整数变量捕获也能工作?

c - 多线程 - 使用线程执行将文件内容存储在 char **array 中的函数?

c - 如何使用 n - 1 个线程对 n 个元素的数组进行排序

linux - 如何解决 Windows Subsystem for Linux 中 laradock 中的 "Operation not permitted: '/var/lib/pgadmin'"错误?

regex - 将不同文件中的值合并到一个 CSV 文件中

php - Ubuntu Server 无法在 PHP 中创建目录

c - 如何禁用有关在 GCC 中使用弃用获取的警告?