gpt4 book ai didi

c - 在 C 中,如何检测 free() 函数实现中的边界写入错误?

转载 作者:太空狗 更新时间:2023-10-29 15:02:11 25 4
gpt4 key购买 nike

边界错误是指程序读取或写入的内存超出已分配内存块的实际尺寸。一个示例边界写入错误是将第 11 个条目写入大小为 10 的数组

我有一个测试必须检测 my_free() 函数实现中的边界写入错误

 int main()
{
const char* string1 = "Hello, this is a string! I exist to demonstrate a common error.";
char* copy_of_string1 = (char*) my_malloc(strlen(string1));

// Whoops! Forgot to allocate space for the '\0' that ends the string.
strcpy(copy_of_string1, string1); // == boundary write error
my_free(copy_of_string1);

return 0;
}

如何捕捉用户在分配 block 后直接写入一个或多个零字节的情况?

最佳答案

通常的做法是分配比所需更多的内存,并在末尾放置一个标记(在过度分配的内存中)。释放时,您将检查标记是否未被覆盖。

我自己创建了 malloc() 的自定义版本,它在 block 的开头和结尾都放置了一个标记:

      +--------+
| size |
|BEEFF00D|
p-> | ... |
|DEADC0DA|
+--------+

并将返回 p 而不是真正分配的 block 。

当我free() block 时,我检查指针之前是否有值0xBEEFF00D,如果不是,则要释放的指针无效。然后,如果它有效,我检查 block 的末尾(我已经存储了 block 的大小)并查看标记 0xDEADC0DA 是否存在,如果不存在,则存在越界错误。

如果一切正常,在释放(实际) block 之前,我将初始标记 0xBEEFF00D 替换为标记 0xDEFACED 以便捕获双 free() 错误。

我已经设置好所有内容,以便我可以包含一个 header 并使用符号 MEMCHECK 进行编译,以便每个 free()malloc( )calloc()realloc()strdup() 将替换为我的检查版本。当我确定一切正常时,我将在不定义 MEMCHECK 的情况下重新编译。这对你来说可能太过分了,但如果你感兴趣,你可以在这里找到我的代码:https://github.com/rdentato/memchk这里有一些解释:https://dev.to/rdentato/c-memories-33kc (看文末)

关于c - 在 C 中,如何检测 free() 函数实现中的边界写入错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29544925/

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