C/C++: Flags de compilación para depurar con Gcc
Debo confesar que a la hora de compilar un programa soy bastante maniático con los mensajes de advertencia (Warnings). Por ello me gusta siempre incluir los flags -Wall -Werror -W en la llamada al compilador gcc. De esta forma voy eliminando todos los mensajes de aviso que lanza el compilador y genero un código mucho más estable y limpio. Dichas opciones del compilador tienen el siguiente cometido:
- -W: Inhibe todos los mensajes de advertencia.
- -Werror: Trata a todos los mensajes de advertencia como errores.
- -Wall: Activa todos los mensajes de errores que suelen ser cuestionables y que son fáciles de cometer/olvidar. En concreto activa las siguientes banderas de compilación:
- -Waddress
- -Warray-bounds (only with -O2)
- -Wc++0x-compat
- -Wchar-subscripts
- -Wimplicit-int
- -Wimplicit-function-declaration
- -Wcomment
- -Wformat
- -Wmain (only for C/ObjC and unless -ffreestanding)
- -Wmissing-braces
- -Wnonnull
- -Wparentheses
- -Wpointer-sign
- -Wreorder
- -Wreturn-type
- -Wsequence-point
- -Wsign-compare (only in C++)
- -Wstrict-aliasing
- -Wstrict-overflow=1
- -Wswitch
- -Wtrigraphs
- -Wuninitialized (only with -O1 and above)
- -Wunknown-pragmas
- -Wunused-function
- -Wunused-label
- -Wunused-value
- -Wunused-variable
Sin embargo hay ocasiones que aún escribiendo el código adecuadamente, la activación de estas banderas hace que salten algunos errores en partes de código que todo el mundo programamos igual. Un caso concreto es que cuando trabajamos con pthreads y tenemos que declarar funciones con tipo de retorno (void *). El compilador espera que se retorne dicho tipo de dato, pero puede darse el caso de que la función no tenga que devolver nada. Para estos casos podemos pasar el siguiente flag a gcc.
- -Wno-return-type: Ignora los errores provocados por -Wreturn-type y que se activan por defecto con -Wall.
También hay otra situación que me molesta bastante. Cuando definimos una clase abstracta y definimos los métodos abstractos, el compilador puede mandarnos mensajes de advertencia variables no usadas. Con las banderas que he comentado al principio, dichos mensjes se convierten en errores, con el incordio que esto supone. Para evitar estas situaciones podemos declarar las variables que nos especifica el compilador con
__attribute__((unused))
justo antes del tipo de variable. De esta forma indicamos al compilador que es posible que la variable que se define no sea utilizada. Eso si, esta palabra reservada solo está definida para el compilador de GNU por lo que si usáis otro como el de Visual Studio os dará error.
¿Algún otro maniático de estos asuntos quiere compartir alguna experiencia de interés
?
Mas información en documentación GCC.
loading...

loading...
Te dejo un par de enlaces interesantes:
http://blogs.gnome.org/otte/2008/12/22/warning-options/
http://mces.blogspot.com/2008/12/year-end-cleaning-ie-on-warning-options.html
Además, creo que este bug te puede interesar:
https://bugzilla.gnome.org/show_bug.cgi?id=608953
Saludos
loading...
Muchas gracias por la info Javier. Ahora le echaré un vistazo