Opciones de advertencia de gcc recomendadas para C [cerrado]


Respuestas:


48

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).


1
En estos días, encuentro que tengo que agregar ' -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.
Jonathan Leffler

2
Además, es una buena idea agregar -O3o algo similar; hay advertencias que solo se generan cuando el código está optimizado.
Jonathan Leffler

3
según gcc doc, -O2 es el mejor para detectar advertencias. No estoy seguro de si -O3 implica -O2 o permite que se generen más advertencias.
Offirmo

3
Omita -m64 si no se encuentra en un entorno de 64 bits.
Tor Klingberg

1
El uso de -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.
Jonathan Leffler

40

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

1
-Wfloat-equalagregado a mi alias. Gracias Mark
pmg

4
Tenga en cuenta que en -Wstrict-aliasing=2realidad reduce el nivel de advertencia de -Wstrict-aliasing=3implícito -Wall, al menos con una versión reciente de gcc.
nwellnhof

15

Me gusta -Werror. Mantiene libre la advertencia del código.


21
Sin -Werror, todas las demás opciones de advertencia no tienen sentido. Tratar las advertencias como errores es prácticamente la única forma de garantizar que las advertencias se resuelvan. Si son solo advertencias, un desarrollador puede decidir dejar una porque está seguro de que no es válida. Incluso puede ser cierto, pero el próximo desarrollador no arreglará las advertencias que presentó porque no las vio entre todas las demás, o porque es solo una advertencia más.
Kristof Provost

6
No estoy de acuerdo con Kristof, porque muchas veces, prefiero simplemente obtener una copia de trabajo compilada primero y luego abordar los errores.
Yktula

9
Entiendo por qué es tentador, pero cuando / si tiene una copia de trabajo, es más probable que la deje como está porque "funciona". Este riesgo es aún mayor en un entorno corporativo, donde tendrá que convencer a su jefe de que le deje algo de tiempo para corregir las advertencias.
JesperE

2
Considero deshacerme de #warningun buen efecto secundario del uso -Werror.
JesperE

3
si trabaja en cosas de código abierto, no lo use -Werrorde 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.
Spudd86

15

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

5
¿Puedes usar -ansi -pedantic -std = c99 al mismo tiempo? ¿No es -ansi aproximadamente lo mismo que c89? y si es así, ¿cómo funciona eso con la bandera c99?
Johan

2
@Johan: puedes, y en realidad no es necesario, como descubrí más recientemente. -ansi implica -std = <predeterminado>, por lo que en realidad podría decir -std = c99 -pedantic y obtener exactamente el mismo efecto. Tiendo a usarlo de todos modos, solo por el efecto de documentación. Siento que dice: "Este código es estándar ANSI (¡pedante!), Usando el estándar C99". Inmediatamente después suele aparecer -Wno-long-long o similar ... alguna excepción al estándar ANSI.
Tom

9

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.


1
Para su información, el manual no proporciona una única lista completa de advertencias. Sin embargo, puede encontrar estas listas aquí , junto con las herramientas utilizadas para generarlas.
Kyle Strand

5

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 ++.


4
-Wextra parece ser el nuevo nombre para -W (que también es compatible)
Sard

2

Normalmente compilo con "-W -Wall -ansi -pedantic", esto ayuda a garantizar la máxima calidad y portabilidad del código.


3
solo una nota -ansi anula -std = c99
Sard

2
¿No es -ansi equivalente a usar -std = c89?
helpermethod

2

-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.


3
Porque la cadena de herramientas tiene la libertad de poner cadenas literales en la memoria de solo lectura.
DevSolar

3
¿Por qué -Wno-unused-parameter? Muy pocas veces apunta a problemas reales (y "muy pocas veces" el peligro exacto de deshabilitarlo: los errores no probables son los peores de detectar). Por ejemplo, si puede dispararse en 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.
Sebastian Mach

Durante la refactorización, a veces he sombreado el parámetro por error con un local, también ayuda a captar eso
paulm

1

-Errores-pedantes


2
@unexist Intenta instalar clang(el compilador C del proyecto LLVM) y luego compila con -Weverythingy verás lo divertido que puede llegar a ser compilar mach (algunas de las advertencias son totalmente locas, pero técnicamente correctas).
Mecki


1

-Wredundant-decls -Wnested-externs -Wstrict-prototypes -Wextra -Werror-implícita-declaración-función -Wunused -Wno-valor-no utilizado -Wreturn-type


1

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.


2
Después de usar -Wconversion, y pasar un par de horas probando varios tipos de datos en mi código y reconstruyéndolo, investigué -Wconversion y no recomendaría usarlo en general. El problema es que genera advertencias sobre el código como: char a = 5; char b = a - 1; Esto está usando gcc 4.3.2 (Debian 4.3.2.-1.1)
James Morris

1
-Las advertencias de Wconversion se pueden eliminar mediante (por ejemplo, en el comentario anterior): char a = 5; char b = (char) (a - 1); corchetes de nota.
James Morris

1

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

1

La advertencia sobre variables no inicializadas no funciona a menos que especifique -O, así que lo incluyo en mi lista:

-g -O -Wall -Werror -Wextra -pedantic -std=c99

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.