假设我的库中有两种方法:
void com.somepackage.SomeClass.someSink(String s)
和
int com.someotherpackage.SomeOtherClass.someSource(int i)
在我的代码中,第一种方法用作数据接收器,而第二种方法用作数据源。类型参数int、String
只是举例,实际情况可能会有所变化。
我想在满足下面给出的特定模式的某些代码中检测这些方法的用法:
- 一些数据(比如
x
)是由源生成的 - 一些数据(例如
y
)是使用一系列转换生成的f1(f2(... fn(x))
y
被提供给接收器。
转换可以是任意函数,只要从为接收器生成数据的函数到从源接收数据的函数之间存在一系列调用即可。这些函数也可以采用任何其他参数,并用作黑盒。
扫描可以在源代码或字节码级别进行。有哪些工具可用于此类分析?
首选带有 Java API 的非基于 IDE 的工具。
[EDIT:] 为了更清楚地说明,someSink
和 someSource
是类 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, ...)
注意:如果一个函数不带参数但对数据有一些副作用也需要考虑。 (示例 a = source(); void foo(){ c = a+b }; foo(); sink(c)
是需要捕获的模式。)
最佳答案
经过一些研究,我发现 soot最适合这种任务。 Soot 比 PQL 等其他开源替代方案更成熟。
关于java - 哪种静态分析工具用于扫描从一种方法到另一种方法的数据流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10473785/