在下面的valgrind输出中,可以解释valgrind库中出现的最上一行的含义。这是否意味着valgrind itslef有错误?
==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
最佳答案
这是一个堆栈跟踪。它说:
strlen()尝试读取不应做的1个字节的内存
(可能它已经超出了您动态分配的缓冲区的1个字节)
从server.c第1131行urldecode()函数调用了strlen()调用。
从server.c第199行调用了urldecode()函数
这意味着您的代码中存在错误。
您会在堆栈跟踪中找到最上面的元素作为您的代码,可能是server.c中的第1131行。
从第1131行开始,弄清楚为什么要将无效的字符串传递给strlen()。可能是未初始化或未正确终止的字符串。
最终,您可能需要跟踪创建字符串的位置,为urldecode()函数发布的新代码看起来不错,因此您可能需要回到server.c第199行,看看字符串如何已经传递给urldecode()了。
关于c - valgrind无效的读取大小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34818846/