2015-03-28 2 views
3

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

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

ex3.c

#include <stdio.h> 

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 on Yose клещей и ошибка является фиктивной, но я очень новичок в C, и хотя я уверен, что код верен, я также не знаю, может ли быть что-то, чего я не вижу.

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

+0

Код выглядит прекрасно, для чего это стоит; предупреждения являются ложными. У меня есть дикая догадка о том, что происходит; если вы добавите другого символа в первую строку формата (неважно, для чего нужно просто сделать строку формата длиной несколько байт) и снова запустить код, исчезнет ли первое предупреждение? – Wintermute

+0

Добавление другого символа в строку первого формата не похоже на что-то другое. –

+0

Хмм ... что-то, чего я раньше не заметил: обе ошибки исходят из той же строки в 'ex3.c', то есть тот же самый вызов' printf' (первый). То, что самая внутренняя стековая структура является «memchr», заставляет меня поверить, что это векторный поиск терминатора строк, который читает неинициализированную память, если строка не кратна 4 (или, возможно, 8) байтам. В том числе терминатор, ваши строки формата имеют длину 19 и 21 байт соответственно, а замена '% d' на двузначное число не изменяет его. Для меня не имеет никакого значения, что нужно заставить valgrind жаловаться, но не другого. – Wintermute

ответ

1

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

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

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

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

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

Примечание: самым простым способом добавления подавлений является использование опции --gen-suppressions=yes, описанной в Core Command-line Options. Это автоматически генерирует подавления. Для получения наилучших результатов, однако, вы можете отредактировать вывод --gen-suppressions=yes вручную, в , в каком случае было бы желательно прочитать этот раздел.

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

+0

Сначала я думал, что это работает, потому что, когда я запускал '--gen-supression = yes', я получил 0 ошибок в правильном коде. Но потом я снова запустил его в коде _incorrect_ и получил 0 ошибок. Это, конечно, не то, что я хочу. –

1

Valgrind определенно экспериментален по Йосемити. Однако я получаю разные (более правильные?) Результаты, которые запускают ваш пример. Я также использую версию 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) 

Update:

Это, как я построил 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 
+0

Я закончил с клонированием из SVN и снова запустил make и получил аналогичные результаты, которые я получил раньше. Может быть, различия в оборудовании меняют здесь? –

+0

Странно. Здесь важнее программное обеспечение, а не аппаратное обеспечение. Я обновил свой ответ с дополнительной информацией о моем программном обеспечении. – baf

+0

Хотя ключевое слово Haswell в вашем сообщении об ошибке может предполагать, что вариант 'memchr', который вызывает ложное срабатывание, зависит от оборудования и может присутствовать только на вашей платформе. – baf

1

Ну, я могу добавить еще один «это не происходит для меня с моим самодельный valgrind работает на Yosemite». Бинарный файл датируется 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 утечек (и без ошибок доступа) из Йосемити выполнения (я рад поделиться, если это поможет, это было создано более время с опцией --gen-suppressions=yes). Я работаю на старом (в начале 2011 года, 17-дюймовом) MacBook Pro с процессором Intel Core i7.

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

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

8

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

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

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

Полное раскрытие: Я один из разработчиков VALGRIND, которые способствовали патчи для поддержки OS X 10,10

Смежные вопросы