Além de -Wall, que outros avisos as pessoas acharam úteis?
http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Warning-Options.html
Além de -Wall, que outros avisos as pessoas acharam úteis?
http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Warning-Options.html
Respostas:
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).
-O3
ou algo semelhante; existem avisos que são gerados apenas quando o código é otimizado.
-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.
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
-Wfloat-equal
adicionado ao meu alias. Obrigado Mark
-Wstrict-aliasing=2
na verdade reduz o nível de aviso de -Wstrict-aliasing=3
implícito por -Wall
, pelo menos com uma versão recente do gcc.
Eu gosto de -Werror. Mantém o código de advertência livre.
#warning
um bom efeito colateral do uso -Werror
.
-Werror
por 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.
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
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.
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 ++.
Eu geralmente compilo com "-W -Wall -ansi -pedantic" isso ajuda a garantir a máxima qualidade e portabilidade do código.
-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.
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.
-pedantic-errors
clang
(o compilador C do projeto LLVM) e depois compilar com -Weverything
e você verá como a compilação muito divertida pode realmente se tornar (alguns dos avisos são totalmente malucos, mas estão tecnicamente corretos).
-Wfloat-equal, -Wshadow, -Wmissing-prototypes,
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.
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
-Wfatal-errors
-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.