É aconselhável usar o Clang para análise de código pessoal em um projeto criado com o gcc?

8

Comecei a trabalhar em vários projetos C que estão construindo usando gcc. Acredito que essa escolha foi feita por vários motivos:

  • Tive que fazer uma compilação cruzada para o braço muito cedo (eu acho).
  • O desempenho é a primeira e mais importante especificação.
  • gcc foi e ainda é a primeira escolha fácil.

Não tenho motivos para contestar essa escolha e não estou em posição de fazê-lo de qualquer maneira.

A base de código de qualquer projeto único é relativamente pequena. Todo projeto é construído com um Makefile relativamente limpo (atualmente sendo atualizado), gcc -Wall -Wextranão se queixa quase e é feito um teste mínimo. Não há análise estática automatizada ou formatação de código, e o código é sintaxe não consistente, embora seja muito legível e pareça pensado.

Não quero reformatar todas as linhas de código de uma só vez, pretendo fazer o que está descrito em alguma parte desta resposta (especialmente porque o contexto não é tão ruim): refatorar e reformatar o máximo possível ao lidar com qualquer tópico, mas ainda abordando tópicos sem nenhuma intenção de estilo de código. Infelizmente, não estou em posição de impor um estilo de código ou verificações adicionais nas confirmações, mas sinto que há uma sensação entre meus colegas de que você deve respeitar a convenção de código existente ao modificar um arquivo (embora eu esteja ciente do estado atual do código não aconteceu magicamente) e um desejo de escrever um bom código.

Esta é minha primeira vez em programação em C com esse estado de espírito, e estou muito atraído pelas várias ferramentas de análise e formatação de código clangfornecidas.

A essência da minha pergunta é: poderia levar a problemas para seguir as clangdicas e usar clangferramentas de formatação e análise durante a construção gcc? Por exemplo, alguns avisos podem vir de uma representação interna gccnão usada ou do bytecode clangpretendem gerar isso gccnão.

Existe uma boa maneira de passar automaticamente os gccparâmetros de compilação (principalmente a arquitetura de destino e o nível de otimização) para clangque as dicas de aviso façam sentido?

Acrescentarei que estou familiarizado gcce com o relatório de erros. Estou interessado em receber mais avisos e erros (relevantes), não apenas avisos mais redigidos e mais compreensíveis. Portanto, se não posso confiar em dicas adicionais que clangpodem ser produzidas com base em sua representação interna, porque eu desenvolvo gccno final do dia, não estou realmente interessado em fazer isso.

Incluí muito contexto; portanto, sinta-se à vontade para fazer qualquer observação ou responder a qualquer pergunta subjacente que não pude fazer.

nathdwek
fonte
Em relação às convenções de código, ele tomou cuidado para não colocar seus favoritos em um projeto existente. É improvável que as coisas melhorem significativamente e pode incomodar outros colaboradores. O mesmo vale para a escolha de ferramentas. É muito fácil se desviar de refazer as coisas da maneira "certa" sem realmente fazer melhorias reais.
beldaz

Respostas:

9

Por exemplo, alguns avisos podem vir de uma representação interna que o gcc não usa, ou do bytecode clang pretendem gerar esse gcc.

Extremamente improvável. Clang está avisando sobre seu código, não sobre alguma representação interna que ele usa. Todos os avisos devem derivar de algo suspeito que você está fazendo no seu código, não de detalhes de implementação do clang.

Onde você pode ter problemas é se algum código que você estiver usando usar C ++ não padrão. O GCC suporta várias extensões do C ++ que não serão aceitas por outros compiladores. Se você usar alguma dessas opções, o clang pode simplesmente se recusar a compilar seu código. O GCC precisa oferecer suporte à compilação de muitos códigos antigos e (como eu o entendo) é mais brando em alguns pontos do que o Clang.

Winston Ewert
fonte
2

Estou usando os dois no trabalho, gcc e clang. Você receberá mais avisos com os dois compiladores juntos, é claro, e isso é ótimo. Por outro lado, os avisos podem se contradizer.

O caso mais irritante que encontrei é quando clang detecta uma defaultregra switche diz que todos os valores já estão cobertos e o gcc insiste em ter um defaultcaso (documentado aqui ). Mas você só verá essa contradição ao configurar avisos muito estritos nos dois compiladores.

Subjetivamente, eu diria que o clang tem avisos mais rígidos e você pode obter mais deles se usar -Weverythingou mesmo o analisador de clang (analisador de código estático). Mas também recebi avisos que o gcc descobriu e também foram importantes.

A maioria das opções do compilador tem exatamente o mesmo nome. Os nomes das opções de aviso diferem. Isso pode ser irritante se você decidir usar -Wno-*opções para desativar os avisos. Você não poderá evitar a compilação condicional no make / cmake, até onde eu posso ver, mas não é difícil resolver isso.

Eu evitaria formatar o código com ferramentas automáticas. É irritante porque polui a saída da culpa. E as fusões de longa duração podem se tornar muito difíceis.

Martin Sugioarto
fonte