【发布时间】:2012-04-23 01:00:54
【问题描述】:
在 valgrind 下运行我的程序时收到警告:
==24214== 警告:愚蠢的 arg (-1) 到 malloc()如何确定对malloc() 的调用有问题?有没有办法不用重新编译就可以做到这一点?
程序编译时使用
-g(调试)和不使用-s(剥离)。
【问题讨论】:
在 valgrind 下运行我的程序时收到警告:
==24214== 警告:愚蠢的 arg (-1) 到 malloc()如何确定对malloc() 的调用有问题?有没有办法不用重新编译就可以做到这一点?
程序编译时使用
-g(调试)和不使用-s(剥离)。
【问题讨论】:
在使用 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。请写信到邮件列表;应该有一个选项,否则诊断没有那么有用。
注意malloc 的参数是一个无符号类型size_t,它的范围内没有-1。这种情况的意思实际上是将size_t的最大可能值传递给malloc。
严格来说,这不是一个错误的 API 调用,但它确实可能表明有问题。 (你的程序不需要千兆字节的数组,对吧?)
【讨论】:
你可以在 malloc 上做一个断点,让它有条件,例如 arg 是
【讨论】:
malloc这个词。
您可能会发现文本“silly arg”在 valgrind 中的调用位置。调出你的调试器并在那个地方中断。运行你的程序,当它把你带回调试器提示符时,直到你在调用 malloc 的那一行。
【讨论】:
我最终插入了printf's 并查找它是在 valgrind printf 之前还是之后。没有你们推荐的那么花哨,但它比尝试实施其他解决方案更快。
【讨论】: