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

标签 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 被提供给接收器。

转换可以是任意函数,只要从为接收器生成数据的函数到从源接收数据的函数之间存在一系列调用即可。这些函数也可以采用任何其他参数,并用作黑盒。

扫描可以在源代码或字节码级别进行。有哪些工具可用于此类分析?

首选带有 Java API 的非基于 IDE 的工具。

[EDIT:] 为了更清楚地说明,someSinksomeSource 是类 SomeSomeSomeOtherClass 中的任意方法名称> 分别。它们可能是也可能不是 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/

相关文章:

findbugs - 轻松在 (Java) 静态代码分析工具中编写自定义规则

java - FindBugs 拒绝在类路径上找到 bcel jar

java - 没有获取 PLAY_LANG 的正确值

java - JComboBox 单元渲染器在 Windows 外观和感觉下失败

java - 将应用程序根目录 ("/")映射到我的上下文根目录

gradle - Findbugs:Gradle-仅在高优先级问题上失败

java - 从通用类型参数中检索高级信息

php - 有没有好的php库可以将html/php文档转换成对象

qt - 如何识别 QML 中未使用的代码和文件

c++ - 如何创建包含每个函数的 LOC 的列表 (C++)