在下面的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/

10-09 05:46
查看更多