Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
标识分配给malloc()的缓冲区_C_Posix_C99 - Fatal编程技术网

标识分配给malloc()的缓冲区

标识分配给malloc()的缓冲区,c,posix,c99,C,Posix,C99,有没有办法确定缓冲区是否由“malloc”分配?类似于具有以下签名的函数: bool is_malloced(void *buf); posix中是否存在这种机制?否。C11和POSIX都没有提供任何这样的机制。嗯,如果你是一个严肃的人,你实际上可以: Hash *hsh; /* global hash already initialized. */ void *custom_malloc(size_t size) { void *ptr; ptr = mall

有没有办法确定缓冲区是否由“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()
包装在一个自定义函数中,该函数:

  • 分配一个大4字节的缓冲区
  • 在分配的块的开头存储一些幻数(32位)
  • 指针在返回给调用方之前递增4字节
给定一个指针,你可以通过寻找神奇的数字来检查它是否是
malloc

当然,这并不完美:

  • 这个神奇的数字可能是偶然出现的。在包装的
    free()
    调用中将其设置为null会有所帮助。用指针等对其进行异或运算也可以使其更加可靠。不过,这是一种启发
  • 在具有内存保护的体系结构上,当检查未malloc'ed的指针时,可以触发页面错误
尽管有这些缺点,但它仍然是一种有用的技术,我在调试嵌入式系统中的一些内存损坏时使用过几次


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

bool是_malloced(void*buf){free(buf);return true;}
;)说真的,我不知道这样的事情。不,但是你可以编写自己的分配器来支持它。但是为什么你认为你需要这样一个函数呢?实际上我并不需要这样一个函数,我只是好奇……你最好的办法是用你自己的函数替换
malloc
,使用库预加载机制或其他一些机制,并在你自己的实现中封装POSIX malloc调用,在某种映射中添加标记为“malloced”的指针。问题是没有可移植的方法覆盖malloc(GNUC中有
malloc\u hook
),或者链接到另一个
malloc
。这是疯狂的。这是一个思想实验。这不是真正的代码。