Quais são as diferenças entre PMD e FindBugs?


107

Houve uma pergunta comparando PMD e CheckStyle . No entanto, não consigo encontrar uma boa análise das diferenças / semelhanças entre PMD e FindBugs. Acredito que a principal diferença é que o PMD funciona no código-fonte, enquanto o FindBugs funciona em arquivos de bytecode compilados. Mas em termos de capacidades, deve ser uma escolha ou / ou elas se complementam?

Respostas:


151

Estou usando os dois. Eu acho que eles se complementam.

Como você disse, o PMD funciona no código-fonte e, portanto, encontra problemas como: violação das convenções de nomenclatura, falta de chaves, verificação de nulos perdida, lista longa de parâmetros, construtor desnecessário, falta de interrupção no switch etc. O PMD também informa sobre o Ciclomático complexidade de seu código, que considero muito útil (FindBugs não fala sobre a complexidade Cyclomatic).

FindBugs funciona em bytecode. Aqui estão alguns problemas que FindBugs encontra que PMD não encontra: método equals () falha em subtipos, método clone pode retornar nulo, comparação de referência de valores booleanos, conversão impossível, 32 bits int deslocado por uma quantidade não na faixa de 0-31, uma coleção que contém a si mesma, o método equals sempre retorna verdadeiro, um loop infinito, etc.

Normalmente, cada um deles encontra um conjunto diferente de problemas. Use ambos. Essas ferramentas me ensinaram muito sobre como escrever um bom código Java.


Qual é o código de erro específico que você viu quando uma coleção se contém e por que isso foi marcado como um provável bug pelo FindBugs?
Geek

bem, pois o Sonarqube 6.3 não é mais ... O Sonarqube precisa agora do Java 8 e o Findbugs só oferece suporte ao Java 7 ainda
Markus

22

O melhor recurso do PMD são suas Regras XPath , agrupadas com um Designer de Regras para permitir que você construa facilmente novas regras a partir de amostras de código (semelhantes aos construtores RegEx e XPath GUI). FindBugs é mais forte logo que sai da caixa, mas construir regras e padrões específicos para o projeto é muito importante.

Por exemplo, encontrei um problema de desempenho envolvendo 2 loops for aninhados, resultando em um tempo de execução O (n ^ 2), que poderia ser facilmente evitado. Usei PMD para construir uma consulta ad-hoc , para revisar outras instâncias de loops for aninhados - // ForStatement / Statement // ForStatement. Isso apontou mais 2 instâncias do problema. Esta não é uma regra genérica.


2

PMD é

  • famoso
  • amplamente utilizado na indústria
  • você pode adicionar suas regras em xml
  • fornece uma análise detalhada em níveis de erros e níveis de aviso
  • você também pode escanear seu código para "copiar e colar linhas". Código duplicado. Isso dá uma boa ideia sobre como implementar java oops.

Não fala com FindBugs; eles são complementares, pois seus conjuntos de problemas não são idênticos.
Stevers
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.