Я только начал использовать 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?
В соответствии с руководящими принципами 'c' для SO, не следует ли компилировать с' -Wall' как минимум? Я бы не назвал 'valgrind' до тех пор, пока не смогу, по крайней мере, получить компилятор за минимальным флагом. Постскриптум это мой ответ на ваш вопрос. – KevinDTimm
Зачем вам Valgrind рассказать вам, что может сделать компилятор, прежде чем вы его запустите? –
Поскольку Valgrind - это (примерно) средство проверки утечки памяти во время выполнения, а не статический анализатор кода. – Olaf