4

有什么方法可以确定缓冲区是否由“malloc”分配?像具有以下签名的函数:

bool is_malloced(void *buf);

posix中是否存在这种机制?

4

3 回答 3

2

没有。C11 和 POSIX 都没有提供任何这样的机制。

于 2012-10-23T20:21:01.927 回答
1

嗯,如果你是一个认真的人,你实际上可以这样做:

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;
}

当然做这样的事情是疯狂的,但你确实可以。

于 2012-10-23T20:28:43.623 回答
0

模拟这种功能的一种简单方法是包装malloc()一个自定义函数,该函数:

  • 分配一个缓冲区,例如大 4 个字节
  • 在分配块的开头存储一些幻数(32位)
  • 在将指针返回给调用者之前将指针递增 4 个字节

给定一个指针,可以malloc通过查找幻数来检查它是否被 'ed。

当然,它并不完美:

  • 神奇的数字可能是偶然出现的。在包装的free()调用中将其设置为 null 会有所帮助。与指针等进行异或运算也可以使其更可靠。尽管如此,它仍然是一种启发式方法。
  • 在具有内存保护的体系结构上,您可以在检查分配的指针时触发页面错误。

尽管有所有缺点,但它仍然是一种有用的技术,我在调试嵌入式系统中的一些内存损坏时使用了几次。

如果我们打算malloc()用一些包装器替换,我们也可以构建一个已分配块的链表。更可靠,但也更复杂。

于 2012-10-23T22:11:23.413 回答