2009-04-28 8 views
16

¿Se conocen falsos positivos con Valgrind? Obtengo un 'Salto condicional o movimiento depende de valor (es) sin inicializar' con la función fmemopen, escribiendo en C y compilando con GCC. ¿Puedo estar seguro de que es real?¿Se conocen problemas de falsos positivos con Valgrind?

EDITAR: ¿Existen problemas conocidos que no están en los archivos de supresión? ¿Hay algunas cosas que uno puede hacer en un programa, que no son realmente errores, pero Valgrind dirá que sí? Si hay problemas conocidos, una lista sería agradable.

Respuesta

13

Sí, hay falsos positivos con Valgrind, por eso tiene archivos de supresión para versiones particulares de glibc y gcc, por ejemplo. Los falsos positivos pueden surgir si está usando valgrind anterior con gcc y glibc más nuevos, es decir, valgrind 3.3 con glibc 2.9.

Habiendo dicho eso, usted todavía tiene que investigar el problema y averiguar si realmente es un falso positivo (si ese es el caso, puede escribir una supresión para usted) o es un error real en tu programa.

No hay una manera rápida y fácil de decir lo que está pasando aquí, pero en este caso sospecho que está pasando un valor no inicializado de su código al código de la biblioteca. Pruebe la opción Valgrind --track-origins=yes. Mostrará de dónde proviene el valor no inicializado. Si es tu código, probablemente deberías inicializarlo. Si está dentro de la biblioteca, podría ser el falso positivo o, aún así, los valores incorrectos de los argumentos de la llamada a la biblioteca podrían estar causando esto, así que verifíquelos.

+0

¿Cómo puedo saber realmente si es un falso positivo? –

+0

He agregado algunos consejos a mi respuesta, espero que ayude. –

+0

Yo diría que todos los problemas informados son en realidad problemas hasta que haya verificado sin dudas que sí lo están. Es fácil descartar algo como un falso positivo o un error en otra biblioteca o lo que sea cuando el problema es, de hecho, un problema real en su propio código. Recuerde: select probablemente no esté roto ;-) Por supuesto, habrá casos en los que realmente sea un falso positivo ... – Dan

2

Valgrind viene con alguna supresión de errores predeterminada, pero de ninguna manera cubren todas las bibliotecas.

Las herramientas de comprobación de errores detectan numerosos problemas en las bibliotecas base, como la biblioteca GNU C y las bibliotecas cliente X11, que vienen preinstaladas en su sistema GNU/Linux. No puede arreglarlos fácilmente, pero no desea ver estos errores (¡y sí, hay muchos!) Entonces Valgrind lee una lista de errores para suprimir al inicio. El script ./configure crea un archivo de supresión predeterminado cuando se crea el sistema.

Puede crear su propio error suppressions que sepa que es irrelevante para su código.

1

¿No fue el asunto de Debian SSL motivado por la fijación de algunos falsos positivos con Valgrind?

+2

Depende de lo que quiere decir con "falso positivo". Fue un uso deliberado de la memoria no inicializada en OpenSSL, como una de las muchas fuentes de aleatoriedad. Valgrind fue completamente correcto al advertir sobre ello (aunque era inofensivo). –

+4

@BaffeBoyois: No fue inofensivo, como lo demuestran los infames errores de Debian.Si Debian memsetting el buffer a cero rompió la generación de clave segura, un cambio de compilador en cómo se asigna la memoria de pila (o un cambio de biblioteca en malloc, si era del montón) podría dar como resultado fácilmente que la memoria sea cero y se rompa generación de clave segura El uso de memoria no inicializada para cualquier propósito, incluida la obtención de entropía, es un error grave. –

+2

@R: El error de Debian no era que les quedaba muy poca entropía una vez que dejaban de utilizar la memoria no inicializada como fuente. Fue cuando, cuando trataron de dejar de usar la memoria no inicializada, remendaron lo incorrecto y accidentalmente también dejaron de usar la mayoría de las otras fuentes de entropía. Solo eliminar la memoria no inicializada hubiera estado bien. –

Cuestiones relacionadas