2017-02-14 3 views
1

Я только начал использовать Valgrind, и я не уверен, что сообщения об ошибках, которые я получаю, это то, что они должны быть. Например, Valgrind просто дал мне очень длинную цепочку предупреждений о printf(), делающих прыжки на основе неинициализированной памяти. Очевидно, что вопрос был не с printf(). Скорее, моя программа давала испорченная память.Почему Valgrind жалуется на printf вместо моего неинициализированного счетчика?

мне удалось произвести следующие MCVE:

#include <stdio.h> 

int main(void) 
{ 
    int d; 
    d++; 
    printf("%d\n", d); 
    return 0; 
} 

Это действительно очевидно, что проблема здесь заключается в d++. Тем не менее, Valgrind только обнаруживает и предупреждает меня о неинициализированном использовании памяти в следующей строке, с 6 сообщений в виде

== 12178 == Условного переход или шаг зависит от неинициализированного значения (ов)
== 12178 == в 0x4E7F79D: vfprintf (vfprintf.c: 1636)
== 12178 == по 0x4E871F8: Е (printf.c: 33)
== 12178 == по 0x1086D1: основная (mcve.c: 7)

Я составил это с

НКУ mcve.c -g -O0

И я побежал Valgrind с

Valgrind --leak проверка = да ./a.out

Тогда я обнаружил есть --track-origins=yes. Он пытается помочь, но он легко теряется с указателями. Так, например, он не работает в течение следующего MCVE:

#include <stdio.h> 

int f2(int *p) 
{ 
    (*p)++; 
    return *p; 
} 

int f1(void) 
{ 
    int d; 
    return f2(&d); 
} 

int main(void) 
{ 
    printf("%d\n", f1()); 
    return 0; 
} 

Здесь он говорит, что ошибка в кадре стека из f1(). Это полезно, но, учитывая, что это связано с производительностью, возможно, этого не стоит.

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

+1

В соответствии с руководящими принципами 'c' для SO, не следует ли компилировать с' -Wall' как минимум? Я бы не назвал 'valgrind' до тех пор, пока не смогу, по крайней мере, получить компилятор за минимальным флагом. Постскриптум это мой ответ на ваш вопрос. – KevinDTimm

+0

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

+0

Поскольку Valgrind - это (примерно) средство проверки утечки памяти во время выполнения, а не статический анализатор кода. – Olaf

ответ

3

Умышленное решение в Valgrind заключается в том, что он не жалуется только потому, что некоторая неинициализированная память скопирована или аналогична. Жалобы только в том случае, если использование неинициализированной памяти изменяет поведение вашей программы. Этот преднамеренный выбор позволяет избежать множества ложноположительных ошибок.

См. http://www.valgrind.org/docs/manual/mc-manual.html#mc-manual.uninitvals для получения дополнительной информации.