Ошибка Valgrind отличается в операционных системах - PullRequest
0 голосов
/ 31 октября 2011

Я использую valgrind для отладки своего приложения.У меня есть две машины, на которых я хочу выполнить код без ошибок.Один из них - Ubuntu 11.10 с запущенным valgrind 3.7.0, а второй - Mac OS X 10.7.2 с valgrind 3.6.0 и valgrind 3.8.0.

Я запускаю следующую команду valgrind:

 valgrind --track-origins=yes ./my_program

На машине с Linux я не получал никаких сообщений об ошибках.На Mac valgrind жалуется на

==35723== Conditional jump or move depends on uninitialised value(s)
==35723==    at 0x10004DCAF: boost::spirit ...

Поскольку ошибка сообщается в Boost Lib, я не думаю, что может быть ошибка в библиотеках Boost (версия Boost одинакова на обеих машинах 1.46.1).

В чем причина различных сообщений об ошибках?

Ответы [ 3 ]

3 голосов
/ 31 октября 2011

Valgrind - это не инструмент статического анализа, а инструмент времени выполнения, т.е. valgrind запускает программу на виртуальной машине.Во многих приложениях имеется много кода, который не запускается и не компилируется для каждой машины, что объясняет различия.

1 голос
/ 01 ноября 2011

У меня были операторы вида

if (A && B) {
  do_stuff
}

, в которых B был только инициализирован, если A было истинно.Когда я не использовал оптимизации, программа (как и ожидалось) сначала проверила A, а затем, если это правда, проверила B.При оптимизации компилятор счел целесообразным сначала проверить B;, поскольку ни A, ни B не имели побочных эффектов или зависели от энергозависимой памяти , это было эквивалентно.Это последнее поведение заставило valgrind выдать мне предупреждение, которое вы видите, хотя в коде не было ничего плохого.Я предполагаю, что здесь происходит нечто подобное.

1 голос
/ 31 октября 2011

Вы используете разные компиляторы на двух компьютерах?Возможно, разные компиляторы или разные версии компилятора создают код с разным поведением при обращении к неинициализированной переменной.

...