2013-06-14 2 views
1

Я изучаю C от отличного Zed Shaw Learn C Hard Way.Valgrind не обнаружит очевидных ошибок

Я запускаю Debian Sid с версией ядра 3.9.0-vanillaice amd64 (я скомпилировал его) с помощью glibc 2.17 (установлен из репо Debian).

Я нахожусь на Exercise 4 in the book.

Вот мой код:

#include <stdio.h> 

//This program is purposefully messed up. 

int main() 
{ 
     int age = 10; 
     int height; 

     printf("I am %d years old.\n"); 
     printf("I am %d inches tall.\n", height); 

     return 0; 
} 

Valgrind должны производить что-то вроде этого:

$ valgrind ./ex4 
==3082== Memcheck, a memory error detector 
==3082== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al. 
==3082== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info 
==3082== Command: ./ex4 
==3082== 
I am -16775432 years old. 
==3082== Use of uninitialised value of size 8 
==3082== at 0x4E730EB: _itoa_word (_itoa.c:195) 
==3082== by 0x4E743D8: vfprintf (vfprintf.c:1613) 
==3082== by 0x4E7E6F9: printf (printf.c:35) 
==3082== by 0x40052B: main (ex4.c:11) 
==3082== 
==3082== Conditional jump or move depends on uninitialised value(s) 
==3082== at 0x4E730F5: _itoa_word (_itoa.c:195) 
==3082== by 0x4E743D8: vfprintf (vfprintf.c:1613) 
==3082== by 0x4E7E6F9: printf (printf.c:35) 
==3082== by 0x40052B: main (ex4.c:11) 
==3082== 
==3082== Conditional jump or move depends on uninitialised value(s) 
==3082== at 0x4E7633B: vfprintf (vfprintf.c:1613) 
==3082== by 0x4E7E6F9: printf (printf.c:35) 
==3082== by 0x40052B: main (ex4.c:11) 
==3082== 
==3082== Conditional jump or move depends on uninitialised value(s) 
==3082== at 0x4E744C6: vfprintf (vfprintf.c:1613) 
==3082== by 0x4E7E6F9: printf (printf.c:35) 
==3082== by 0x40052B: main (ex4.c:11) 
==3082== 
I am 0 inches tall. 
==3082== 
==3082== HEAP SUMMARY: 
==3082==  in use at exit: 0 bytes in 0 blocks 
==3082== total heap usage: 0 allocs, 0 frees, 0 bytes allocated 
==3082== 
==3082== All heap blocks were freed -- no leaks are possible 
==3082== 
==3082== For counts of detected and suppressed errors, rerun with: -v 
==3082== Use --track-origins=yes to see where uninitialised values come from 
==3082== ERROR SUMMARY: 4 errors from 4 contexts (suppressed: 4 from 4) 
$ 

Mine ничего не упоминает об ошибках:

$ valgrind ./ex4 
==4098== Memcheck, a memory error detector 
==4098== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al. 
==4098== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info 
==4098== Command: ./ex4 
==4098== 
I am -16776056 years old. 
I am 0 inches tall. 
==4098== 
==4098== HEAP SUMMARY: 
==4098==  in use at exit: 0 bytes in 0 blocks 
==4098== total heap usage: 0 allocs, 0 frees, 0 bytes allocated 
==4098== 
==4098== All heap blocks were freed -- no leaks are possible 
==4098== 
==4098== For counts of detected and suppressed errors, rerun with: -v 
==4098== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2) 

ответ

1

Я предполагаю, что вы используете gcc-компилятор.

Я просто дал это небольшое тестирование, и мой valgrind сообщил об ошибках только тогда, когда у меня была программа, построенная с -O0. При оптимизации на (-O3) valgrind не сообщал об ошибках. Я полагаю, это было бы потому, что компилятор может удалить неинициализированный прыжок, потому что значение никогда не изменяется и полностью удаляется. Поскольку вы делаете это для упражнений, вы можете попытаться выяснить, какие параметры компилятора работают для вас. Если вы еще не знаете, что это такое, найдите «Debug» или «Release» build и переключитесь на «Debug».

НТН, Moose

+0

Trying сейчас ... EDIT: работает! Я делал это с уровнем оптимизации до двух. – axuak

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