Подтвердить что ты не робот

Ошибки Valgrind, хотя все блоки кучи были освобождены

Недавно я разработал привычку запускать все мои программы с помощью valgrind, чтобы проверить утечку памяти, но большинство ее результатов были для меня немного загадочными.

Для моего последнего запуска valgrind -v дал мне:

All heap blocks were freed -- no leaks are possible

Это означает, что моя программа покрыта для утечек памяти, правильно?

Итак, что означает эта ошибка? Моя программа не правильно считывает определенные блоки памяти?

ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 14 from 9)

1 errors in context 1 of 1:
Invalid read of size 4
   at 0x804885B: findPos (in /home/a.out)
   by 0xADD918: start_thread (pthread_create.c:301)
   by 0xA26CCD: clone (clone.S:133)
 Address 0x4a27108 is 0 bytes after a block of size 40 alloc'd
   at 0x4005BDC: malloc (vg_replace_malloc.c:195)
   by 0x804892F: readInput (in /home/a.out)
   by 0xADD918: start_thread (pthread_create.c:301)
   by 0xA26CCD: clone (clone.S:133)

used_suppression:     14 dl-hack3-cond-1

Кроме того, какие здесь так называемые "подавленные" ошибки?

4b9b3361

Ответ 1

  • Да, вы очень охвачены, не думайте, что valgrind легко может пропустить утечка в коде пользователя
  • ваша ошибка означает, что вы, вероятно, имеют +1 ошибку в индексировании массива переменная. линии, которые скажите, что вы должны быть точными, так что вы должен легко найти, что, если вы скомпилируете весь свой код с помощью -g
  • подавленные ошибки обычно системные библиотеки, которые иногда имеют небольшие утечки или неразрешимые вещи, такие как переменные состояния потоков. ваша страница руководства должна отображать файл подавления, который используется по умолчанию.

Ответ 2

Это кажется очевидным... но, возможно, стоит отметить, что сообщение "no leaks are possible" не означает, что ваша программа не может протекать; это просто означает, что он не протекал в конфигурации, в которой он был протестирован.

Если я запустил следующее с valgrind без параметров командной строки, он сообщает мне, что утечки невозможны. Но это утечка, если я предоставляю параметр командной строки.

int main( int argc, char* argv[] )
{
   if ( argc > 1 )
      malloc( 5 );
   printf( "Enter any command line arg to cause a leak\n" );
}

Ответ 3

Проверка утечки памяти - одна из причин использования valgrind, но я бы сказал, что лучшей причиной является поиск более серьезных ошибок в вашем коде, таких как использование недопустимого индекса массива или разыменование неинициализированного указателя или указатель на свободную память.

Хорошо, если valgrind сообщает вам, что пути кода, которые вы выполняли при запуске valgrind, не приводили к утечкам памяти, но не позволяйте им игнорировать отчеты о более серьезных ошибках, например, о том, что вы видите здесь.

Как предположили другие, повторная попытка valgrind после компиляции с отладочной информацией (-g) будет хорошим следующим шагом.

Ответ 4

Если вы получаете ошибку ниже: - "Недопустимое чтение размера 4"

Вы освобождаете память раньше и затем переходите к следующему аргументу? Я также получаю сообщение об ошибке, потому что в связанном списке я сначала освобождаю память, а затем перехожу к следующему элементу. Ниже мой фрагмент кода, где я получаю ошибку -

void free_memory(Llist **head_ref)
{
    Llist *current=NULL;

    current=*head_ref;
    while(*head_ref != NULL)
    {
        current=*head_ref;
        free(current);
        current=NULL;
        (*head_ref)=(*head_ref)->next;
    }
}

После изменений ниже приведен мой фрагмент кода -

void free_memory(Llist **head_ref)
{
    Llist *current=NULL;
    current=*head_ref;
    while(*head_ref != NULL)
    {
        current=*head_ref;
        (*head_ref)=(*head_ref)->next;
        free(current);
        current=NULL;
     }
 }