Are there any tools for performing static analysis of Scala code? [closed]

Solution 1:

FindBugs analyzes JVM byte codes, regardless of the tool that generated them. I've tried using FindBugs to check .class files generated by Scala. Unfortunately, FindBugs produced many warnings, even for trivial Scala programs.

Solution 2:

There is now Scalastyle which does the job that Checkstyle does for Java. This includes not only formatting checks, but also some checks for known sources of bugs, such as a class which implements hashCode() but not equals.

There are currently about 40 checks, but we're adding them all of the time.

For more information, see www.scalastyle.org.

Solution 3:

There is some work going on in that direction. Some links:

  • https://github.com/alacscala/scala-corpus
  • https://github.com/alacscala/alacs
  • https://bitbucket.org/jmhofer/findbugs4sbt/wiki/Home

There is also a discussion on scala mail list, archive available here.

Solution 4:

Here is an updated answer as of August 2014 for some that are aimed or work well with Scala.

Personally I think the JVM or Java ones end up with far too many false positives, or have inspections that are aimed mostly at Java specific classes. For example, since in Scala we don't tend to use the Java Collections, all the findbugs collection based inspections are not needed. Another example is the inspections for use of static fields which are irrelevant in Scala.

  • Scalastyle https://github.com/scalastyle/scalastyle
  • Scapegoat https://github.com/sksamuel/scalac-scapegoat-plugin
  • Wart remover https://github.com/typelevel/wartremover
  • Linter https://github.com/HairyFotr/linter
  • CPD https://github.com/sbt/cpd4sbt

Solution 5:

Findbugs and other tools that are bytecode based will work, in the sense that they will find faults in your code. Unfortunately, the bytecode based approaches have been tuned against the output of the javac compilers, meaning they are likely to produce very high false positive rates, and miss basic issues, because Scala will be producing different idioms than the javac compiler.