Java 哪种静态分析工具用于扫描从一种方法到另一种方法的数据流?
假设我的库中有两种方法:Java 哪种静态分析工具用于扫描从一种方法到另一种方法的数据流?,java,static-analysis,findbugs,pmd,Java,Static Analysis,Findbugs,Pmd,假设我的库中有两种方法: void com.somepackage.SomeClass.someSink(字符串s) 及 int com.someotherpackage.SomeOtherClass.someSource(inti) 在我的代码中,第一个方法用作数据接收器,而第二个方法用作数据源。类型参数int,String仅作为示例给出,在实际情况下可能会发生变化 我想在满足以下特定模式的一些代码中检测这些方法的使用情况: 一些数据(比如x)是由源代码生成的 一些数据(例如y)是通过一系列转
void com.somepackage.SomeClass.someSink(字符串s)
及
int com.someotherpackage.SomeOtherClass.someSource(inti)
在我的代码中,第一个方法用作数据接收器,而第二个方法用作数据源。类型参数int,String
仅作为示例给出,在实际情况下可能会发生变化
我想在满足以下特定模式的一些代码中检测这些方法的使用情况:
x
)是由源代码生成的y
)是通过一系列转换f1(f2(…fn(x))
y
被赋予接收器someSink
和someSource
分别是类SomeSomeSome
和SomeOtherClass
中的任意方法名称。它们可能是静态的,也可能不是静态的,并且可能采用任意数量的参数(我应该能够定义)。参数的类型也不是任意的。唯一的要求是工具应扫描出现模式的代码和输出行号。因此,工具可能会以以下方式工作:
- 从用户处获取接收器和源名称(类的完全限定名和方法名)
- 静态地扫描代码并找到使用给定接收器和源的所有位置
- 检查是否存在通过一系列操作(运算符、方法)将源输出的某些数据直接或间接提供给接收器的路径
- 忽略不存在此类路径的源/汇,并输出剩余的源/汇(如果有)
MyClass1.java:12: value1 = com.someotherpackage.SomeOtherClass.someSource(...)
MyClass2.java:23: value2 = foo(value1, ...)
MyClass3.java:3: value3 = bar(value2)
MyClass4.java:22: com.somepackage.SomeClass.someSink(value3, ...)
注意:如果一个函数不带参数,但对数据有一些副作用,也需要考虑。(例如
a=source();void foo(){c=a+b};foo();sink(c)
是一个需要捕获的模式。)因此源方法和sink方法的作用只是x起源于源方法(某处)并且在目标方法中(某处)被消耗了吗?您如何描述“x”,或者您只是想要所有具有此属性的x
假设您已经在源方法中标识了一个特定的x,您是否a)坚持x只能通过方法调用传递给目标方法[这将使目标方法成为您调用链中的最后一个调用],还是可以复制一个中间值?b) 坚持每个函数调用只有一个参数
我们已经为大型C系统做了类似的事情。问题是跟踪一个赋值变量在其他函数中的用途,不管它们在什么地方,包括表示形式不同但意图相同的值(“抽象副本”;字符串“1.0”在抽象上等同于整数1,如果我最终使用字符串作为数字;“int_to_字符串”是“抽象副本”函数,该函数将一种表示形式中的值转换为另一种表示形式中的等效值。)
我们需要对每个函数进行到达定义分析(“特定赋值的值到哪里去了?”),以及“抽象副本”到达分析,确定标记为“抽象副本”的特殊函数在哪里使用到达值,以及abstract copy函数的结果到达哪里。然后计算“x到达z”和“x到达f(x)到达z”的传递闭包,其中x可以到达
我们使用我们的,提供通用解析和流分析机制的,和DMS的,为C实现特定到达和抽象副本到达计算的,DMS有一个计算到达定义;我们应该添加Abstract副本到达逻辑并重新实现传递闭包代码。在做了一些研究之后,我发现这最适合这种任务。
烟尘比其他开源替代品(如PQL)更成熟 你在描述什么是UML序列图吗?如果是,那么有很多工具(大部分是商业工具)可以实现这一点。它是序列图的一个子集,满足<代码>数据依赖性代码>标准。因此,您真正想要的是第二个类对第一个类有一些间接的数据依赖性?@IraBaxter这是正确的。我希望现有的静态分析工具具有足够的可扩展性,可以在查询或类似的东西中指定这一点,而不是从头开始编写。返回类型也可以是任何类型。我已经更新了我的问题。请让我知道这是否澄清了它。是否有DMS工具包的替代品?最好是开源的,有Java编译器API,还有Wala。它们可能具有一些流分析功能。但我认为您需要跨类中的方法进行流分析,我不确定它们为此提供了多少支持。我提供DMS是因为这是我所知道的,因为我们以前见过这种问题,我们打算用DMS这样的工具来支持它。如果有一个可以让我这样做的试用版,我想尝试一下DMS工具包。