我以前没有使用过valgrind,但我认为它应该检测到一些内存错误。
我的代码:
#include <stdio.h>
unsigned int a[2];
int main()
{
a[-1] = 21;
printf("%d,", a[-1]);
return 1;
}
如您所见,我正在访问a[-1]
,但我不应该访问。
我如何使用valgrind?
我正在使用gcc -g -O0 codeFile.c
进行编译
并且正在执行:valgrind -s ./a.out
结果是:
== 239 == Memcheck,内存错误检测器
== 239 ==版权所有(C)2002-2017和GNU GPL,由朱利安·塞沃德(Julian Seward)等人]
== 239 ==使用Valgrind-3.16.0.GIT和LibVEX;使用-h重新运行以获取版权信息
== 239 ==命令:./ a.out
== 239 == 21,== 239 ==
== 239 ==堆摘要:
== 239 ==在出口处使用:0字节,0块中]
== 239 ==总堆使用量:1个分配,1个空闲,分配的1,024个字节
== 239 ==
== 239 ==释放了所有堆块-不可能泄漏
== 239 ==
== 239 ==错误摘要:来自0个上下文的0个错误(被抑制:来自0的0个错误]
不应valgrind找到这些错误,或者我使用错了吗?
编辑:似乎valgrind memcheck不会对全局变量做任何事情,并且如答案/注释中所建议的那样,它应与指针更远的索引一起使用,因此:我删除了全局声明,并将其添加到insude main中,并访问a [-10]而不是a [1]。相同的行为。
int main()
{
unsigned int a[2];
a[-10] = 21;
printf("%d,", a[-10]);
return 1;
}
虽然我使用[-100]实际上会引发错误。怎么了?
编辑2
此外,为什么这没有错误
while (i <= 2)
{
j = a[i];
i++;
}
但是确实如此
while (i <= 2)
{
printf("%d,", a[i]);
i++;
}
Valgrind通常为can't find memory errors,其中要修改的内存与当前堆栈指针或内存的负偏移量与内存中的另一个变量重合。
您已将scan-build
声明为全局数组,因此请使用a
检查堆栈和全局数组溢出。请记住,--tool=exp-sgcheck
是实验性的实现,因此无论何时启用--tool=exp-sgcheck
或-s
都不会显示它,您可以阅读有关--show-error-list=yes
的更多信息。