【发布时间】:2020-04-07 20:43:21
【问题描述】:
我之前没有使用过 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 个释放,1024 个字节分配
==239==
==239== 所有堆块都被释放——不可能有泄漏
==239==
==239== 错误摘要:0 个上下文中的 0 个错误(已禁止:0 个来自 0)
valgrind 是不是应该发现这些错误,还是我用错了?
编辑: 似乎 valgrind memcheck 对全局变量没有做任何事情,并且正如答案/cmets 中所建议的那样,它应该使用远离指针的索引,因此: 我删除了全局声明并将其添加到 main 中,并访问了 a[-10] 而不是 a[1]。相同的行为。
int main()
{
unsigned int a[2];
a[-10] = 21;
printf("%d,", a[-10]);
return 1;
}
如果我使用 a[-100] 它实际上会引发错误。怎么了?
编辑 2
此外,为什么这没有错误
while (i <= 2)
{
j = a[i];
i++;
}
但这确实
while (i <= 2)
{
printf("%d,", a[i]);
i++;
}
【问题讨论】:
-
a[-1]可能不会导致内存错误。就 valgrind 而言,恰好您的程序正在将21写入有效的内存区域。 -
我早就猜到了,但为什么呢?
-
我似乎找不到任何关于 -s 标志的作用的文档。
-
why though- 为什么希望内核在程序中的任何位置插入内存保护区?它会让你的程序执行非常非常慢,内核将不得不使用大量内存来标记(并记住所有)受保护的小内存区域。 -
@pr0f3ss -s 相当于 --show-error-list=yes。