2011-05-20 13 views
5

que estoy escribiendo un compilador que genera código C. Los programas producidos consisten solo en la función principal, y usan mucha memoria, que se asigna con malloc(). La mayor parte de la memoria asignada se usa solo en una pequeña parte del programa, y ​​pensé que sería una buena idea liberarla() después de su uso, ya que no se volverá a utilizar. Me alegraría, entonces, si valgrind me informara acerca de la memoria no libre() d al final del programa, es decir, memoria alcanzable. Estoy usando valgrind con --error-exitcode = 1 dentro de un Makefile, para verificar este tipo de problema automáticamente.¿Cómo hacer el informe valgrind un error cuando todavía hay allocs alcanzables

La pregunta es: ¿hay una manera de hacer la salida valgrind con 1 en caso de que todavía son alcanzables allocs?

Respuesta

2

Una alternativa a grepping través de la salida Valgrind: modificar el compilador por lo que emite:

int main() { return foo_main(); } 
int foo_main() { /* whatever you've emitted before */ } 

Suponiendo que no está asignando bloques asignados a las variables globales (que no tendría ningún sentido ya que sólo tienen una función), acaba de transformar "todavía alcanzable" en "definitivamente filtrado".

Posiblemente aún mejor transformación: no llame exit(0) en su principal; cámbielo a return 0; en su lugar. El efecto neto debe ser el mismo que el anterior: __libc_main ahora llamará al exit, y todas las variables locales en main estarán fuera del alcance en ese momento.

2

El valgrind manual dice:

Indirectamente perdidos y aún alcanzables bloques no se cuentan como verdaderos "errores", incluso si --show alcanzable = yes se especifica y se imprimen; esto es porque tales bloques no necesitan fijación directa por el programador.

No he encontrado ninguna forma de hacer que el informe de valgrind "todavía accesible" sea un error. Parece ser que su única opción para hacer esto (aparte de parchear valgrind) es capturar la salida de valgrind y analizar la línea "todavía alcanzable".

1

Alternativamente, puede tener un pequeño script de shell en su makefile a grep a través de los registros de salida de valgrind y salida en consecuencia.

2

Las opciones poroper de usar para salir con el error cuando hay un bloque accesible en la salida:

valgrind --tool=memcheck --leak-check=full --show-reachable=yes --errors-for-leak-kinds=all

De Valgrind manual:

Debido a que hay diferentes tipos de fugas con diferentes niveles de gravedad , una pregunta interesante es: ¿qué filtraciones deben contarse como verdaderos "errores" y cuáles no?

La respuesta a esta pregunta afecta a los números impresos en la línea de resumen de errores, y también el efecto de la opción --error-código de salida. Primero, una fuga solo se cuenta como un verdadero "error" si se especifica --leak-check = full. Luego, la opción --errors-for-leak-kinds = controla el conjunto de clases de fugas para considerarlas como errores. El valor por defecto es --errors fines de fugas tipo = definitiva, posibles

Cuestiones relacionadas