在下面的valgrind输出中,可以解释一下在valgrind库中引用strlen的顶行的含义。这是否意味着valgrind itslef有一个bug?
==26147== Invalid read of size 1
==26147== at 0x4C2E0E2: strlen (in/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==26147== by 0x40263A: urldecode (server.c:1131)
==26147== by 0x401853: main (server.c:199)
==26147== Address 0xffefffaa0 is on thread 1's stack
==26147== 136 bytes below stack pointer
char* urldecode(const char* s)
{
// check whether s is NULL
if (s == NULL)
{
return NULL;
}
// allocate enough (zeroed) memory for an undecoded copy of s
char* t = calloc(strlen(s) + 1, 1); <--- line 1131
答案 0 :(得分:1)
这是一个堆栈跟踪。它说:
这意味着您的代码中存在错误。 您会发现堆栈跟踪中最顶层的元素是您的代码,这可能是server.c中的第1131行。
从第1131行开始,你会发现为什么要将无效字符串传递给strlen()。也许这是一个未初始化或未正确终止的字符串。
最终您可能需要跟踪创建字符串的位置,您为urldecode()函数发布的新代码看起来很好,所以您可能需要返回到server.c第199行并查看如何您传递给urldecode()的字符串已经完成。