Valgrind informa errores para un progtwig C muy simple

Estoy aprendiendo el lenguaje C de Learn C The Hard Way . Estoy en el ejercicio 6 y aunque puedo hacerlo funcionar, valgrind repots una gran cantidad de errores.

Aquí está el progtwig mínimo ex6.c de un archivo ex6.c :

 #include  int main(int argc, char *argv[]) { char initial = 'A'; float power = 2.345f; printf("Character is %c.\n", initial); printf("You have %f levels of power.\n", power); return 0; } 

El contenido de Makefile es solo CFLAGS=-Wall -g .

$ make ex6 el progtwig con $ make ex6 (no hay advertencias o compiler errors). Ejecutar con $ ./ex6 produce el resultado esperado.

Cuando ejecuto el progtwig con $ valgrind ./ex6 obtengo errores que no puedo resolver. Aquí está la salida completa:

 ==69691== Memcheck, a memory error detector ==69691== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. ==69691== Using Valgrind-3.11.0.SVN and LibVEX; rerun with -h for copyright info ==69691== Command: ./ex6 ==69691== --69691-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option --69691-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option (repeated 2 times) --69691-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option (repeated 4 times) ==69691== Conditional jump or move depends on uninitialised value(s) ==69691== at 0x1003FBC3F: _platform_memchr$VARIANT$Haswell (in /usr/lib/system/libsystem_platform.dylib) ==69691== by 0x1001EFBB6: __sfvwrite (in /usr/lib/system/libsystem_c.dylib) ==69691== by 0x1001FA005: __vfprintf (in /usr/lib/system/libsystem_c.dylib) ==69691== by 0x10021F9CE: __v2printf (in /usr/lib/system/libsystem_c.dylib) ==69691== by 0x10021FCA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib) ==69691== by 0x1001F5B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib) ==69691== by 0x1001F39F7: printf (in /usr/lib/system/libsystem_c.dylib) ==69691== by 0x100000F1B: main (ex6.c:8) ==69691== Character is A. ==69691== Invalid read of size 32 ==69691== at 0x1003FBC1D: _platform_memchr$VARIANT$Haswell (in /usr/lib/system/libsystem_platform.dylib) ==69691== by 0x1001EFBB6: __sfvwrite (in /usr/lib/system/libsystem_c.dylib) ==69691== by 0x1001FA005: __vfprintf (in /usr/lib/system/libsystem_c.dylib) ==69691== by 0x10021F9CE: __v2printf (in /usr/lib/system/libsystem_c.dylib) ==69691== by 0x10021FCA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib) ==69691== by 0x1001F5B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib) ==69691== by 0x1001F39F7: printf (in /usr/lib/system/libsystem_c.dylib) ==69691== by 0x100000F31: main (ex6.c:9) ==69691== Address 0x100809680 is 32 bytes before a block of size 32 in arena "client" ==69691== You have 2.345000 levels of power. ==69691== ==69691== HEAP SUMMARY: ==69691== in use at exit: 39,365 bytes in 429 blocks ==69691== total heap usage: 510 allocs, 81 frees, 45,509 bytes allocated ==69691== ==69691== LEAK SUMMARY: ==69691== definitely lost: 16 bytes in 1 blocks ==69691== indirectly lost: 0 bytes in 0 blocks ==69691== possibly lost: 13,090 bytes in 117 blocks ==69691== still reachable: 26,259 bytes in 311 blocks ==69691== suppressed: 0 bytes in 0 blocks ==69691== Rerun with --leak-check=full to see details of leaked memory ==69691== ==69691== For counts of detected and suppressed errors, rerun with: -v ==69691== Use --track-origins=yes to see where uninitialised values come from ==69691== ERROR SUMMARY: 5 errors from 2 contexts (suppressed: 0 from 0) 

Estoy en OS X yosemite. Valgrind se instala mediante brew con este comando $ brew install valgrind --HEAD .

Entonces, ¿alguien sabe cuál es el problema aquí? ¿Cómo arreglo los errores valgrind?

Si el progtwig que está ejecutando Valgrind es exactamente el que publicó en su pregunta, claramente no tiene ninguna pérdida de memoria. ¡De hecho, ni siquiera usa malloc / free usted mismo!

Me parece que estos son errores espurios / falsos positivos que Valgrind detecta en OS X (¡solo!), Similar a lo que me sucedió hace algún tiempo .

Si tiene acceso a un sistema operativo diferente, por ejemplo, una máquina Linux, intente analizar el progtwig utilizando Valgrind en ese sistema.

EDITAR: No lo he intentado yo mismo, ya que no tengo acceso a una Mac en este momento, pero debe probar lo que sugirió M Oehm: intente utilizar un archivo de supresiones como se menciona en esta otra pregunta de SO .

Este problema se corrigió para Darwin 14.3.0 (Mac OS X 10.10.2) utilizando Valgrind r14960 with VEX r3124 para Xcode6.2 y Valgrind r15088 para Xcode 6.3.

Si está utilizando Macports (en este momento de la escritura), sudo port install valgrind-devel le dará Valgrind r14960 with VEX r3093 .

Aquí está mi script de construcción para instalar Valgrind r14960 with VEX r3124 :

 #! /usr/bin/env bash mkdir -p buildvalgrind cd buildvalgrind svn co svn://svn.valgrind.org/valgrind/trunk/@14960 valgrind cd valgrind ./autogen.sh ./configure --prefix=/usr/local make && sudo make install # check that we have our valgrind installed /usr/local/bin/valgrind --version 

(referencia: http://calvinx.com/2015/04/10/valgrind-on-mac-os-x-10-10-yosemite/ )

Mi valgrind instalado en macports se encuentra en /opt/local/bin/valgrind .

Si ahora corro

/opt/local/bin/valgrind --leak-check=yes --suppressions=`pwd`/objc.supp ./ex6

Obtendré exactamente los mismos errores que describió anteriormente. (Usando mi archivo objc.supp aquí https://gist.github.com/calvinchengx/0b1d45f67be9fdca205b )

Pero si corro

/usr/local/bin/valgrind --leak-check=yes --suppressions=`pwd`/objc.supp ./ex6

Todo funciona como se espera y no aparece ningún error de fuga de memoria a nivel del sistema.

A juzgar por este tema, supongo que valgrind no garantiza resultados correctos en su plataforma. Si puedes, prueba este código en otra plataforma.

El culpable se encuentra en valgrid o en la implementación de printf de su sistema, los cuales serían poco prácticos para usted.

Rerun with --leak-check=full to see details of leaked memory. Esto debería proporcionarle más información sobre la fuga que está experimentando. Si nada ayuda, puede crear un archivo de supresión para evitar que se muestren los errores.