我想尝试使用 valgrind 进行一些堆损坏检测。使用以下损坏“单元测试”:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
char * c = (char *) malloc(10) ;
memset( c, 0xAB, 20 ) ;
printf("not aborted\n") ;
return 0 ;
}
我惊讶地发现 valgrind 不会因错误而中止,而只会产生一条消息:
valgrind -q --leak-check=no a.out ==11097== 大小为 4 的无效写入 ==11097== 在 0x40061F:主要(在 /home/hotellnx94/peeterj/tmp/a.out) ==11097== 地址 0x51c6048 在大小为 10 的块中分配了 8 个字节 ==11097== 在 0x4A2058F: malloc (vg_replace_malloc.c:236) ==11097== 由 0x400609:主要(在 /home/hotellnx94/peeterj/tmp/a.out 中) ... 未中止
我没有看到 valgrind 选项在错误时中止(就像 gnu-libc 的 mcheck 一样,但我不能使用 mcheck,因为它不是线程安全的)。有谁知道这是否可能(我们的代码 dup2 的标准输出到 /dev/null,因为它作为守护进程运行,所以报告没有用,我宁愿抓住罪魁祸首或更接近它)。