2012-01-05 2 views
2

Это может показаться глупым вопросом, но valgrind по умолчанию не дает вам достаточно информации. 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, чтобы сказать мне, какие значения являются неинициализированными?

+1

не Если ваш компилятор будет дать вам знать, что, прежде чем вы даже получите, чтобы запустить его в Valgrind? –

+0

компилятор молчал даже с -Wall. Возможно, это как-то связано с тем, что является переменной внутри структуры malloc'd. – Matt

ответ

4

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

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

+0

Спасибо, понял. У меня была структура, содержащая поле, которое ранее было инициализировано calloc. Однако я перешел на malloc и пропустил вручную, инициализируя это поле. – Matt

1

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) 
[[email protected] ~]$ cat uninit.c 
#include <stdio.h> 
int main(int argc, char *argv[]) 
{ 
    int i; 

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