为了确保实现的数据结构在功能上是合理的,我使用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
字符串吗?
答案 0 :(得分:5)
enum mcheck_status mprobe(void *ptr);
[...]
mprobe()
函数对ptr
指向的已分配内存块执行一致性检查。
字符串文字不是指向已分配内存的指针。 C标准非常严格地定义已分配存储空间为使用malloc
,calloc
,realloc
等分配的存储空间。 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;
| ~~~~~~^~~~~