2017-01-16 4 views
0

Я получаю этот выход при использовании Valgrind:Invalid чтения размера 1 при использовании Valgrind

==19923== Invalid read of size 1 
==19923== at 0x52CCCC0: vfprintf (vfprintf.c:1632) 
==19923== by 0x52F4772: vasprintf (vasprintf.c:59) 
==19923== by 0x52D3A56: asprintf (asprintf.c:35) 
==19923== by 0x400D77: addToList (pa1.c:124) 
==19923== by 0x4010AF: md5Hash (pa1.c:220) 
==19923== by 0x401138: newFile (pa1.c:244) 
==19923== by 0x401260: searchDirects (pa1.c:280) 
==19923== by 0x401451: main (pa1.c:339) 
==19923== Address 0x585b720 is 0 bytes inside a block of size 27 free'd 
==19923== at 0x4C2EDEB: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==19923== by 0x401144: newFile (pa1.c:246) 
==19923== by 0x401260: searchDirects (pa1.c:280) 
==19923== by 0x401382: directoryCheck (pa1.c:312) 
==19923== by 0x4012CD: searchDirects (pa1.c:290) 
==19923== by 0x401451: main (pa1.c:339) 
==19923== Block was alloc'd at 
==19923== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==19923== by 0x52F47D7: vasprintf (vasprintf.c:73) 
==19923== by 0x52D3A56: asprintf (asprintf.c:35) 
==19923== by 0x40112C: newFile (pa1.c:239) 
==19923== by 0x401260: searchDirects (pa1.c:280) 
==19923== by 0x401382: directoryCheck (pa1.c:312) 
==19923== by 0x4012CD: searchDirects (pa1.c:290) 
==19923== by 0x401451: main (pa1.c:339) 

Вот где я свел к тому, что проблема в моем коде:

else 
{  
    currentList = headList; 
    printf("This is where I will put the code to create the Linked list!\n"); 
    if(currentList != 0) 
    { 
     while(currentList->nextList != 0) 
     { 
      if(currentList->key = key) 
      { 
       asprintf(&buff, "%s %s", currentList->value, dirValue); // PROBLEM IS HERE 
       printf("Here is the new string that holds the directory paths: %s\n", buff); 
       currentList->value = buff; 
       free(buff); 
       printf("Here is the new string that holds the directory paths: %s\n", currentList->value); 
       return; 
      } 
      currentList = currentList->nextList; 
     } 

     currentList->nextList = malloc(sizeof(struct List)); 
     printf("Adding a new node\n"); 
     //Reached the end of the Linked list and didn't find the 
     //same key so create a new node. 
     currentList = currentList->nextList; 
     currentList->key = key; 
     currentList->nextList = NULL; 
     currentList->value = dirValue; 
    } 
} 

У меня много ошибок, и предоставление всей продукции valgrind будет излишним, чем я чувствую. Все ошибки, которые я получаю, возвращаются туда, где я использую asprintf() ("addToList (pa1.c:124)" line in the report). Над кодом я инициализирую char *buff = NULL;, а currentList->value содержит строку, которую я хочу добавить, используя asprintf. Любые догадки о том, почему я получаю многочисленные ошибки Invalid read size 1, будут очень благодарны. Кроме того, строка добавляется, как и ожидалось, когда я распечатываю результат из asprintf() Спасибо.

+1

Не уверен, вызывает ли он точную ошибку, но 'if (currentList-> key = key)' должно быть 'if (currentList-> key == key)' – kaylum

+0

Ошибка valgrind говорит, что вы пытаетесь использовать освобожденные Память. – melpomene

+3

'currentList-> value = buff; free (buff); '? По крайней мере, отказ от того, с чем вы связаны, по крайней мере, является серьезной логической ошибкой. –

ответ

2

Неверное считывание находится в начале уже освобожденного блока памяти; вы пытаетесь использовать память после того, как вы ее освободили.

currentList->value = buff; 
free(buff); 
printf("Here is the new string that holds the directory paths: %s\n", currentList->value); 
return; 

Вы используете currentList->value = buff; в printf(), но вы только что освобожденный buff. Это говорит о надвигающейся катастрофе. Если currentList->value будет использоваться в вызывающих функциях после return, у вас возникнут серьезные проблемы.

Вы можете исправить одно предупреждение, переместив printf() до free(), но код выглядит так, как будто у вас будут серьезные проблемы. Может быть, лучше удалить free(buff); - хотя вам придется работать там, где данные фактически освобождаются.

+0

Хотя оба пользователя в приведенных выше комментариях указали мой недостаток, я правильно указываю ваш ответ на ясность. Я удалил бесплатный, потому что мне действительно нужна новая строка. Глупая ошибка, но еще одно объяснение того, что я делал, ясно дало понять, в чем моя проблема (вызов свободной памяти, как вы упомянули выше). Благодаря! – MuffinMan1042

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