2016-01-15 3 views
0

В выводе valgrind ниже, может ли кто-нибудь объяснить значение верхней строки, которая refrences strlen в библиотеке valgrind. Означает ли это, что у valgrind itslef есть ошибка?valgrind недействительный размер чтения

==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

Лучше смотришь на 'server.c: 1131' –

+0

Будьте осторожны с обвинениями в ваших ошибках. Обычно (но не всегда) свой собственный код. –

+0

Почтовый код, который воспроизводит проблему. –

ответ

1

Это трассировка стека. Он говорит, что:

  • StrLen() пытался читать 1 байт памяти, что он не должен делать (вероятно, он ушел 1 байт после буфера вы динамически выделяемой)
  • что STRLEN() вызов был вызывается из server.c строки 1131, функции urldecode().
  • функции urldecode() была вызвана из server.c линий 199

Это означает, что есть ошибка в вашем коде. Вы находите самый верхний элемент в трассировке стека, который является вашим кодом, вероятно, это строка 1131 в server.c.

Из строки 1131 вы начинаете выяснять, почему вы передаете неверную строку в strlen(). Возможно, это строка, которая не инициализирована или не полностью завершена нулем.

В конце концов вам может потребоваться отследить место, где была создана ваша строка, новый код, который вы отправили для функции urldecode(), выглядит отлично, поэтому вам может потребоваться вернуться на страницу server.c 199 и посмотреть как строка, которую вы передали urldecode().

Смежные вопросы