java static-analysis findbugs pmd

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



static-analysis (3)

Estoy usando ambos. Creo que se complementan.

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

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

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

Hubo una pregunta que comparaba 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 el código fuente, mientras que FindBugs funciona en los archivos compilados bytecode. Pero en términos de capacidades, ¿debería ser una elección de ambos o se complementan entre sí?


La mejor característica de PMD es sus reglas XPath , junto con un diseñador de reglas que le permite 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 potente de lo normal, 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 resulta en un tiempo de ejecución O (n ^ 2), que podría evitarse fácilmente. Usé PMD para construir una consulta ad-hoc , para revisar otras instancias de bucles anidados - // ForStatement / Statement // ForStatement. Esto señaló 2 instancias más del problema. Esta no es una regla genérica en absoluto.


PMD es

  • famoso
  • ampliamente utilizado en la industria
  • puedes agregar tus reglas en xml
  • le proporciona un análisis detallado de los niveles de errores y advertencias
  • 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.