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