¿Cuáles son las diferencias entre PMD y FindBugs?

107

Hubo una pregunta comparando PMD y CheckStyle . Sin embargo, no puedo encontrar un buen desglose de las diferencias / similitudes entre PMD y FindBugs. Creo que una diferencia clave es que PMD funciona en código fuente, mientras que FindBugs funciona en archivos de código de bytes compilados. Pero en términos de capacidades, ¿debería ser una opción o se complementan entre sí?

Thomas Owens
fuente

Respuestas:

151

Estoy usando ambos. Creo que se complementan.

Como dijiste, PMD funciona en el código fuente y, por lo tanto, encuentra problemas como: violación de las convenciones de nomenclatura, falta de llaves, verificación nula mal colocada, lista de parámetros larga, constructor innecesario, interrupción faltante en el interruptor, etc. PMD también te informa sobre Cyclomatic complejidad de su código que encuentro muy útil (FindBugs no le informa acerca de la complejidad ciclomática).

FindBugs funciona en . Estos son algunos problemas que FindBugs encuentra que PMD no detecta: el método equals () falla en los subtipos, el método clon puede devolver un valor nulo, comparación de referencia de valores booleanos, conversión imposible, int de 32 bits desplazado por una cantidad que no está en el rango de 0-31, una colección que se contiene a sí misma, método equals siempre devuelve verdadero, un bucle infinito, etc.

Por lo general, cada uno de ellos encuentra un conjunto diferente de problemas. Utilice ambos. Estas herramientas me enseñaron mucho sobre cómo escribir un buen código Java.

Snakile
fuente
¿Cuál es el código de error específico que vio cuando una colección se contiene a sí misma y por qué FindBugs lo marcó como un error probable?
Geek
bueno, ya que Sonarqube 6.3 ya no ... Sonarqube necesita ahora Java 8 y Findbugs solo es compatible con Java 7 todavía
Markus
22

La mejor característica de PMD son sus Reglas XPath , incluidas con un Diseñador de reglas para permitirle construir fácilmente nuevas reglas a partir de ejemplos de código (similar a los constructores de GUI de RegEx y XPath). FindBugs es más fuerte de inmediato, pero la construcción de reglas y patrones específicos del proyecto es muy importante.

Por ejemplo, encontré un problema de rendimiento que involucraba 2 bucles for anidados, lo que resultó en un tiempo de ejecución de O (n ^ 2), que podría evitarse fácilmente. Usé PMD para construir una consulta ad-hoc , para revisar otras instancias de bucles for anidados - // ForStatement / Statement // ForStatement. Esto señaló 2 casos más del problema. Esta no es una regla genérica en absoluto.

Dekel
fuente
2

PMD es

  • famoso
  • utilizado ampliamente en la industria
  • puedes agregar tus reglas en xml
  • le ofrece un análisis detallado en los niveles de errores y niveles de advertencia
  • también puede escanear su código para "copiar y pegar líneas". Código duplicado. Esto da una buena idea sobre la implementación de java oops.
kunal saxena
fuente
No habla con FindBugs; son complementarios ya que sus conjuntos de problemas no son idénticos.
Stevers