Quais ferramentas de análise estática C ++ de código aberto estão disponíveis? [fechadas]


301

Java possui ótimas ferramentas de análise estática de código aberto, como FindBugs , Checkstyle e PMD . Essas ferramentas são fáceis de usar, muito úteis, são executadas em vários sistemas operacionais e gratuitas .

Estão disponíveis produtos comerciais de análise estática em C ++. Embora esses produtos sejam ótimos, o custo é alto demais para os alunos e geralmente é bastante difícil obter a versão de teste.

A alternativa é encontrar ferramentas de análise estática C ++ de código aberto que serão executadas em várias plataformas (Windows e Unix). Usando uma ferramenta de código aberto, ela pode ser modificada para atender a determinadas necessidades. Encontrar as ferramentas não foi tarefa fácil.

Abaixo está uma pequena lista de ferramentas de análise estática do C ++ que foram encontradas ou sugeridas por outras pessoas.

Quais são algumas outras ferramentas portáteis de análise estática de C ++ de código aberto que alguém conhece e pode ser recomendado?

Alguns links relacionados.


Comercial, a DMS Software Reengineering Toolki, lida com Java, C, C ++ e COBOL, fornece análise, criação de AST, resolução de nome / tipo, análise de controle / fluxo de dados, análise e transformação personalizadas. Consulte semanticdesigns.com/Products/DMS/DMSToolkit.html .
219 Ira Ira Baxter

1
Para ferramentas comerciais, há também o CppDepend ( cppdepend.com ), e talvez a versão de avaliação possa ser suficiente para os alunos.

Respostas:


21

Oink é uma ferramenta criada sobre o front-end do Elsa C ++. O porco da Mozilla é um garfo da Elsa / Oink.

Veja: http://danielwilkerson.com/oink/index.html


1
Compilei mais de 1000 programas em minha vida, mas pelo amor de Deus não posso compilar este pacote, não importa o quê. Tentei usar o Fedora, Ubuntu, WSL, Cygwin, MSYS2, Windows - mas não. Sempre falta alguma coisa e a documentação é simplesmente horrível. Não me interpretem mal, acho que a ferramenta é excelente. Mas o site e a documentação parecem que ninguém os tocou em 10 a 15 anos.
Apache

73

O CppCheck é de código aberto e multiplataforma.

Mac OS X:

brew install cppcheck

1
@gio eu não vi nenhum problema pessoalmente. Acredito que o CppCheck tem a capacidade de ignorar ou excluir determinados caminhos ou arquivos, o que ajuda a diminuir o escopo.
Soo Wei Tan

1
No Windows:choco install cppcheck
KindDragon

53

Com relação ao compilador GNU, o gcc já possui uma opção embutida que permite avisos adicionais aos do -Wall. A opção é -Weffc ++ e trata das violações de algumas diretrizes de Scott Meyers publicadas em seus livros " C ++ eficaz e mais eficaz ".

Em particular, a opção detecta os seguintes itens:

  • Defina um construtor de cópia e um operador de atribuição para classes com memória alocada dinamicamente.
  • Prefira inicialização à atribuição em construtores.
  • Torne os destruidores virtuais nas classes base.
  • Faça com que "operator =" retorne uma referência a * this.
  • Não tente retornar uma referência quando precisar retornar um objeto.
  • Distinga entre formas de prefixo e postfix de operadores de incremento e decremento.
  • Nunca sobrecarregue "&&", "||" ou ",".

7
Além de -Wall e -Weffc ++, do gcc, o -Wextra faz algumas boas análises estáticas gratuitas, por exemplo, ramificações que não retornam um valor ou verificam um sinal não assinado por ser menor que zero. É notável a forma como muitas vezes programadores profissionais acho que o último é uma boa idéia ...
flash Sheridan

24
Eca, -Weffc++adverte sobre toneladas de construções perfeitamente perfeitas em uma grande base de código. Eu segundo a sugestão de -Wextra, no entanto; não saia de casa sem ele!
Tom

29

Em desenvolvimento por enquanto, mas o clang faz análise C e tem como objetivo lidar com C ++ ao longo do tempo. Faz parte do projeto LLVM .

Atualização : Embora a página de destino diga "O analisador é um trabalho contínuo em andamento", ela agora está documentada como um analisador estático para C e C ++.

Pergunta: Como executar o GCC / Clang para análise estática? (apenas avisos)

Opção do compilador: -fsyntax-only


1
O LLVM é um projeto muito interessante que, comparado ao gcc, gera mais binários otimizados em menos tempo; e clang, quando concluída, será o seu front-end ...
Nicola Bonelli

Outro editor adicionou as informações na opção -fsyntax-only. Apenas observe que é essencialmente uma solicitação para executar a análise que o compilador executaria sem realmente compilar e emitir os avisos. Não tenho certeza, mas acho que isso é diferente da análise estática.
Don Wakefield

17

Outra pessoa mencionou -Weffc ++, mas esse é realmente um dos únicos avisos do GCC que eu não ative por padrão. No entanto, o conjunto de avisos que ativo é a ferramenta de análise estática mais importante no meu kit. Você pode ver a lista completa de avisos recomendados .

Em suma:

-pedantic -Wall -Wextra -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Formato = 2 -Winit-self -Wlogical-op -Wmissical-declarações -Wmissing-include-dirs -Wnoexcept -Wold -style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-conversion -Wsign-promo -Wstrict-null-sentinel -Wstrict-overflow = 5 -Wswitch-default -Wundef -Werror -Wno-unused

Observe que alguns deles exigem uma nova versão do gcc, portanto, pode ser necessário eliminá-los da sua lista se você estiver preso no 4.5 ou algo assim.



7

Se por código aberto você realmente quis dizer "gratuito", a análise pré-moldada da Microsoft é boa. Somente para Windows, é claro. É totalmente integrado ao Visual Studio e ao compilador. por exemplo:

cl /analyze Sample.cpp

Em qual versão e edição está disponível?
Twk #

Parece estar embutido no compilador, que é gratuito. A integração é provavelmente apenas na edição de equipe.
JBRWilkinson


4

Splint parece preencher a conta para C.

Se você não especificou o código aberto, eu diria o PCLint da Gimpel Software é provavelmente uma das melhores ferramentas disponíveis para verificação de código estático em C ++. Mas, é claro, não é de código aberto.

Mac OS X:

brew install splint

2
Mas caro para um único desenvolvedor :) Eu gosto livre melhor
Robert Gould

6
splint é para C, não para C ++. Não sei se eles planejam expandir a cobertura ou não. Espero que sim!
Harold Bamford

Sim, pclint vale a pena tentar, sua contraparte no unix é chamada flexe-lint, a versão 9.0 é mais rápida que a versão 8.x, a versão 9.0 também suporta cabeçalho pré-compilado para acelerar a análise. Leva tempo para você domesticar o pc-lint, ele possui um falso positivo, o que pode causar problemas se você não puder ignorá-lo seletivamente.
Zhaorufei

3

O PREFast da Microsoft também está disponível no Windows Driver Kit. A versão 7.0 pode ser baixada aqui .

Os documentos da Microsoft afirmam que ele deve ser executado apenas no código do driver, mas este (antigo) post do blog estabelece etapas para executá-lo. Talvez ele possa ser integrado a um processo normal de compilação?


O PREFast reduzirá bastante o processo de compilação, para qualquer projeto real, o servidor de compilação talvez não possa pagar.
Zhaorufei

@zhaorufei: A maioria das análises estáticas não é "rápida"; eles têm um trabalho bastante complexo de análise de código, por definição. Se você não gosta do custo de construção o tempo todo, basta torná-lo opcional.
Ira Baxter

2

Estamos trabalhando em um plug-in do Eclipse CDT chamado metriculator. Ainda está em desenvolvimento, mas algumas métricas importantes (por exemplo, LSLOC, McCabe, EfferentCoupling) já estão implementadas.

Consulte http://sinv-56013.edu.hsr.ch/redmine/projects/metricular/wiki/Documentation para obter mais detalhes, como demonstração e documentação em vídeo.

A última versão noturna está disponível para instalação no site de atualização em: http://sinv-56013.edu.hsr.ch/metriculator/updatesite-nightly/site/

Descrição adicional

O Metriculator analisa estaticamente o código fonte C ++ e gera métricas de software. As métricas são implementadas como verificadores Codan. Os resultados da análise podem ser explorados em uma visão separada. Cada métrica possui propriedades configuráveis ​​(por exemplo, um limite para 'linhas máximas de código por função'). Exceder esse limite relatará um problema e criará um marcador no editor de código-fonte.

Com o metriculator, você pode:

  • analisar arquivos / pastas / projetos em C ++
  • defina limites de métricas e ative / desative a métrica usando a página de preferências do Codans
  • possui marcadores de problemas nos editores de código-fonte
  • explorar resultados de métricas
  • exportar resultados de métricas como nuvem de tags (disponível como recurso opcional no site de atualização)

Atualmente, o metriculator vem com as seguintes métricas:

  • McCabe (Complexidade Ciclomática)
  • Acoplamento eferente por tipo
  • Linhas de código de origem lógica
  • Número de membros por tipo
  • Número de parâmetros por função

1

Você deve tentar oo-browser, ele tem uma integração incrível com o xemacs


1

Também é possível codificar extensões do GCC no MELT (uma linguagem específica do domínio projetada para estender o GCC) ou plug-ins do GCC em C (muito mais difícil) para fazer uma análise personalizada.


2
Já li um dos PDF sobre MELT e estendendo o gcc com o derretimento, meu sentimento é que ainda é muito complexo / difícil adicionar seus próprios plugins ao gcc. Maneira não prática para o usuário comum.
Zhaorufei

1
A extensão do GCC é complexa, da maneira que você faz (através de plugins C, através do MELT ou até do Python). Isso ocorre porque o GCC é complexo. E personalizar qualquer ferramenta de análise estática do C ++ é difícil, porque a especificação da linguagem C ++ é muito complexa e você precisará lidar com a maior parte dessa complexidade (qualquer programa C ++ não trivial usa muitos recursos do C ++, talvez através da biblioteca padrão do C ++) .
Basile Starynkevitch

0

O Doxygen realiza algumas análises de fluxo de controle e gera gráficos. Pode não ser o que você está procurando, mas eu os encontrei úteis para olhar.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.