2008-09-30 11 views

Respuesta

1

-pedantic-errors

+3

+1 Esto convertirá la compilación en diversión. ;) – unexist

+2

@unexist Intenta instalar 'clang' (el compilador de C del proyecto LLVM) y luego compila con' -Weverything' y verás cómo realmente se puede hacer la compilación mach (algunas de las advertencias son totalmente locas, sin embargo, son técnicamente correctos). – Mecki

2

lo general compilar con "-W -Wall -ansi -pedantic" Esto ayuda a asegurar la máxima calidad y la portabilidad del código.

+3

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

+1

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

15

Me gusta -Werror. Mantiene el código de advertencia libre.

+20

Sin -Werror todas las demás opciones de advertencia son inútiles. Tratar las advertencias como errores es prácticamente la única forma de garantizar que las advertencias se resuelvan. Si solo son 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 introdujo porque no lo vio entre todos los demás, o porque es solo una advertencia más. –

+0

Su absolutamente correcto. – JesperE

+5

No estoy de acuerdo con Kristof, porque muchas veces preferiría obtener una copia de trabajo compilada primero y luego abordar los errores. – Yktula

5

También uso:

-Wstrict-desbordamiento = 5

Para atrapar a los insectos desagradables que pueden ocurrir si escribo código que se basa en el comportamiento de desbordamiento de enteros.

Y:

-Wextra

que permite algunas opciones que están bien tener también. La mayoría son para C++ sin embargo.

+4

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

45

habitualmente utilizo:

gcc -m64 -std=c99 -pedantic -Wall -Wshadow -Wpointer-arith -Wcast-qual \ 
     -Wstrict-prototypes -Wmissing-prototypes 

Este conjunto capta una gran cantidad de personas no utilizados a la misma (las personas cuyo código llego a compilar con las banderas por primera vez); rara vez me da un problema (aunque -Wcast-qual ocasionalmente es una molestia).

+0

En estos días, encuentro que tiene que agregar '' -Wdeclaration-after-statement' 'para detectar código que MSVC (que todavía es básicamente un compilador C89) no manejará. 'Es una molestia. Agregar ''-Wextra'' también puede detectar algunos otros problemas. –

+2

Además, es una buena idea agregar '-O3' o algo similar; hay advertencias que solo se generan cuando el código está optimizado. –

+3

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

2

-pedantic -Wall -Wextra -Wno-escritura-strings -Wno-sin usar parámetros

Para el modo "Hurt Me Plenty", les dejo la distancia -Wno ...

me gusta tener mi código de advertencia gratuita, especialmente con C++. Mientras que las advertencias del compilador de C a menudo se pueden ignorar, muchas advertencias de C++ muestran defectos fundamentales en el código fuente.

+2

¿Por qué -Wno-write-strings? – Tom

+2

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

+3

¿Por qué -Wno-unused-parameter? Muy rara vez apunta a problemas reales (y "muy raramente" el peligro exacto de deshabilitarlo: los errores no probables son los peores que se pueden detectar). Por ejemplo, si se activa en 'Foo (int dndu, int dndv): dndu_ (dndu), dndv_ (dndu) {}' -> relativamente difícil de detectar. Si le molesta esa advertencia, simplemente debe salir el parámetro 'foo (int/* q * /)', esto también aumenta la legibilidad de su código. –

1

-Wfloat-iguales, -Wshadow, -Wmissing-prototipos,

1

-Wredundant-decls -Wnested-externs -Wstrict-prototipos -Wextra -Werror-implícita-function-declaración -Wunused -Wno-unused- -Wreturn valor de tipo

14

empecé con C++, así que cuando hice el cambio a aprender CI aseguré que ser extra-anal:

 
-fmessage-length=0 
-ansi -pedantic -std=c99 
-Werror 
-Wall 
-Wextra 
-Wwrite-strings 
-Winit-self 
-Wcast-align 
-Wcast-qual 
-Wpointer-arith 
-Wstrict-aliasing 
-Wformat=2 
-Wmissing-declarations 
-Wmissing-include-dirs 
-Wno-unused-parameter 
-Wuninitialized 
-Wold-style-definition 
-Wstrict-prototypes 
-Wmissing-prototypes 
+3

¿Se puede 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 no es realmente necesario, como he descubierto más recientemente. -ansi implica -std = , así que realmente podrías 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 ANSI-estándar (¡pedante!), Usando C99 estándar". Inmediatamente después, por lo general, aparece "No largo" o similar ... cualquier excepción al estándar ANSI. – Tom

1

ahora mismo uso:

-Wall -W -We Xtra -Wconversion -Wshadow -Wcast-cali--Wwrite cadenas -Werror

Tomé esa lista en su mayoría del libro "Introducción a gcc" y algo más de Ulrich Drepper recomendación sobre programación defensiva (http://people.redhat.com/drepper/Defensive-slides.pdf).

Pero no tengo ninguna ciencia detrás de mi lista, simplemente se sentía como una buena lista.

/Johan


Nota: No me gustan esas banderas pedante aunque ....

Nota: Creo que -W y -Wextra son más o menos lo mismo.

+2

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

+0

-Las advertencias de conversión se pueden eliminar (por ejemplo, en el comentario anterior): char a = 5; char b = (char) (a - 1); nota corchetes. –

0

-Wfatal-errors

1

por lo general sólo tiene que utilizar

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 las variables sin inicializar no funciona a menos que se especifique -O, por lo que incluyo en mi lista:

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

Get el manual para la versión de GCC que utiliza, encuentre todas las opciones de advertencia disponibles, y luego desactivar solo para los que tiene convincente razón para hacerlo. (Por ejemplo, encabezados de terceros no modificables que le darían muchas advertencias de lo contrario). Documente los motivos. (en el archivo Makefile o donde establezca esas opciones). Revise la configuración en intervalls regulares, y cada vez que actualice su compilador.

El compilador es tu amigo. Las advertencias son tu amigo Bríndele al compilador la posibilidad de contarle posibles problemas.

+1

FYI, el manual no proporciona una sola lista exhaustiva de advertencias. Sin embargo, puede encontrar dichas listas [aquí] (https://github.com/barro/compiler-warnings), junto con las herramientas utilizadas para generarlas. –

32

A partir de 2011-09-01, con la versión de gcc 4.6.1

Mi actual "desarrollo" alias

 
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 \ 
    -Wold-style-definition -Werror \ 
    -ggdb3 \ 
    -O0 \ 
    -fno-omit-frame-pointer -ffloat-store -fno-common -fstrict-aliasing \ 
    -lm 

La "liberación" alias

 
gcc -std=c89 -pedantic -O3 -DNDEBUG -flto -lm 

A partir de 2009-11-03

"d esarrollo" alias

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

'liberación' alias

 
gcc -lm -std=c89 -pedantic -O3 -DNDEBUG --combine -fwhole-program -funroll-loops 
+1

'-Wfloat-equal' agregado a mi alias. Gracias Mark – pmg

+2

Tenga en cuenta que '-Wstrict-aliasing = 2' en realidad reduce el nivel de advertencia de' -Wstrict-aliasing = 3' implicado por '-Wall', al menos con una versión reciente de gcc. – nwellnhof

Cuestiones relacionadas