Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.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
C 当向mprobe传递指向已释放内存块的指针时,它应该返回什么?_C_Malloc_Free - Fatal编程技术网

C 当向mprobe传递指向已释放内存块的指针时,它应该返回什么?

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

mcheck的手册页面上说,mcheck_FREE状态表示“该块已被释放”。这对我来说意味着该块已被释放(至少)一次。在代码示例中似乎暗示了相同的情况。然而,这个例子非常明确地说,MCHECK_FREE意味着“一块内存被释放了两次”。我修改了上面答案中的代码示例,使其更具描述性:

#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开发者邮件列表。我将问题分为两个问题,每个问题都得到了回答:

  • 关于MCHECK\u FREE,哪本手册(GNU或Linux)是正确的
  • 它们都是正确的,但是从稍微不同的角度写的

    如果该块以前是空闲的,则应返回MCHECK_free

    然而,如果你不能检测到它以前是免费的,因为 那么你可能只能返回MCHECK_头作为 如果损坏已更改所有共址元数据,则会出现默认结果 关于州信息

  • 通常认为(在对释放的指针调用mprobe时)会返回MCHECK_头是否合理

  • gcc--version->gcc(Ubuntu10.2.0-13ubuntu1)10.2.0,ldd--version->ldd(UbuntuGlibc2.32-0ubuntu3)2.32Hm,
    gcc-fsanize=address
    使其打印两次。我会考虑编写一些GLYBC邮件列表或开发人员。我相信on
    free()
    glibc会将一些东西写入内存,覆盖了
    freehook
    所做的事情。看,谢谢,我试试看
    MCHECK_OK
    MCHECK_HEAD