Opções de aviso gcc recomendadas para C [fechado]

Respostas:

48

Eu uso rotineiramente:

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

Este conjunto pega muito para pessoas não acostumadas a ele (pessoas cujo código eu consegui compilar com esses sinalizadores pela primeira vez); raramente me causa problemas (embora -Wcast-qual seja ocasionalmente um incômodo).

Jonathan Leffler
fonte
1
Hoje em dia, acho que tenho que adicionar ' -Wdeclaration-after-statement' para detectar código que o MSVC (que ainda é basicamente um compilador C89) não consegue lidar. É um incômodo. Adicionar ' -Wextra' pode detectar alguns outros problemas também.
Jonathan Leffler
2
Além disso, é uma boa ideia adicionar -O3ou algo semelhante; existem avisos que são gerados apenas quando o código é otimizado.
Jonathan Leffler
3
de acordo com o documento gcc, -O2 é o melhor para detectar avisos. Não tenho certeza se -O3 implica -O2 ou permite que mais avisos sejam gerados.
Offirmo de
3
Pule -m64 se você não estiver em um ambiente de 64 bits.
Tor Klingberg
1
Usar ambos -m32 e -m64 (em execuções separadas, é claro) oferece melhor proteção contra vários bugs na maneira como você usa printf()e nas scaf()especificações de conversão.
Jonathan Leffler,
40

Em 01-09-2011, com gcc versão 4.6.1

Meu atual alias de "desenvolvimento"

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 \
    -Definição do estilo antigo -Werror \
    -ggdb3 \
    -O0 \
    -fno-omit-frame-pointer -ffloat-store -fno-common -fstrict-aliasing \
    -lm

O alias de "lançamento"

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

Em 03-11-2009

alias de "desenvolvimento"

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

"release" alias

gcc -lm -std = c89 -pedantic -O3 -DNDEBUG --combine -fwhole-program -funroll-loops
pmg
fonte
1
-Wfloat-equaladicionado ao meu alias. Obrigado Mark
pmg
4
Observe que -Wstrict-aliasing=2na verdade reduz o nível de aviso de -Wstrict-aliasing=3implícito por -Wall, pelo menos com uma versão recente do gcc.
nwellnhof
15

Eu gosto de -Werror. Mantém o código de advertência livre.

JesperE
fonte
21
Sem -Werror, todas as outras opções de aviso são inúteis. Tratar os avisos como erros é praticamente a única maneira de garantir que os avisos sejam resolvidos. Se forem apenas avisos, um desenvolvedor pode decidir deixar um porque tem certeza de que é inválido. Pode até ser verdade, mas o próximo desenvolvedor não corrigirá os avisos que introduziu porque não os viu entre todos os outros, ou porque é apenas mais um aviso.
Kristof Provost
6
Eu discordo do Kristof, porque muitas vezes, prefiro apenas compilar uma cópia de trabalho primeiro e depois corrigir os erros.
Yktula
9
Eu entendo porque isso é tentador, mas quando / se você tiver uma cópia de trabalho será mais provável que a deixe como está porque "funciona". O risco é ainda maior em um ambiente corporativo, onde você terá que convencer seu chefe a deixar algum tempo para corrigir os avisos.
JesperE
2
Eu considero me livrar de #warningum bom efeito colateral do uso -Werror.
JesperE
3
se você trabalha em código aberto não usa -Werrorpor padrão em suas compilações, isso irrita os empacotadores que estão usando versões de compilador diferentes de você, já que os avisos mudam com a versão do compilador, às vezes o código que é gratuito para você terá um aviso para outra pessoa e então eles têm que cavar em seu sistema de compilação para desligá-lo.
Spudd86 de
15

Comecei com C ++, então, quando mudei para aprender CI, fiz questão de ser extra-anal:

-fmessage-length = 0
-ansi -pedantic -std = c99
-Werror
-Parede
-Wextra
-Wwrite-strings
-Winit-self
-Wcast-align
-Wcast-qual
-Wpointer-arith
-Wstrict-aliasing
-Wformat = 2
-Declarações de saudade
-Wmissing-include-dirs
-Wno-unused-parameter
-Wuninitialized
- Definição de estilo antigo
-Wstrict-prototypes
-Protótipos-saudade
Tom
fonte
5
Você pode usar -ansi -pedantic -std = c99 ao mesmo tempo? Não é -ansi aproximadamente a mesma coisa que c89? Em caso afirmativo, como isso funciona com a sinalização c99?
Johan
2
@Johan - você pode, e não é realmente necessário, como descobri mais recentemente. -ansi implica -std = <default>, então você poderia apenas dizer -std = c99 -pedantic e obter exatamente o mesmo efeito. Eu costumo usá-lo de qualquer maneira, apenas para efeito de documentação. Sinto que está escrito: "Este código é o padrão ANSI (pedante!), Usando o padrão C99." Imediatamente depois, geralmente vem -Wno-long-long ou similar ... quaisquer exceções ao padrão ANSI.
Tom,
9

Obtenha o manual da versão do GCC que você usa, encontre todas as opções de aviso disponíveis e desative apenas aquelas para as quais você tem um motivo convincente para fazê-lo. (Por exemplo, cabeçalhos de terceiros não modificáveis ​​que, de outra forma, forneceriam muitos avisos.) Documente esses motivos. (No Makefile ou onde quer que você defina essas opções.) Reveja as configurações em intervalos regulares e sempre que atualizar seu compilador.

O compilador é seu amigo. Os avisos são seus amigos. Dê ao compilador a maior chance possível de informá-lo sobre possíveis problemas.

DevSolar
fonte
1
FYI, o manual não fornece uma única lista abrangente de avisos. No entanto, você pode encontrar essas listas aqui , junto com as ferramentas usadas para gerá-las.
Kyle Strand
5

Eu também uso:

-Wstrict-overflow = 5

Para detectar aqueles bugs desagradáveis ​​que podem ocorrer se eu escrever um código que depende do comportamento de estouro de inteiros.

E:

-Wextra

O que permite algumas opções que também são boas. A maioria é para C ++.

Nils Pipenbrinck
fonte
4
-Wextra parece ser o novo nome para -W (que também é compatível)
Sard
2

Eu geralmente compilo com "-W -Wall -ansi -pedantic" isso ajuda a garantir a máxima qualidade e portabilidade do código.

Evan Teran
fonte
3
apenas uma nota -ansi substitui -std = c99
Sard
2
Não é -ansi equivalente a usar -std = c89?
método auxiliar de
2

-pedantic -Wall -Wextra -Wno-write-strings -Wno-unused-parameter

Para o modo "Me machuque bastante", deixo de fora o -Wno ...

Gosto de ter meu código livre de avisos, especialmente com C ++. Embora os avisos do compilador C possam frequentemente ser ignorados, muitos avisos do C ++ mostram defeitos fundamentais no código-fonte.

Thorsten79
fonte
3
Porque o conjunto de ferramentas tem liberdade para colocar literais de string na memória somente leitura.
DevSolar
3
Por que -Wno-unused-parameter? Muito raramente, ele aponta para problemas reais (e "muito raramente" o perigo exato de desativá-lo: bugs improváveis ​​são os piores de detectar). Por exemplo, se pode disparar em Foo(int dndu, int dndv) : dndu_(dndu), dndv_(dndu) {}-> relativamente difícil de detectar. Se você estiver incomodado com esse aviso, você deve simplesmente comentar o parâmetro foo (int /*q*/), pois isso também aumenta a legibilidade do seu código.
Sebastian Mach
Durante a refatoração, às vezes sombrei o parâmetro por engano com um local, isso ajuda a capturar isso também
paulm
1

-pedantic-errors

Tom Ritter
fonte
2
@unexist Tente instalar clang(o compilador C do projeto LLVM) e depois compilar com -Weverythinge você verá como a compilação muito divertida pode realmente se tornar (alguns dos avisos são totalmente malucos, mas estão tecnicamente corretos).
Mecki
1

-Wfloat-equal, -Wshadow, -Wmissing-prototypes,

Mark Bessey
fonte
1

-Wredundant-decls -Wnested-externs -Wstrict-prototypes -Wextra -Werror-implícito-função-declaração -Wunused -Wno-unused-value -Wreturn-type

florim
fonte
1

Agora eu uso:

-Wall -W -Wextra -Wconversion -Wshadow -Wcast-qual -Wwrite-strings -Werror

Peguei essa lista principalmente do livro "Uma introdução ao gcc" e, em seguida, algumas das recomendações de Ulrich Drepper sobre Programação Defensiva ( http://people.redhat.com/drepper/Defensive-slides.pdf ).

Mas não tenho nenhuma ciência por trás da minha lista, apenas parecia uma boa lista.

/ Johan


Nota: Eu não gosto dessas bandeiras pedantes ...

Nota: Eu acho que -W e -Wextra são mais ou menos a mesma coisa.

João
fonte
2
Depois de usar -Wconversion, e passar algumas horas testando vários tipos de dados em meu código e reconstruindo, pesquisei -Wconversion e não recomendaria usá-lo em geral. O problema é que ele gera avisos sobre códigos como: char a = 5; char b = a - 1; Isso está usando gcc 4.3.2 (Debian 4.3.2.-1.1)
James Morris
1
-W avisos de conversão podem ser eliminados por (por exemplo no comentário acima): char a = 5; char b = (char) (a - 1); colchetes de nota.
James Morris,
1

Eu geralmente só 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
amaterasu
fonte
1

O aviso sobre variáveis ​​não inicializadas não funciona a menos que você especifique -O, então incluo isso em minha lista:

-g -O -Wall -Werror -Wextra -pedantic -std=c99
Josh Lee
fonte
0

-Wfatal-errors

Adrian Panasiuk
fonte