有没有用于执行Scala代码静态分析的工具?

46

是否有类似于Java的FindBugs和PMD或C/C++的Splint用于对Scala代码进行静态分析的工具?我知道FindBugs适用于编译Java产生的字节码,因此我很好奇它如何在Scala上工作。

截至2009年10月27日的Google搜索结果很少。

截至2010年2月1日的Google搜索结果只有这个问题。


1
除了编译器已经查找的错误之外,还有哪些类型的错误? - James Black
1
不是真的 - 编译器能找到的我也能轻松找到。我要找的是“死代码”,不必要的初始化变量等。要进行更多的静态分析,请查看http://findbugs.sourceforge.net/。 - Roman Kagan
1
祝你在寻找中好运,但是像FindBugs这样的分析工具需要大量的工作,而Scala可能还太年轻,尚未有类似的工具。 - Pascal Cuoq
2
@Pascal - Scala于2003年首次发布:现在已经6岁了! - oxbow_lakes
5
@Pascal FindBugs 在 JVM 字节码级别工作,因此它应该也可以与 Scala 一起使用。 - Walter Chang
显示剩余4条评论
9个回答

20

FindBugs分析JVM字节码,不考虑生成字节码的工具。我尝试使用FindBugs检查由Scala生成的.class文件。不幸的是,即使对于微不足道的Scala程序,FindBugs也产生了许多警告。


1
由于其专注于Java SDK特定事项,因此它并不适用于Scala,尽管存在大量的误报(在我看来)。 - sksamuel

17

现在有一个名为Scalastyle的工具,它可以完成Java中Checkstyle工具的任务。这不仅包括格式检查,还包括一些针对已知错误源的检查,例如实现了hashCode()但未实现equals()方法的类。

目前大约有40个检查,但我们一直在添加更多检查。

欲了解更多信息,请访问www.scalastyle.org


16

8
这里是截至2014年8月的更新答案,适用于一些与Scala相关或适用于Scala的工具。
个人认为,JVM或Java的工具往往会产生过多的误报,或者只针对Java特定的类进行检查。例如,由于在Scala中我们不倾向使用Java集合,因此所有findbugs基于集合的检查都是不必要的。另一个例子是针对静态字段使用的检查,在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

7

Findbugs和其他基于字节码的工具可以发挥作用,它们可以发现代码中的错误。但不幸的是,基于字节码的方法已经针对javac编译器的输出进行了调整,这意味着它们很可能会产生非常高的误报率,并且会忽略基本问题,因为Scala将生成与javac编译器不同的习语。


3

1

1

-2

我对Scala不是很了解,但如果它与Java兼容,Klocwork的Solo产品可能适用。您可以在此处找到Klocwork Solo


2
为什么这是被接受的答案?我找不到任何证据表明 Klocwork 可以“解决”运行 Findbugs 时遇到的问题...? - p3t0r

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接