从理论上讲,使用静态分析工具证明Java代码没有竞争条件吗?

时间:2012-04-25 16:05:04

标签: java multithreading theory static-analysis race-condition

无论市场上有哪些静态分析工具,理论上是否可以使用静态分析工具证明Java(或任何其他命令式语言)代码没有竞争条件?

3 个答案:

答案 0 :(得分:4)

声明“Java代码没有竞争条件”是非常模糊的。也许你的意思是其中之一:

  • 静态分析工具可以证明没有Java程序有竞争条件吗?显然不是,因为存在具有竞争条件的Java程序。

  • 静态分析工具总是可以证明无竞争条件的Java程序没有竞争条件吗?不,因为这等同于解决暂停问题(在循环之后放置一个静态竞争条件,可能会或可能不会终止。要判断竞争是否真的发生,你需要知道循环是否终止)。

  • 静态分析工具有时可以证明无竞争条件的Java程序没有竞争条件吗?是。事实上,这样的工具可能非常有用。

答案 1 :(得分:2)

这只是我的直觉,但我会说不,至少对于一般的Java程序。要证明某些程序没有竞争条件应该不会太难(通常,任何单线程程序,并且识别单线程并不难)。但要为所有 Java程序做出决定?我怀疑Java的并发模型太不受限制了。

我认为有可能证明在任意Java代码中决定缺少竞争条件等同于halting problem,因为有些东西(最明显是公共静态字段)可以被所有线程隐式访问,并且它们可以通过反射访问,任意复杂的代码确定用于查找它们的字符串。

答案 2 :(得分:0)

这应该可以使用像spin这样的modelchecker(http://spinroot.com/spin/whatispin.html)。

但是,您需要创建从java到模型语言的转换,并且这种模型检查在计算上非常昂贵(包括占用大量内存),因此其可行性是另一个问题。

如其他答案中所述,对于特别复杂的代码来说,适当的建模可能是困难的或不可能的,这些代码模糊了实际调用或数据成员访问。但是,对于合理的代码,这实际上不应该在数学上是不可能的(而不是真的很慢)。

考虑到代码外部的任何特定竞争条件也是不可能的 - 因此,如果存在真正的竞争条件风险,那么将某些东西建模为非原子的原子IO操作将导致无效模型。