Valgrind на OS X Yosemite, давая фиктивные ошибки?

Я следую в « Learn C The Hard Way», и я нахожусь в Упражнении 4: Представляем Valgrind . Я нахожусь в Mac OS X Yosemite, и на момент написания этой статьи не существует стабильной сборки Valgrind для Yosemite. Я нашел Йосемити и Вальгринда и использовал указания от ответа сверху на brew install --HEAD valgrind . Этот установленный Valgrind и я смогли следовать вместе с упражнениями Зеда. Однако, когда я «исправил» приложение, я все еще получал ошибки.

Чтобы дважды проверить, я вернулся к Упражнению 3 , в котором не должно быть ошибок, но у меня все еще есть ошибки в Valgrind. Вот код, а затем вывод:

ex3.c

 #include  int main() { int age = 10; int height = 72; printf("I am %d years old.\n", age); printf("I am %d inches tall.\n", height); return 0; } 

В iTerm:

 ransom:learn-c-the-hard-way ben$ rm -f ex3 ransom:learn-c-the-hard-way ben$ make ex3 cc -Wall -g ex3.c -o ex3 ransom:learn-c-the-hard-way ben$ valgrind ./ex3 ==8795== Memcheck, a memory error detector ==8795== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. ==8795== Using Valgrind-3.11.0.SVN and LibVEX; rerun with -h for copyright info ==8795== Command: ./ex3 ==8795== ==8795== Conditional jump or move depends on uninitialised value(s) ==8795== at 0x1003FBC3F: _platform_memchr$VARIANT$Haswell (in /usr/lib/system/libsystem_platform.dylib) ==8795== by 0x1001EFB96: __sfvwrite (in /usr/lib/system/libsystem_c.dylib) ==8795== by 0x1001F9FE5: __vfprintf (in /usr/lib/system/libsystem_c.dylib) ==8795== by 0x10021F9AE: __v2printf (in /usr/lib/system/libsystem_c.dylib) ==8795== by 0x10021FC80: __xvprintf (in /usr/lib/system/libsystem_c.dylib) ==8795== by 0x1001F5B71: vfprintf_l (in /usr/lib/system/libsystem_c.dylib) ==8795== by 0x1001F39D7: printf (in /usr/lib/system/libsystem_c.dylib) ==8795== by 0x100000F2D: main (ex3.c:8) ==8795== ==8795== Conditional jump or move depends on uninitialised value(s) ==8795== at 0x1003FBC47: _platform_memchr$VARIANT$Haswell (in /usr/lib/system/libsystem_platform.dylib) ==8795== by 0x1001EFB96: __sfvwrite (in /usr/lib/system/libsystem_c.dylib) ==8795== by 0x1001F9FE5: __vfprintf (in /usr/lib/system/libsystem_c.dylib) ==8795== by 0x10021F9AE: __v2printf (in /usr/lib/system/libsystem_c.dylib) ==8795== by 0x10021FC80: __xvprintf (in /usr/lib/system/libsystem_c.dylib) ==8795== by 0x1001F5B71: vfprintf_l (in /usr/lib/system/libsystem_c.dylib) ==8795== by 0x1001F39D7: printf (in /usr/lib/system/libsystem_c.dylib) ==8795== by 0x100000F2D: main (ex3.c:8) ==8795== I am 10 years old. I am 72 inches tall. ==8795== ==8795== HEAP SUMMARY: ==8795== in use at exit: 38,888 bytes in 426 blocks ==8795== total heap usage: 506 allocs, 80 frees, 45,016 bytes allocated ==8795== ==8795== LEAK SUMMARY: ==8795== definitely lost: 0 bytes in 0 blocks ==8795== indirectly lost: 0 bytes in 0 blocks ==8795== possibly lost: 0 bytes in 0 blocks ==8795== still reachable: 4,096 bytes in 1 blocks ==8795== suppressed: 34,792 bytes in 425 blocks ==8795== Rerun with --leak-check=full to see details of leaked memory ==8795== ==8795== For counts of detected and suppressed errors, rerun with: -v ==8795== Use --track-origins=yes to see where uninitialised values come from ==8795== ERROR SUMMARY: 4 errors from 2 contexts (suppressed: 0 from 0) 

Он говорит, что я получаю Conditional jump or move depends on uninitialized value(s) на ex3.c:8 , но переменная height инициализируется в строке 6.

Я предполагаю , что это проблема с Valgrind на Yosemite, и ошибка является фиктивной, но я очень новичок в C, и хотя я уверен, что код верен, я также не знаю, может ли быть что-то такое Нет.

Это проблема с Valgrind или моим кодом?

Этот конкретный отчет является ложным позитивным от имени Вальгринда. Valgrind на Yosemite еще не полностью покрывает системные библиотеки для всех угловых случаев и оптимизирует эти библиотеки.

Подсказка здесь – это имя функции _platform_memchr $ VARIANT $ Haswell, то есть наличие этой ошибки будет зависеть от вашего системного оборудования, в данном случае, есть ли у вас процессор Intel Haswell.

Было бы замечательно, если бы вы могли сообщить об этой ошибке в http://valgrind.org/support/bug_reports.html Valgrind, чтобы ее можно было установить до следующего стабильного выпуска Valgrind.

Полное раскрытие: я являюсь одним из разработчиков Valgrind, которые внесли исправления для поддержки OS X 10.10

вы можете запустить valgrind с параметром, чтобы игнорировать библиотечный код.

Тогда все те (вы должны игнорировать) сообщения об ошибках библиотеки исчезнут.

с страницы valgrind.org: http://valgrind.org/docs/manual/manual-core.html#manual-core.suppress

Средства проверки ошибок обнаруживают многочисленные проблемы в системных библиотеках, например библиотеку C, которые предварительно устанавливаются с вашей ОС. Вы не можете легко исправить это, но вы не хотите видеть эти ошибки (и да, их много!) Итак, Valgrind читает список ошибок для подавления при запуске. Файл блокировки по умолчанию создается сценарием ./configure при построении системы.

Вы можете изменить и добавить в файл запретов на досуге или, лучше, написать свой собственный. Разрешены несколько файлов подавления. Это полезно, если часть вашего проекта содержит ошибки, которые вы не можете или не хотите исправлять, но вы не хотите, чтобы их постоянно напоминали.

Примечание. Самым простым способом добавления ограничений является использование опции --gen-suppressions=yes описанной в разделе « Основные параметры командной строки» . Это автоматически генерирует подавления. Однако для получения наилучших результатов вы можете отредактировать выход --gen-suppressions=yes вручную, и в этом случае было бы целесообразно прочитать этот раздел.

Каждая ошибка, подлежащая подавлению, описана очень конкретно, чтобы свести к минимуму возможность того, что директива подавления непреднамеренно подавляет кучу подобных ошибок, которые вы действительно хотели видеть. Механизм подавления предназначен для обеспечения точной, но гибкой спецификации ошибок для подавления.

Ну, я могу добавить еще один «это не произойдет для меня с моей домашней valgrind на Йосемити». Бинарный файл датируется 2014-11-25 и имеет версию «Valgrind-3.11.0.SVN». Запустив тестовый код, я получаю вывод:

 $ valgrind --suppressions=suppressions ./ex3 ==40416== Memcheck, a memory error detector ==40416== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. ==40416== Using Valgrind-3.11.0.SVN and LibVEX; rerun with -h for copyright info ==40416== Command: ./ex3 ==40416== --40416-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option --40416-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option (repeated 2 times) --40416-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option (repeated 4 times) I am 10 years old. I am 72 inches tall. ==40416== ==40416== HEAP SUMMARY: ==40416== in use at exit: 39,086 bytes in 428 blocks ==40416== total heap usage: 511 allocs, 83 frees, 45,358 bytes allocated ==40416== ==40416== LEAK SUMMARY: ==40416== definitely lost: 0 bytes in 0 blocks ==40416== indirectly lost: 0 bytes in 0 blocks ==40416== possibly lost: 0 bytes in 0 blocks ==40416== still reachable: 25,940 bytes in 308 blocks ==40416== suppressed: 13,146 bytes in 120 blocks ==40416== Rerun with --leak-check=full to see details of leaked memory ==40416== ==40416== For counts of detected and suppressed errors, rerun with: -v ==40416== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) $ 

В моем файле запретов содержится 18 утечек (и нет ошибок доступа) из среды выполнения Yosemite (я рад поделиться, если это поможет, оно было создано со временем с параметром --gen-suppressions=yes ). Я работаю на старом (в начале 2011 года, 17-дюймовом) MacBook Pro с процессором Intel Core i7.

Мне не нравятся сообщения «Неизвестный mach_msg», но они всегда появляются для меня, и они, очевидно, не останавливают работу valgrind (для меня это выявили неподдельные проблемы, а также не сообщают об ошибках в этом коде, которые должны работать ).

Я думаю, что проблема, которую вы видите, находится в системной библиотеке, и разумно подавлять эти два сообщения, но нежелательно это делать (так же нежелательно, чтобы вы подавляли столько утечек o / s).

Валгринд определенно экспериментален по Йосемити. Однако я получаю разные (более правильные?) Результаты, которые запускают ваш пример. Я также использую версию svn, возможно, более новую, чем вы, поскольку я обновил ее непосредственно перед тестом. Другое отличие в том, что я сам его построил, не использовал пиво.

 ==14456== Memcheck, a memory error detector ==14456== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. ==14456== Using Valgrind-3.11.0.SVN and LibVEX; rerun with -h for copyright info ==14456== Command: ./t1 ==14456== I am 10 years old. I am 72 inches tall. ==14456== ==14456== HEAP SUMMARY: ==14456== in use at exit: 38,396 bytes in 418 blocks ==14456== total heap usage: 503 allocs, 85 frees, 44,692 bytes allocated ==14456== ==14456== LEAK SUMMARY: ==14456== definitely lost: 0 bytes in 0 blocks ==14456== indirectly lost: 0 bytes in 0 blocks ==14456== possibly lost: 0 bytes in 0 blocks ==14456== still reachable: 4,096 bytes in 1 blocks ==14456== suppressed: 34,300 bytes in 417 blocks ==14456== Rerun with --leak-check=full to see details of leaked memory ==14456== ==14456== For counts of detected and suppressed errors, rerun with: -v ==14456== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 

Обновить:

Вот как я построил valgrind (параметры по умолчанию):

 ./autogen.sh ./configure make sudo make install 

Это версия libc (libsystem metalibrary). Мой пример двоичного файла связан с:

 $ otool -L t1 t1: /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0) 

Это моя версия clang:

 $ clang -v Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn) Target: x86_64-apple-darwin14.1.0 Thread model: posix