Valgrind向malloc报告了愚蠢的arg,我怎么知道在哪里?

Valgrind向malloc报告了愚蠢的arg,我怎么知道在哪里?,c,memory,valgrind,C,Memory,Valgrind,在valgrind下运行程序时,我收到警告: ==24214== Warning: silly arg (-1) to malloc() ==24214==警告:愚蠢的arg(-1)到malloc() 如何确定对malloc()的调用有故障?有没有一种不用重新编译就可以完成的方法 该程序使用-g(调试)编译,而不使用-s(带) 您可以在malloc上做一个断点并使其有条件,例如,arg是,您可能会找到在valgrind中调用文本“傻arg”的地方。拿出你的调试器,在那个地方休息一下。运行你的程序

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

==24214== Warning: silly arg (-1) to malloc() ==24214==警告:愚蠢的arg(-1)到malloc() 如何确定对
malloc()
的调用有故障?有没有一种不用重新编译就可以完成的方法

该程序使用
-g
(调试)编译,而不使用
-s
(带)


您可以在malloc上做一个断点并使其有条件,例如,arg是,您可能会找到在valgrind中调用文本“傻arg”的地方。拿出你的调试器,在那个地方休息一下。运行你的程序,当它把你带回到调试器提示符,直到你在一个叫做malloc的行上。

在一个相对古老的RedHat Linux和Valgrind版本3.2.1上进行了一些实验后,它似乎没有产生更精确的警告。此外,即使是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;
}
#包括
#包括
内部主(空)
{
int l=-1;
char*x=malloc(l);
返回(uintptr_t)x&1;
}

因此,由于
valgrind
没有帮助,您可能会在程序上使用调试器,在调用
malloc()
时中断-当参数等于
(size\u t)-1

时,可能会有条件地中断。实际上,valgrind似乎拒绝打印这种情况下的堆栈跟踪,即使使用
——详细的
。请写信给邮件列表;应该有一个选项,否则诊断就没有那么大帮助

请注意,
malloc
的参数是一个无符号类型,
size\u t
,其范围内没有-1。这种情况实际上意味着,
size\u t
的最大可能值被传递给了
malloc


严格地说,这不是一个错误的API调用,但它确实可能表明出了问题。(您的程序不需要数千字节的数组,对吧?

我最后插入了
printf
,并找到它是在valgrind
printf
之前还是之后出现的。没有你们推荐的那么花哨,但它比尝试实现其他解决方案的速度更快。

+1,但如果您还可以为条件中断提供一个简单的gdb命令作为示例,则不会有任何影响。您不能在malloc上中断,因为它没有调试符号。但是,您可以使用find和replace替换malloc()使用两个语句行,即#define wrapped_malloc(x)malloc(x);(无效)0;并在那里设置一个断点:它可以在(void)0上中断。只需对代码库进行分支并查找错误,更改不必是永久性的查找和替换的问题是,我在许多函数名称的末尾有一个单词
malloc
。哦,伙计,这太苛刻了。好的,使用一个查找“=malloc()”或“=()malloc(*)”的正则表达式。我不是一个喜欢正则表达式的人,所以我不能确切地建议使用哪一个。好吧,对于一个小程序来说,最简单的解决方案可能是最好的。