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?
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.
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.
fonte
PMD é
fonte