C 当向mprobe传递指向已释放内存块的指针时,它应该返回什么?
mcheck的手册页面上说,mcheck_FREE状态表示“该块已被释放”。这对我来说意味着该块已被释放(至少)一次。在代码示例中似乎暗示了相同的情况。然而,这个例子非常明确地说,MCHECK_FREE意味着“一块内存被释放了两次”。我修改了上面答案中的代码示例,使其更具描述性:C 当向mprobe传递指向已释放内存块的指针时,它应该返回什么?,c,malloc,free,C,Malloc,Free,mcheck的手册页面上说,mcheck_FREE状态表示“该块已被释放”。这对我来说意味着该块已被释放(至少)一次。在代码示例中似乎暗示了相同的情况。然而,这个例子非常明确地说,MCHECK_FREE意味着“一块内存被释放了两次”。我修改了上面答案中的代码示例,使其更具描述性: #include <stdio.h> #include <stdlib.h> #include <mcheck.h> void print_status(enum mcheck_s
#include <stdio.h>
#include <stdlib.h>
#include <mcheck.h>
void print_status(enum mcheck_status status)
{
switch(status)
{
case MCHECK_DISABLED:
printf("MCHECK_DISABLED\n");
break;
case MCHECK_OK:
printf("MCHECK_OK\n");
break;
case MCHECK_HEAD:
printf("MCHECK_HEAD\n");
break;
case MCHECK_TAIL:
printf("MCHECK_TAIL\n");
break;
case MCHECK_FREE:
printf("MCHECK_FREE\n");
break;
}
}
void no_op(enum mcheck_status status) {}
int main()
{
mcheck(&no_op);
void* f = malloc(4);
print_status(mprobe(f));
free(f);
print_status(mprobe(f));
return 0;
}
这意味着在检查释放的块时,我显然得到了MCHECK_头作为响应。这种行为可靠吗?当一个块被释放时,它的头总是被重击,这是合理的吗?是否有不同的mcheck/mprobe实现可以让mcheck\u免费返回?我通过电子邮件发送了一份libc开发者邮件列表。我将问题分为两个问题,每个问题都得到了回答:
gcc--version->gcc(Ubuntu10.2.0-13ubuntu1)10.2.0,ldd--version->ldd(UbuntuGlibc2.32-0ubuntu3)2.32Hm,
gcc-fsanize=address
使其打印两次。我会考虑编写一些GLYBC邮件列表或开发人员。我相信onfree()
glibc会将一些东西写入内存,覆盖了freehook
所做的事情。看,谢谢,我试试看
MCHECK_OK
MCHECK_HEAD