Me gustaría habilitar, literalmente, TODAS las advertencias que tiene GCC. (Pensarías que sería fácil ...)
Pensarías que
-Wall
podría hacer el truco, ¡pero no! Aún lo necesito-Wextra
.Pensarías que
-Wextra
podría hacer el truco, ¡pero no! Esto no habilita todas las advertencias enumeradas aquí (por ejemplo-Wshadow
). Y todavía no tengo idea si esta lista es completa.
¿Cómo le digo a GCC que habilite (no if's, and's, or but's!) Todas las advertencias que tiene?
c++
gcc
warnings
compiler-warnings
gcc-warning
usuario541686
fuente
fuente
-Weverything
.Respuestas:
No puedes
El manual para GCC 4.4.0 solo es completo para esa versión, pero enumera todas las advertencias posibles para 4.4.0. Sin embargo, no están todos en la página a la que se vincula, por ejemplo, algunas opciones específicas del idioma están en las páginas para las opciones de C ++ u Obj-C. Para encontrarlos todos, es mejor mirar el Resumen de opciones
Activar todo incluiría lo
-Wdouble-promotion
que solo es relevante en las CPU con una unidad de punto flotante de precisión simple de 32 bits que se implementafloat
en hardware, pero emuladouble
en software. Hacer cálculos comodouble
usaría la emulación de software y sería más lento. Eso es relevante para algunas CPU integradas, pero es completamente irrelevante para las CPU de escritorio modernas con soporte de hardware para punto flotante de 64 bits.Otra advertencia que generalmente no es útil es
-Wtraditional
, ¡que advierte sobre un código perfectamente bien formado que tiene un significado diferente (o no funciona) en las"string " "concatenation"
definiciones de funciones tradicionales de C, por ejemplo , o ISO C! ¿Realmente te importa la compatibilidad con compiladores de 30 años? ¿De verdad quieres una advertencia para escribirint inc(int i) { return i+1; }
?Creo que
-Weffc++
es demasiado ruidoso para ser útil, se basa en la primera edición obsoleta de Effective C ++ y advierte sobre construcciones que son C ++ perfectamente válidas (y para las cuales las pautas cambiaron en ediciones posteriores del libro). No quiero ser advirtió que no he inicializado unstd::string
miembro en mi constructor; tiene un constructor predeterminado que hace exactamente lo que quiero, ¿por qué debería escribirm_str()
para llamarlo? Las-Weffc++
advertencias que serían útiles son demasiado difíciles para que el compilador las detecte con precisión (dando falsos negativos), y las que no son útiles, como la inicialización explícita de todos los miembros, solo producen demasiado ruido, dando falsos positivos.Luc Danton proporcionó un gran ejemplo de advertencias inútiles
-Waggregate-return
que casi nunca tienen sentido para el código C ++.es decir, realmente no quieres todas las advertencias, solo piensas que sí.
Revise el manual, lea sobre ellos, decida qué desea habilitar, pruébelos. Leer el manual de su compilador es un Good Thing TM de todos modos, tomar un atajo y habilitar advertencias que no entiende no es una muy buena idea, especialmente si es para evitar tener que usar RTFM.
Cualquiera que simplemente encienda todo probablemente lo esté haciendo porque no tiene idea porque o un jefe de pelo puntiagudo dijo "no hay advertencias".
Algunas advertencias son importantes y otras no. Tienes que discriminar o arruinas tu programa. Consideremos, por ejemplo,
-Wdouble-promotion
. Si está trabajando en un sistema integrado, es posible que desee esto; Si está trabajando en un sistema de escritorio, probablemente no. Qué y desea-Wtraditional
? Lo dudo.Editar: Consulte también -Wall-all para habilitar todas las advertencias que se cierra como WONTFIX.
Edición 2: en respuesta a la queja de DevSolar sobre que los makefiles necesitan usar diferentes advertencias dependiendo de la versión del compilador, si
-Wall -Wextra
no es adecuado, entonces no es difícil usar CFLAGS específicos del compilador y de la versión:fuente
-Weverything
es la mejor solución, creo, que la estrategia gcc de no dar esa opción. Uso esa bandera con clang porque mi filosofía es que quiero todas las advertencias por defecto (porque alguien pensó que era lo suficientemente útil para agregar al compilador), y si no me gusta, apago esa advertencia específicamente. El punto es que no sabes acerca de las advertencias que no se disparan, pero sí sabes sobre las advertencias que no quieres que se disparen, y se apagan fácilmente.-Weverything
opción de Clang , pero es imposible hacerlo con GCC.Estoy de acuerdo con las respuestas anteriores de que probablemente no sea beneficioso habilitar literalmente todas las advertencias, sin embargo, el CCG proporciona una forma razonablemente conveniente de lograr esto. El comando
proporciona una lista de todas las opciones de advertencia compatibles con información sobre si están activas. Por cierto, esto puede usarse para averiguar qué opciones están (no) habilitadas, por ejemplo,
-Wall
y-Wextra
Para habilitar todas las advertencias, puede usar algunas expresiones regulares para extraer los parámetros de la línea de comandos
Para mi GCC actual esto da:
Esto ahora se puede usar para llamar al GCC, es decir
Sin embargo, tenga en cuenta que esto genera advertencias debido a que algunas opciones de advertencia solo están disponibles para ciertos idiomas (p
C++
. Ej .). Esto podría evitarse utilizando más expresiones regulares para incluir solo las opciones permitidas para el idioma actual o agregando un apropiado-Wno-whatever
al final de la llamada.fuente
-isystem
lugar de-I
los directorios relevantes.Es simplemente imposible programar con todas las advertencias habilitadas (a menos que las ignore, pero entonces, ¿por qué molestarse?). Por ejemplo, supongamos que usted usa siguiente conjunto de banderas:
-Wstrict-prototypes -Wtraditional
.Incluso con dos advertencias habilitadas, el siguiente programa se quejaría.
Puedes pensar "bueno, voy a usar prototipos de estilo antiguo entonces". No, esto no funcionará.
Y no, no especificar ningún prototipo también está mal, ya que el compilador también se quejará.
Si define alguna función dentro de su programa, no puede usar todos los indicadores, porque el compilador se quejará de cualquier definición de función imaginable.
Para C ++, esto es posible (el
-Wtraditional
indicador no existe), y se pueden compilar programas muy simples. Para habilitar todas las advertencias, use la siguiente lista de advertencias (probablemente algunas advertencias están duplicadas, porque no me molesté en filtrar las advertencias habilitadas por-Wall
).fuente
int main(int, char **); int main(argc, argv) int argc; char **argv; { (void)argc; (void)argv; return 0; }
Alguien ha creado un conjunto de herramientas para determinar el conjunto completo de advertencias para una versión dada de GCC o Clang.
Para GCC, copiar de la lista completa de advertencias proporcionadas por esta herramienta para su versión del compilador parece ser la única forma de garantizar que todas las advertencias estén activadas, ya que (a diferencia de Clang) GCC no proporciona
-Weverything
.La herramienta parece analizar el
c.opt
archivo real en el código fuente de GCC, por lo que sus resultados deben ser definitivos.El repositorio también contiene archivos de texto con las listas de advertencia generadas para la mayoría de las versiones de GCC y Clang (actualmente Clang 3.2 a 3.7 y GCC 3.4 a 5.3).
https://github.com/barro/compiler-warnings
fuente
Gcc 4.3+ ahora tiene -Q --help = advertencias, incluso puede especificar --help = advertencias, C para imprimir las advertencias relacionadas con C.
Acabo de escribir un módulo m4 para aprovechar esto (también es compatible con clang's -Weverything), vea wget_manywarnings.m4
Cómo usarlo es bastante simple, básicamente el módulo activa cada indicador de advertencia. Y elimina las advertencias según sea necesario; algunas son realmente muy detalladas. Ejemplo: configure.ac
Si no usa las herramientas automáticas, encontrará el código para activar todas las advertencias deshabilitadas en el módulo m4, que básicamente es la llamada gcc canalizada a través de awk:
flags="-Wall -Wextra -Wformat=2 "$(gcc -Wall -Wextra -Wformat=2 -Q --help=warning,C|awk '{ if (($2 == "[disabled]" || $2 == "") && $1!~/=/ && $1~/^-W/&& $1!="-Wall") print $1 }'
fuente
De esta página :
Supongo que la pregunta es ¿ cuáles ? Tal vez podría grep esa página para todas las líneas que comienzan con -W, y obtener una lista completa de las banderas de advertencia. Luego compare aquellos con las listas debajo
-Wall
y-Wextra
. También lo hay-Wpedantic
, aunque obviamente quieres ser aún más pedante =)fuente
Probablemente lo sea, pero la única lista que es 100% completa es la fuente real del compilador. Sin embargo, ¡GCC es grande ! Y no sé si todos los parámetros de la línea de comandos se recopilan en un solo lugar o se distribuyen en varios archivos de origen. También tenga en cuenta que algunas advertencias son para el preprocesador, algunas para el compilador real y otras para el vinculador (que es un programa completamente separado y que se encuentra en el paquete binutils), por lo que es muy probable que estén dispersas.
fuente