哪种静态分析工具用于扫描从一种方法到另一种方法的数据流?

Jus*_*s12 6 java static-analysis findbugs pmd

假设我的库中有两种方法:

void com.somepackage.SomeClass.someSink(String s)

int com.someotherpackage.SomeOtherClass.someSource(int i)

第一种方法用作数据接收器,第二种方法用作我的代码中的数据源.类型参数int, String仅作为示例给出,并且可能在实际情况中改变.

我想在一些代码中检测这些方法的用法,这些代码满足下面给出的某种模式:

  1. 一些数据(比如说x)是由源生成的
  2. 一些数据(比如说y)是使用一系列转换生成的f1(f2(... fn(x))
  3. y 给了水槽.

只要存在从生成接收器数据的函数的调用序列到从源接收数据的函数,转换就可以是任意函数.这些函数也可以采用任何其他参数,并用作黑盒子.

扫描可以是源或字节码级别.有哪些工具可用于此类分析?

首选基于非IDE的工具和Java API.

[编辑:]澄清更多,someSinksomeSource分别是类SomeSome和语言中的任意方法名称SomeOtherClass.它们可能是也可能不是static,可以采用任意数量的参数(我应该能够定义).参数的类型也不是任意的.唯一的要求是该工具应扫描代码并输出模式出现的行号.所以这个工具可能会这样工作:

  • 从用户获取接收器和源名称(类和方法名称的完全限定名称).
  • 静态扫描代码并找到使用给定接收器和源的所有位置
  • 检查是否存在路径,其中某个数据源输出通过一系列操作(运算符,方法)直接或间接地接收.
  • 忽略那些不存在这样的路径的源/接收器并输出剩余的路径(如果有的话).

示例输出:

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, ...)
Run Code Online (Sandbox Code Playgroud)

注意:如果函数不接受参数但对数据有一些副作用,则还需要考虑.(示例a = source(); void foo(){ c = a+b }; foo(); sink(c)是需要捕获的模式.)

Jus*_*s12 4

经过一些研究,我发现烟灰最适合此类任务。Soot 比 PQL 等其他开源替代方案更成熟。