Review of Java Static Analysis Tools
Here are some of the Java Static Analysis tools you should know about:
PMD integrates with several tools and editors, including Eclipse, NetBeans, IntelliJ IDEA, TextPad, Maven, Ant and Emacs.
Here’s a sample of what running PMD through some code looks like:
$ pmd pmd -R java-basic,java-unusedcode -d Deck.java /Users/pmd/my/project/Deck.java:35: Avoid unused private fields such as 'classVar2'. /Users/pmd/my/project/Deck.java:47: Avoid unused private fields such as 'instanceVar3'.
As the name implies, Checkstyle checks that your code adheres to a coding standard.
The tool is configurable, which makes it able to support different code style conventions. Two examples are the Sun Code Conventions and Google Java Style (although the one from Sun hasn’t been maintained since 1999).
Speaking of configuration, this is done in an XML file where you set which modules are to be used. Here’s a (tiny) example of a configuration file:
<module name="Checker"> <module name="NewlineAtEndOfFile"/> <module name="FileLength"/> </module>
Running this configuration against some code will result into something like this:
$ checkstyle -c checkstyle.xml Deck.java Starting audit... /Users/checkstyle/my/project/Blah.java:0: File does not end with a newline. /Users/checkstyle/my/project/Deck.java:23: Line has trailing spaces. /Users/checkstyle/my/project/Deck.java:70: Line has trailing spaces. Audit done. Checkstyle ends with 3 errors.
Patterns are separated into several categories: bad practice, correctness, malicious code vulnerability, multithreaded correctness, performance, security and dodgy code (two additional categories exist, with just a couple of patterns each: experimental and internationalization).
There are several ways of running FindBugs, but here’s what the command line interface can feel like:
$ findbugs -textui . M P UuF: Unused field: java.deck.Deck.classVar2 In Deck.java M P UuF: Unused field: java.deck.Deck.instanceVar3 In Deck.java M D UuF: Unused public or protected field: java.deck.Deck.instanceVar2 In Deck.java M D UuF: Unused public or protected field: java.deck.Deck.classVar1 In Deck.java M D UuF: Unused public or protected field: java.deck.Deck.instanceVar1 In Deck.java Warnings generated: 5
The first letter in the output refers to the severity of the (potential) bug (low, medium, high) and the second is the category (in this case P for Performance and D for Dodgy Code).
It integrates with Eclipse, Maven, Netbeans, Jenkins, Hudson and IntelliJ.
FindBugs supports a plugin architecture that allows anyone to add new bug detectors; which brings us to…
Find Security Bugs
There’s also other common things such as hashing methods and DOS vulnerabilities, not forgetting simpler things such as hard coded passwords.
As with similar tools in different languages, these Java Static Analysis tools complement each other, and we do recommend that you check them out if you care about Code Quality and avoiding technical debt.
Both PMD and CheckStyle are already integrated with Codacy, which means you can start using them right now.
Using Codacy means you’ll get all of these analyses done for you automatically every time you do a commit, plus a list of issues that are expansible to reveal additional detail on the particular problem and how to solve it.
Integrating your repository with Codacy will also give you a good overview of the status of your project: