在 valgrind 下运行我的程序时收到警告:
==24214== 警告:愚蠢的 arg (-1) 到 malloc()
我如何确定哪个呼叫malloc()
有问题?有没有办法可以在不重新编译的情况下做到这一点?
该程序是用
-g
(debug)和不-s
(strip)编译的。
在使用 Valgrind 版本 3.2.1 对相对古老的 RedHat Linux 进行少量实验后,它似乎没有产生更精确的警告。此外,即使是 Mac OS X 10.7.3 上的 Valgrind 3.7.0 也不能更好地识别错误调用。
测试代码:
#include <stdlib.h>
#include <stdint.h>
int main(void)
{
int l = -1;
char *x = malloc(l);
return (uintptr_t)x & 1;
}
所以,既然valgrind
没有帮助,你可能会减少在程序上使用调试器,中断对的调用malloc()
——也许当参数等于(size_t)-1
.
事实上,valgrind 似乎拒绝为这种情况打印堆栈跟踪,即使使用--verbose
. 请写信到邮件列表;应该有一个选项,否则诊断没有那么有用。
请注意,参数 ofmalloc
是无符号类型 ,size_t
其范围内没有 -1。这种情况的意思实际上是将最大可能的值size_t
传递给malloc
.
严格来说,这不是一个错误的 API 调用,但它可能确实表明有问题。(您的程序不需要数 GB 的数组,对吗?)
您可能会发现文本“silly arg”在 valgrind 中被调用的位置。调出你的调试器并在那个地方中断。运行你的程序,当它把你带回调试器提示符时,直到你在调用 malloc 的那一行。
您可以在 malloc 上做一个断点并使其有条件,例如 arg 为 <0
我最终插入printf
's 并查找它是在 valgrind 之前还是之后printf
。没有你们推荐的那么花哨,但它比尝试实施其他解决方案更快。