适用于Java的跨类可扩展静态分析工具?

时间:2008-11-09 21:08:35

标签: java multithreading annotations static-analysis

我正在尝试编写用于检测带注释的多线程java程序中的一些错误的规则。作为玩具示例,我想检测是否有任何使用@ThreadSafe注释的方法调用没有这样注释的方法,而没有同步。我正在寻找一种可以让我编写这样一个测试的工具。

我查看了源分析器,比如CheckStyle和PMD,他们并没有真正的跨类分析功能。像FindBugs和JLint这样的字节码分析器似乎很难扩展。

我决定寻求更简单的解决方案,但也会遇到同样的困难:编写一个自定义规则来检查每个覆盖方法是否都使用@Override进行注释。

4 个答案:

答案 0 :(得分:3)

你试过FindBugs吗?它实际上支持一组annotations for thread safety(与Java Concurrency in Practice中使用的相同)。此外,您可以编写自己的自定义规则。我不确定你是否可以进行跨阶段分析,但我相信如此。

Peter Ventjeer有一个concurrency checking tool(使用ASM)来检测这样的内容。我不确定他是否公开发布,但他可以帮助你。

我相信用于线程安全的Coverity's静态/动态分析工具会像这样进行检查。

答案 1 :(得分:2)

你可以做cross-class analysis in PMD(虽然我从未将它用于此特定用途)。我认为可以使用他们记录的访客模式,但我会将具体内容留给您。

答案 2 :(得分:0)

检查注释的简单工具是apt(http://java.sun.com/j2se/1.5.0/docs/guide/apt/也是javax.annotation.processing中Java 6 api的一部分)但是这只有类型信息(即我找不到快速的方法来获取使用javax.lang.model api的继承层次结构,但是如果可以加载类,则可以使用反射获取该信息。

答案 3 :(得分:0)

尝试javap + regexes(例如Perl)