программа хорошо работает в bash, но не запускается с valgrind

#valgrind

#valgrind

Вопрос:

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

Запуск в bash:

:~/ sandbox/binofino $ ./a.out

 24 = 3   21   
24 = 3   21   
24 = 3   8   13   
24 = 1   2   8   13   
24 = 1   2   3   5   13   
24 = 1   2   21   
  

Под valgrind:

 >:~/sandbox/binofino$ valgrind ./a.out
==20116== Memcheck, a memory error detector
==20116== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==20116== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==20116== Command: ./a.out
==20116== 
==20116== Invalid read of size 4
==20116==    at 0x804857A: main (in /home/..../sandbox/binofino/a.out)
==20116==  Address 0x41a402c is 0 bytes after a block of size 4 free'd
==20116==    at 0x4025016: realloc (vg_replace_malloc.c:525)
==20116==    by 0x804879F: get_fibo_index (in /home/..../sandbox/binofino/a.out)
==20116==    by 0x804854F: main (in /home/..../sandbox/binofino/a.out)
==20116== 
24 = 1   1   
==20116== Invalid read of size 4
==20116==    at 0x80485CE: main (in /home/..../sandbox/binofino/a.out)
==20116==  Address 0x41a402c is 0 bytes after a block of size 4 free'd
==20116==    at 0x4025016: realloc (vg_replace_malloc.c:525)
==20116==    by 0x804879F: get_fibo_index (in /home/..../sandbox/binofino/a.out)
==20116==    by 0x804854F: main (in /home/..../sandbox/binofino/a.out)
==20116== 
24 = 1   
==20116== Invalid free() / delete / delete[]
==20116==    at 0x4024B3A: free (vg_replace_malloc.c:366)
==20116==    by 0x804867E: main (in /home/..../sandbox/binofino/a.out)
==20116==  Address 0x41a4028 is 0 bytes inside a block of size 4 free'd
==20116==    at 0x4025016: realloc (vg_replace_malloc.c:525)
==20116==    by 0x804879F: get_fibo_index (in /home/..../sandbox/binofino/a.out)
==20116==    by 0x804854F: main (in /home/..../sandbox/binofino/a.out)
==20116== 
==20116== 
==20116== HEAP SUMMARY:
==20116==     in use at exit: 8 bytes in 1 blocks
==20116==   total heap usage: 4 allocs, 4 frees, 20 bytes allocated
==20116== 
==20116== LEAK SUMMARY:
==20116==    definitely lost: 8 bytes in 1 blocks
==20116==    indirectly lost: 0 bytes in 0 blocks
==20116==      possibly lost: 0 bytes in 0 blocks
==20116==    still reachable: 0 bytes in 0 blocks
==20116==         suppressed: 0 bytes in 0 blocks
==20116== Rerun with --leak-check=full to see details of leaked memory
==20116== 
==20116== For counts of detected and suppressed errors, rerun with: -v
==20116== ERROR SUMMARY: 5 errors from 3 contexts (suppressed: 11 from 6)
  

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

Почему?

Комментарии:

1. Похоже, у вас есть какие-то скрытые ошибки в вашей программе.

Ответ №1:

Потому что у вас ошибка (на самом деле несколько ошибок).

В частности, в get_fibo_index вас realloc некотором объеме памяти, затем в main считывается сразу после конца выделенного буфера (что приводит к совершенно неопределенному результату).

Перестройте свою программу с помощью -g , повторно запустите ее в Valgrind и исправьте все обнаруженные «Недопустимые» ошибки.

(Перестройка с помощью -g предоставит вам информацию о файлах и строках, которая упростит исправление ошибок.)

Комментарии:

1. большое спасибо, я наконец понял, в чем проблема. Просто непонятно, почему она работает без каких-либо проблем в bash. Я думаю, это потому, что запрос блока памяти мал, и его просто нужно расширить, не перемещая в новое местоположение, тогда проблема хорошо скрыта, когда я запускаю ее в bash.