Aparte de -Wall, ¿qué otras advertencias han encontrado útiles las personas?
http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Warning-Options.html
Aparte de -Wall, ¿qué otras advertencias han encontrado útiles las personas?
http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Warning-Options.html
Respuestas:
Yo uso habitualmente:
gcc -m64 -std=c99 -pedantic -Wall -Wshadow -Wpointer-arith -Wcast-qual \
-Wstrict-prototypes -Wmissing-prototypes
Este conjunto capta mucho para las personas que no están acostumbradas a él (personas cuyo código puedo compilar con esos indicadores por primera vez); rara vez me da un problema (aunque -Wcast-qual es ocasionalmente una molestia).
-O3
o algo similar; hay advertencias que solo se generan cuando el código está optimizado.
-m32
y -m64
(en ejecuciones separadas, por supuesto) proporciona una mejor protección contra varios errores en la forma de uso printf()
y scaf()
las especificaciones de conversión.
Desde 2011-09-01, con gcc versión 4.6.1
Mi alias actual de "desarrollo"
gcc -std = c89 -pedantic -Wall \ -Wno-missing-braces -Wextra -Wno-missing-field-initializers -Wformat = 2 \ -Wswitch-default -Wswitch-enum -Wcast-align -Wpointer-arith \ -Wbad-function-cast -Wstrict-overflow = 5 -Wstrict-prototypes -Winline \ -Wundef -Wnested-externs -Wcast-qual -Wshadow -Wunreachable-code \ -Wlogical-op -Wfloat-equal -Wstrict-aliasing = 2 -Wredundant-decls \ -Definición-estilo-mundo -Werror \ -ggdb3 \ -O0 \ -fno-omit-frame-pointer -ffloat-store -fno-common -fstrict-aliasing \ -lm
El alias de "liberación"
gcc -std = c89 -pedantic -O3 -DNDEBUG -flto -lm
Desde 2009-11-03
alias de "desarrollo"
gcc -Wall -Wextra -Wformat = 2 -Wswitch-default -Wcast-align -Wpointer-arith \ -Wbad-function-cast -Wstrict-prototypes -Winline -Wundef -Wnested-externs \ -Wcast-qual -Wshadow -Wwrite-strings -Wconversion -Wunreachable-code \ -Wstrict-aliasing = 2 -ffloat-store -fno-common -fstrict-aliasing \ -lm -std = c89 -pedantic -O0 -ggdb3 -pg --cobertura
alias de "liberación"
gcc -lm -std = c89 -pedantic -O3 -DNDEBUG --combine -fwhole-program -funroll-loops
-Wfloat-equal
agregado a mi alias. Gracias Mark
-Wstrict-aliasing=2
realidad reduce el nivel de advertencia de -Wstrict-aliasing=3
implícito -Wall
, al menos con una versión reciente de gcc.
Me gusta -Werror. Mantiene libre la advertencia del código.
#warning
un buen efecto secundario del uso -Werror
.
-Werror
de forma predeterminada en sus compilaciones, molesta a los empaquetadores que están usando diferentes versiones del compilador, ya que las advertencias cambian con la versión del compilador, a veces el código que advierte gratis para usted tendrá una advertencia para otra persona y luego tienen que profundizar en su sistema de compilación para apagarlo.
Empecé con C ++, así que cuando hice el cambio para aprender CI me aseguré de ser extra-anal:
-fmensaje-longitud = 0 -ansi -pedantic -std = c99 -Werror -Pared -Wextra -Escribir-cadenas -Winit-self -Wcast-align -Wcast-qual -Wpointer-arith -Wstrict-aliasing -Wformat = 2 -Declaraciones-perdidas -Wmissing-include-dirs -Wno-parámetro-no utilizado -Wuninitialized -Definición de estilo Wold -Prototipos-estrictos -Prototipos-perdidos
Obtenga el manual para la versión de GCC que usa, busque todas las opciones de advertencia disponibles y luego desactive solo aquellas para las que tenga una razón convincente para hacerlo. (Por ejemplo, encabezados de terceros no modificables que le darían muchas advertencias de lo contrario). Documente esos motivos. (En el Makefile o donde sea que establezca esas opciones). Revise la configuración en intervalos regulares y siempre que actualice su compilador.
El compilador es tu amigo. Las advertencias son tus amigas. Déle al compilador tantas oportunidades como sea posible para informarle de los problemas potenciales.
Yo también uso:
-Wstrict-overflow = 5
Para detectar esos errores desagradables que pueden ocurrir si escribo código que se basa en el comportamiento de desbordamiento de los enteros.
Y:
-Wextra
Lo que habilita algunas opciones que también es bueno tener. Sin embargo, la mayoría son para C ++.
Normalmente compilo con "-W -Wall -ansi -pedantic", esto ayuda a garantizar la máxima calidad y portabilidad del código.
-pedantic -Wall -Wextra -Wno-write-strings -Wno-unused-parameter
Para el modo "Hazme mucho daño", dejo de lado el -Wno ...
Me gusta tener mi código de advertencia gratis, especialmente con C ++. Si bien las advertencias del compilador de C a menudo se pueden ignorar, muchas advertencias de C ++ muestran defectos fundamentales en el código fuente.
Foo(int dndu, int dndv) : dndu_(dndu), dndv_(dndu) {}
-> relativamente difícil de detectar. Si está molesto por esa advertencia, simplemente debe comentar el parámetro foo (int /*q*/)
, esto también aumenta la legibilidad de su código.
-Errores-pedantes
clang
(el compilador C del proyecto LLVM) y luego compila con -Weverything
y verás lo divertido que puede llegar a ser compilar mach (algunas de las advertencias son totalmente locas, pero técnicamente correctas).
-Wfloat-equal, -Wshadow, -Wmissing-prototypes,
Ahora mismo uso:
-Wall -W -Wextra -Wconversion -Wshadow -Wcast-qual -Wwrite-strings -Werror
Tomé esa lista principalmente del libro "Una introducción a gcc" y luego de la recomendación de Ulrich Drepper sobre Programación defensiva ( http://people.redhat.com/drepper/Defensive-slides.pdf ).
Pero no tengo ninguna ciencia detrás de mi lista, simplemente se sintió como una buena lista.
/ Johan
Nota: aunque no me gustan esas banderas pedantes ...
Nota: Creo que -W y -Wextra son más o menos lo mismo.
Generalmente solo uso
gcc -Wall -W -Wunused-parameter -Wmissing-declarations -Wstrict-prototypes -Wmissing-prototypes -Wsign-compare -Wconversion -Wshadow -Wcast-align -Wparentheses -Wsequence-point -Wdeclaration-after-statement -Wundef -Wpointer-arith -Wnested-externs -Wredundant-decls -Werror -Wdisabled-optimization -pedantic -funit-at-a-time -o
-Wfatal-errors
-Wdeclaration-after-statement
' para detectar el código que MSVC (que sigue siendo básicamente un compilador C89) no puede manejar. Es una molestia. Agregar '-Wextra
' también puede detectar otros problemas.