为什么在检查字符串文字时mprobe失败?

时间:2019-09-30 04:37:41

标签: c gcc memory-management heap-memory

为了确保实现的数据结构在功能上是合理的,我使用mcheck编写了一个测试文件,以确保我在分配的内存范围内工作。但是,当尝试在字符串文字上使用mprobe()时(并在开始时调用mcheck(NULL)时,程序总是会以MCHECK_HEAD中止。

我用我能想到的最小的程序尝试了这个

#include <mcheck.h>
#include <stdio.h>

int main()
{

    mcheck(NULL);
    mprobe("test");

    exit(0);

}

结果如下:

$ gcc test.c -lmcheck
$ ./a.out
memory clobbered before allocated block
Aborted (core dumped)

因此,似乎mcheck每当遇到字符串文字时都会失败,以为先前的内存已被修改。为什么?是因为未明确malloc字符串吗?

1 个答案:

答案 0 :(得分:5)

enum mcheck_status mprobe(void *ptr);
     

[...]

     

mprobe()函数对ptr指向的已分配内存块执行一致性检查。

字符串文字不是指向已分配内存的指针。 C标准非常严格地定义已分配存储空间为使用malloccallocrealloc等分配的存储空间。 POSIX扩展了列表,例如与strdup。另一方面,字符串文字是具有静态存储持续时间的不可修改的数组字符,尽管它没有const元素类型,这就是为什么您没有得到一个警告。试试:

char *foo = "test";
const char *bar = "test";
mprobe(foo);
mprobe(bar);

和编译器reports a constraint violation编译后一个调用:

<source>: In function 'main':
<source>:12:12: warning: passing argument 1 of 'mprobe' discards 'const' qualifier
from pointer target type [-Wdiscarded-qualifiers]
   12 |     mprobe(bar);
      |            ^~~
In file included from <source>:1:
/usr/include/mcheck.h:53:41: note: expected 'void *' but argument is of
type 'const char *'
   53 | extern enum mcheck_status mprobe (void *__ptr) __THROW;
      |                                   ~~~~~~^~~~~