valgrind读取大小无效

时间:2016-01-15 19:55:33

标签: c ubuntu

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

1 个答案:

答案 0 :(得分:1)

这是一个堆栈跟踪。它说:

  • strlen()尝试读取它不应该执行的1字节内存 (可能它已超过你动态分配的缓冲区1个字节)
  • strlen()调用是从server.c第1131行调用的,urldecode()函数。
  • urldecode()函数是从server.c第199行调用的。

这意味着您的代码中存在错误。 您会发现堆栈跟踪中最顶层的元素是您的代码,这可能是server.c中的第1131行。

从第1131行开始,你会发现为什么要将无效字符串传递给strlen()。也许这是一个未初始化或未正确终止的字符串。

最终您可能需要跟踪创建字符串的位置,您为urldecode()函数发布的新代码看起来很好,所以您可能需要返回到server.c第199行并查看如何您传递给urldecode()的字符串已经完成。