识别用malloc()分配的缓冲区

时间:2012-10-23 20:14:14

标签: c posix c99

有没有办法确定'malloc'是否分配了缓冲区?就像具有以下签名的函数一样:

bool is_malloced(void *buf);

posix中是否存在这样的机制?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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;
}
当然做这样的事情很疯狂,但你确实可以。

答案 2 :(得分:0)

模仿这种功能的一种简单方法是将malloc()包装在自定义函数中:

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

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

当然,这并不完美:

  • 神奇的数字可能是偶然的。在包装的free()调用中将其设置为null可能会有所帮助。用指针等对它进行异或也可以使它更可靠。不过,这是一种启发式方法。
  • 在具有内存保护的体系结构上,您可以在检查 not malloc'ed的指针时触发页面错误。

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

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