Gostaria de ativar - literalmente - TODOS os avisos que o GCC possui. (Você pensaria que seria fácil ...)
Você pensaria que
-Wall
poderia fazer o truque, mas não! Ainda precisa-Wextra
.Você pensaria que
-Wextra
poderia fazer o truque, mas não! Nem todos os avisos listados aqui (por exemplo-Wshadow
) são ativados por isso. E ainda não tenho ideia se esta lista é abrangente.
Como eu digo ao GCC para ativar (sem if's, e's ou but's!) Todos os avisos que possui?
c++
gcc
warnings
compiler-warnings
gcc-warning
user541686
fonte
fonte
-Weverything
.Respostas:
Você não pode.
O manual do GCC 4.4.0 é abrangente apenas para essa versão, mas lista todos os avisos possíveis para o 4.4.0. Eles não estão todos na página para a qual você vincula, por exemplo, algumas opções específicas do idioma estão nas páginas de opções C ++ ou Obj-C. Para encontrá-los todos, é melhor consultar o Resumo das opções
Ligar tudo incluiria o
-Wdouble-promotion
que é relevante apenas em CPUs com uma unidade de ponto flutuante de precisão única de 32 bits que implementafloat
em hardware, mas simuladouble
em software. Fazendo cálculos comodouble
usaria a emulação de software e seria mais lento. Isso é relevante para algumas CPUs incorporadas, mas completamente irrelevante para as modernas CPUs de desktop com suporte de hardware para ponto flutuante de 64 bits.Outro aviso que geralmente não é útil é
-Wtraditional
, que alerta sobre códigos perfeitamente formados que têm um significado diferente (ou não funciona) nas"string " "concatenation"
definições tradicionais de C, por exemplo , ou ISO C! Você realmente se importa com a compatibilidade com compiladores de 30 anos? Você realmente quer um aviso para escreverint inc(int i) { return i+1; }
?Eu acho que
-Weffc++
é muito barulhento para ser útil, é baseado na primeira edição desatualizada do Effective C ++ e alerta sobre construções perfeitamente válidas em C ++ (e para as quais as diretrizes foram alteradas nas edições posteriores do livro.) Eu não quero ser avisei que não inicializei umstd::string
membro no meu construtor; ele tem um construtor padrão que faz exatamente o que eu quero, por que devo escreverm_str()
para chamá-lo? Os-Weffc++
avisos que seriam úteis são muito difíceis para o compilador detectar com precisão (dando falsos negativos) e os que não são úteis, como inicializar explicitamente todos os membros, apenas produzem muito ruído, dando falsos positivos.Luc Danton forneceu um ótimo exemplo de avisos inúteis, dos
-Waggregate-return
quais quase certamente nunca faz sentido para o código C ++.ou seja, você realmente não deseja todos os avisos, apenas pensa que deseja.
Leia o manual, leia sobre eles, decida qual você deseja ativar e tente. Ler o manual do seu compilador é uma Good Thing TM de qualquer maneira, tomar um atalho e ativar avisos que você não entende não é uma boa idéia, especialmente se for para evitar ter que usar o RTFM.
Quem simplesmente liga tudo provavelmente está fazendo isso porque não tem noção, porque ou um chefe de cabelos pontudos disse "sem avisos".
Alguns avisos são importantes e outros não. Você tem que ser discriminador ou estragar seu programa. Considere, por exemplo
-Wdouble-promotion
,. Se você estiver trabalhando em um sistema incorporado, poderá querer isso; se você estiver trabalhando em um sistema desktop, provavelmente não. E você quer-Wtraditional
? Eu duvido.Editar: Consulte também -Wall-all para ativar todos os avisos fechados como WONTFIX.
Edit 2: em resposta à reclamação do DevSolar sobre makefiles que precisam usar avisos diferentes dependendo da versão do compilador, se
-Wall -Wextra
não for adequado, não será difícil usar CFLAGS específicos do compilador e da versão:fonte
-Weverything
é a melhor solução, eu acho, do que a estratégia do gcc de não dar essa opção. Eu uso esse sinalizador com clang porque minha filosofia é que eu quero todos os avisos por padrão (porque alguém achou útil o suficiente para adicionar ao compilador) e, se eu não gostar, desativo esse aviso especificamente. O ponto é que você não sabe sobre avisos que não são acionados, mas sabe sobre avisos que não deseja que sejam acionados e eles são facilmente desativados.-Weverything
opção de Clang , mas é impossível fazer com o GCC.Concordo com as respostas anteriores de que provavelmente não é benéfico ativar literalmente todos os avisos, no entanto, o GCC fornece uma maneira razoavelmente conveniente de conseguir isso. O comando
fornece uma lista de todas as opções de aviso suportadas com informações sobre se elas estão ativas. A propósito, isso pode ser usado para descobrir quais opções (não) estão ativadas, por exemplo,
-Wall
e-Wextra
Para habilitar todos os avisos, você pode usar algum regex para extrair os parâmetros da linha de comando
Para o meu GCC atual, isso fornece:
Agora isso pode ser usado para chamar o GCC, ou seja,
Observe, no entanto, que isso resulta em avisos devido a algumas opções de aviso estarem disponíveis apenas para determinados idiomas (por exemplo
C++
). Isso pode ser evitado usando um pouco mais de regex para incluir apenas as opções permitidas para o idioma atual ou adicionando um apropriado-Wno-whatever
no final da chamada.fonte
-isystem
vez de-I
nos diretórios relevantes.É simplesmente impossível programar com todos os avisos ativados (a menos que você os ignore, mas por que se preocupar?). Por exemplo, vamos supor que você use o seguinte conjunto de sinalizadores:
-Wstrict-prototypes -Wtraditional
.Mesmo com dois avisos ativados, o programa a seguir reclamaria.
Você pode pensar "bem, eu vou usar protótipos de estilo antigo então". Não, isso não vai funcionar.
E não, não especificar nenhum protótipo também está errado, pois o compilador também reclamará.
Se você definir alguma função dentro do seu programa, não poderá usar todos os sinalizadores, porque o compilador reclamará de qualquer definição de função imaginável.
Para C ++, isso é possível (o
-Wtraditional
sinalizador não existe) e programas muito simples podem ser compilados. Para habilitar todos os avisos, use a seguinte lista de avisos (provavelmente alguns avisos foram duplicados, porque eu não me preocupei em filtrar os avisos ativados por-Wall
).fonte
int main(int, char **); int main(argc, argv) int argc; char **argv; { (void)argc; (void)argv; return 0; }
Alguém criou um conjunto de ferramentas para determinar o conjunto completo de avisos para uma determinada versão do GCC ou Clang.
Para o GCC, copiar da lista completa de avisos fornecidos por esta ferramenta para a sua versão do compilador parece ser a única maneira de garantir que todos os avisos sejam ativados, pois (ao contrário do Clang) o GCC não fornece
-Weverything
.A ferramenta parece analisar o
c.opt
arquivo real no código-fonte do GCC, portanto, seus resultados devem ser definitivos.O repositório também contém arquivos de texto com as listas de aviso geradas para a maioria das versões GCC e Clang (atualmente Clang 3.2 a 3.7 e GCC 3.4 a 5.3).
https://github.com/barro/compiler-warnings
fonte
O Gcc 4.3+ agora possui -Q --help = avisos, você pode até especificar --help = warnings, C para imprimir apenas os avisos relacionados ao C.
Acabei de escrever um módulo m4 para tirar proveito disso (também suporta -Weverything do clang), consulte wget_manywarnings.m4
Como usá-lo é bastante simples, basicamente o módulo ativa cada sinalizador de aviso. E você remove os avisos conforme necessário - alguns são realmente muito detalhados. Exemplo: configure.ac
Se você não usar autotools, encontrará o código para ativar todos os avisos desabilitados no módulo m4, que basicamente é a chamada do gcc transmitida pelo awk:
flags="-Wall -Wextra -Wformat=2 "$(gcc -Wall -Wextra -Wformat=2 -Q --help=warning,C|awk '{ if (($2 == "[disabled]" || $2 == "") && $1!~/=/ && $1~/^-W/&& $1!="-Wall") print $1 }'
fonte
A partir desta página :
Eu acho que a pergunta é quais ? Talvez você possa cumprimentar essa página para todas as linhas que começam com -W e obter uma lista completa de sinalizadores de aviso. Em seguida, compare-os com as listas em
-Wall
e-Wextra
. Há também-Wpedantic
, embora você obviamente esteja querendo ser ainda mais pedante ainda =)fonte
Provavelmente é, mas a única lista 100% abrangente é a fonte real do compilador. No entanto, o GCC é grande ! E não sei se todos os parâmetros da linha de comando são coletados em um único local ou espalhados por vários arquivos de origem. Observe também que alguns avisos são para o pré-processador, outros para o compilador real e outros para o vinculador (que é um programa completamente separado e encontrado no pacote binutils), portanto eles provavelmente estão espalhados.
fonte