1

在 valgrind 下运行我的程序时收到警告:

==24214== 警告:愚蠢的 arg (-1) 到 malloc()

我如何确定哪个呼叫malloc()有问题?有没有办法可以在不重新编译的情况下做到这一点?

该程序是用-g(debug)和不-s(strip)编译的。

4

5 回答 5

1

在使用 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.

于 2012-04-23T01:20:19.597 回答
1

事实上,valgrind 似乎拒绝为这种情况打印堆栈跟踪,即使使用--verbose. 请写信到邮件列表;应该有一个选项,否则诊断没有那么有用。

请注意,参数 ofmalloc是无符号类型 ,size_t其范围内没有 -1。这种情况的意思实际上是将最大可能的值size_t传递给malloc.

严格来说,这不是一个错误的 API 调用,但它可能确实表明有问题。(您的程序不需要数 GB 的数组,对吗?)

于 2012-04-23T01:25:37.923 回答
0

您可能会发现文本“silly arg”在 valgrind 中被调用的位置。调出你的调试器并在那个地方中断。运行你的程序,当它把你带回调试器提示符时,直到你在调用 malloc 的那一行。

于 2012-04-23T01:17:34.733 回答
0

您可以在 malloc 上做一个断点并使其有条件,例如 arg 为 <0

于 2012-04-23T01:13:40.090 回答
0

我最终插入printf's 并查找它是在 valgrind 之前还是之后printf。没有你们推荐的那么花哨,但它比尝试实施其他解决方案更快。

于 2012-04-23T03:24:30.477 回答