Как определить, какие значения значений не инициализированы в valgrind? - PullRequest
2 голосов
/ 05 января 2012

Это может показаться глупым вопросом, но valgrind по умолчанию не дает вам достаточно информации. Valgrind сообщает следующее:

==2541== Conditional jump or move depends on uninitialised value(s)
==2541==    at 0x401777: process_read.clone.3 (in /home/matt/dev/ocs/client3/a.out)
==2541==    by 0x4026B8: obbs_main (in /home/matt/dev/ocs/client3/client)
==2541==    by 0x53D1D8B: start_thread (pthread_create.c:304)
==2541==    by 0x511D04C: clone (clone.S:112)

Я не вижу ничего очевидного. Valgrind -v также не помогает.

Есть ли способ заставить valgrind сказать мне, какие значения не инициализированы?

Ответы [ 2 ]

4 голосов
/ 05 января 2012

Если вы используете флаг --track-origins=yes с valgrind, он сообщит вам номер строки (при условии, что вы скомпилировали с -g), где впервые была выделена унитарная память. Обычно это происходит при выделении стека в начале функции где-то.

Попробуйте также скомпилировать с -Wall. -Wall должен перехватывать большинство «использованных неинициализированных» ошибок во время компиляции.

1 голос
/ 05 января 2012

Valgrind уведомляет вас об использовании неинициализированных значений, а не только неинициализированных значений, например:

==1029== Memcheck, a memory error detector
==1029== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==1029== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info
==1029== Command: a.out
==1029==
==1029== Conditional jump or move depends on uninitialised value(s)
==1029==    at 0x4004D7: main (uninit.c:6)
==1029==
==1029==
==1029== HEAP SUMMARY:
==1029==     in use at exit: 0 bytes in 0 blocks
==1029==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==1029==
==1029== All heap blocks were freed -- no leaks are possible
==1029==
==1029== For counts of detected and suppressed errors, rerun with: -v
==1029== Use --track-origins=yes to see where uninitialised values come from
==1029== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 6 from 6)
[adrian@iceweasel ~]$ cat uninit.c
#include <stdio.h>
int main(int argc, char *argv[])
{
   int i;

   if(i)
   {
      printf("Hello\n");
   }
   return 0;
}
...