Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 哪种静态分析工具用于扫描从一种方法到另一种方法的数据流?_Java_Static Analysis_Findbugs_Pmd - Fatal编程技术网

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
    被赋予接收器
  • 转换可以是任意函数,只要从为接收器生成数据的函数到从源接收数据的函数之间存在一系列调用。这些函数也可以采用任何其他参数,并用作黑盒

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

    更喜欢使用基于IDE的非Java API工具

    [编辑:]为了进一步澄清,
    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工具包。