有什么方法可以确定缓冲区是否由“malloc”分配?像具有以下签名的函数:
bool is_malloced(void *buf);
posix中是否存在这种机制?
没有。C11 和 POSIX 都没有提供任何这样的机制。
嗯,如果你是一个认真的人,你实际上可以这样做:
Hash *hsh; /* global hash already initialized. */
void *custom_malloc(size_t size)
{
void *ptr;
ptr = malloc(size);
hash_add(hsh, ptr);
return ptr;
}
/* tester */
_Bool malloced(void *ptr)
{
if(hash_retrieve(hsh, ptr))
return TRUE;
return FALSE;
}
当然做这样的事情是疯狂的,但你确实可以。
模拟这种功能的一种简单方法是包装malloc()
一个自定义函数,该函数:
给定一个指针,可以malloc
通过查找幻数来检查它是否被 'ed。
当然,它并不完美:
free()
调用中将其设置为 null 会有所帮助。与指针等进行异或运算也可以使其更可靠。尽管如此,它仍然是一种启发式方法。尽管有所有缺点,但它仍然是一种有用的技术,我在调试嵌入式系统中的一些内存损坏时使用了几次。
如果我们打算malloc()
用一些包装器替换,我们也可以构建一个已分配块的链表。更可靠,但也更复杂。