gpt4 book ai didi

c++ - 如何检查 free() 中的 diabolical wild free ?

转载 作者:行者123 更新时间:2023-11-30 20:47:11 27 4
gpt4 key购买 nike

我对这种情况进行了测试:

 // Diabolical wild free #2.

int main() {
char* a = (char*) my_malloc(200);
char* b = (char*) my_malloc(50);
char* c = (char*) my_malloc(200);
char* p = (char*) my_malloc(3000);
(void) a, (void) c;
memcpy(p, b - 200, 450);
my_free(b);
memcpy(b - 200, p, 450);
my_free(b);
m61_printstatistics();
}

预期结果:

//! MEMORY BUG: invalid free of pointer

现在我们可以使用空闲列表来检查第二个 free()打电话,但是

1) 第二个 free()调用,释放另一个对象,因为 memcpy(b - 200, p, 450)

2)在这种情况下我们也多次调用free()在同一个对象上,但这是正确的执行

//正确执行不应该报错。

int main() {
for (int i = 0; i < 10; ++i)
{
int* ptr = (int*) my_malloc(sizeof(int) * 10);
for (int j = 0; j < 10; ++j)
{
ptr[i] = i;
}
my_free(ptr);
}
m61_printstatistics();
}

那么如何检查 free() 中无效的空闲指针实现?

最佳答案

假设我们忽略了由于读写超出 b 指向的对象边界而导致的明显未定义行为,并且您的预期目的是编写或测试一个 C 库,该库应该能够诊断 b 上两次调用 free() 的错误。

这是一个错误的原因是 mallocfree 的典型实现会将 free() 的内存放入空闲内存中列表作为链接列表。作为节省内存的一种方式,刚刚释放的内存本身被重新用作空闲列表数据结构的节点对象。因此,在第一次 free() 调用之后,空闲列表中的某些其他节点可能会指向由 b 表示的内存。在第二次调用 free() 时,b 的节点将再次插入到列表中,可能会导致另一个节点指向它。空闲列表将被视为已损坏。由于 malloc() 会从空闲列表中删除数据,因此同一节点在空闲列表中出现两次将是一个严重的问题。

有几种方法可以“捕获”该问题。一种可能性是将空闲列表实现为查找树,该查找树使用自己的内存作为指向返回到 free() 的内存的节点。这允许第二次调用 free() 来注意到 b 已经在树中。因此,可以检测到对 free() 的双重调用,并可以相应地进行标记。

关于c++ - 如何检查 free() 中的 diabolical wild free ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29974025/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com