c - how - use valgrind to find memory leaks
¿Puede gcc detectar con precisión condicionales inútiles? (5)
Además de lo anterior, si se siente frustrado buscando un error usando valgrind o un perfilador de ejecución similar, quizás debería considerar usar una herramienta de análisis estático, como lint . Personalmente, uso PC-LINT , que atrapa todo tipo de este tipo de errores.
Por favor, examine el siguiente código:
if (foo->bar == NULL);
foo->bar = strdup("Unknown");
Pasé la última parte de tres horas cazando esa fuga con Valgrind, sintiéndome muy tonto cuando descubrí el falso '';''.
Sé que el código anterior es válido C, sin embargo, me encantaría que gcc pudiera decirme si estoy usando un enunciado condicional.
¿Hay alguna bandera que yo pueda aprobar que ayude a detectar este tipo de error en el futuro? Me parece que gcc podría saber si un condicional es inútil.
IE :
if (1 == 1);
code_that_is_always_reached_since_conditional_is_a_statement();
Ninguna de las pelusas tiene problemas con esto tampoco. Valgrind es genial para encontrar este tipo de cosas ... pero la fuga fue en realidad mucho más tarde en el código que donde originalmente se asignó el puntero.
Cualquier ayuda es apreciada, incluso "No, no hace eso".
Editar:
¡Guau, gracias por una respuesta tan rápida y excelente! Para resumir, aquí están sus opciones:
- -Wextra retoma todo tipo de cosas que -Wall no incluye, incluidas las declaraciones vacías / inútiles.
- -What-body recoge afirmaciones inútiles, que es habilitado por -Wextra (pero puede romper versiones anteriores de gcc, funciona en 4.3.x)
Algunas personas pueden encontrar -Wextra molesto. Es posible que tenga una comparación entre tipos de firmas diferentes, pero sabe que la comparación solo ocurre cuando son iguales.
es decir
int ret;
unsigned int i;
ret = foo(bar); /* foo() is known to return a signed errno on failure */
if (ret < 0)
return 1;
/* Enter GCC complaining that ret differs in signedness
* (but you know it doesn''t and get the urge to cast it) */
for (i = 0; i < ret; i ++)
...
Gracias de nuevo por los consejos!
Después de profundizar en el manual de gcc:
-Wempty-body
Warn if an empty body occurs in an `if'', `else'' or `do while'' statement. This warning is also enabled by
-Wextra.
Como escribieron algunos otros carteles, -Wextra debería hacerlo
Código de muestra:
int main(){
if (0);
printf("launch missiles");
return 0;
}
$gcc -Wempty-body foo.c
warn.c: In function ‘main’:
warn.c:5: warning: suggest braces around empty body in an ‘if’ statement
Prueba -Wextra
/* foo.c */
int main() {
if (1) ;
return 0;
}
gcc -Wextra -c foo.c
foo.c: In function ‘main’:
foo.c:2: warning: empty body in an if-statement
Como alternativa al compilador, encuentro que ejecutar un autoindenter sobre el código ayuda a encontrar estas situaciones.
En vim, por ejemplo:
gg=G