假设我的库中有两种方法:
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 的工具。
[编辑:] 澄清更多,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)
是需要捕获的模式。)