2010-09-10 18 views
6

Valgrind muestra un valor no inicializado de error de tamaño 8. Y ocasionalmente, el salto condicional a continuación en el error de valor no inicializado.Valgrind errores en las bibliotecas c?

Todo lo que estoy haciendo es imprimir una cadena formateada usando la biblioteca stdC++ que viene con gcc y el construido en vsnprintf.

Esto se encuentra dentro de un método denominado formato que es parte de una clase de cadena personalizada. ¿Y ahora qué? todo parece correcto El error parece estar dentro de _itoa.c. Pero todo lo que se me ocurre hacer por fuera no es utilizar esta función, ¡lo cual no es muy posible!

==4229== Memcheck, a memory error detector 
==4229== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al. 
==4229== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info 
==4229== Command: ./test 
==4229== 
==4229== Use of uninitialised value of size 8 
==4229== at 0x54A3DF1: _itoa_word (_itoa.c:196) 
==4229== by 0x54A5138: vfprintf (vfprintf.c:1613) 
==4229== by 0x555C74F: __vsnprintf_chk (vsnprintf_chk.c:65) 
==4229== by 0x407E57: myString::format(char const*, ...) (stdio2.h:79) 
==4229== by 0x419D14: ID::toString() (id.cpp:151) 
==4229== by 0x41D03D: main (test.cpp:126) 
==4229== 
==4229== Conditional jump or move depends on uninitialised value(s) 
==4229== at 0x54A3DF8: _itoa_word (_itoa.c:196) 
==4229== by 0x54A5138: vfprintf (vfprintf.c:1613) 
==4229== by 0x555C74F: __vsnprintf_chk (vsnprintf_chk.c:65) 
==4229== by 0x407E57: myString::format(char const*, ...) (stdio2.h:79) 
==4229== by 0x419D14: ID::toString() (uuid.cpp:151) 
==4229== by 0x41D03D: main (test.cpp:126) 
==4229== 
==4229== 
==4229== HEAP SUMMARY: 
==4229==  in use at exit: 0 bytes in 0 blocks 
==4229== total heap usage: 6 allocs, 6 frees, 1,340 bytes allocated 
==4229== 
==4229== All heap blocks were freed -- no leaks are possible 
==4229== 
==4229== For counts of detected and suppressed errors, rerun with: -v 
==4229== Use --track-origins=yes to see where uninitialised values come from 
==4229== ERROR SUMMARY: 3 errors from 2 contexts (suppressed: 4 from 4) 

Respuesta

5

Este es el lugar en la biblioteca de C, donde en realidad está mirando a su número con el fin de darle formato como una cadena, y se indica que el número que está formateando vino de almacenamiento sin inicializar.

Agregue la opción valgrind --track-origins=yes para obtener más detalles sobre el origen del valor no inicializado.

Porque es común copiar alrededor de la memoria no inicializada, p. relleno en las estructuras, valgrind rastrea la copia de valores no inicializados y no se queja hasta el momento en que el valor se utiliza realmente de una manera que pueda afectar el comportamiento externo visible de su programa. Esto puede hacer que sea confuso determinar la fuente original del valor no inicializado, ya que puede haber sido copiado varias veces antes de que se haya hecho cualquier otra cosa con él. La opción --track-origins=yes rastrea información adicional para identificar el origen del valor no inicializado, de modo que pueda mostrarse en caso de que el valor no inicializado termine siendo utilizado.

1

Si dice que está en una de las bibliotecas estándar, significa que algo que está pasando no está configurado correctamente. Por lo tanto, para depurar, vaya a la primera línea en la jerarquía, que es su código ... entonces: ID :: toString() (id.cpp: 151).

Mire a su alrededor lo que se devuelve allí, y encontrará a su culpable.

Cuestiones relacionadas