基于系统依赖图(SDG)的Java的程序切片器。程序切片是一种软件分析技术,可提取与特定语句中变量值相关的语句的子集(切片标准)。语句的子集称为切片,可用于调试,并行化,克隆检测等。此存储库包含两个模块:
sdg-core ,一个通过SDG从Java源代码获取切片的库,该数据结构将语句表示为节点及其依赖项为ARC。sdg-cli ,可用于sdg-core的命令行客户端,它作为输入Java程序和切片标准,并输出相应的切片。警告:所有方法调用都必须解析为方法声明。如果您的Java程序需要额外的库,则必须将其源代码可用,并包含在-i选项的分析中。无法解决的任何方法调用都会导致运行时错误。
Javasdgslicer通过Maven管理其依赖性,因此您需要安装JDK(≥11)和Maven,然后运行
mvn package -Dmaven.test.skip
然后,一个包含所有项目依赖项的胖罐可以位于./sdg-cli/target/sdg-cli-{version}-jar-with-dependencies.jar {version} - jar-with-dependencies.jar。
可以用标志-c {file}#{line}:{var}指定切片标准,其中可以指定文件,行和变量。如果该变量在给定行中多次出现,则将选择所有变量。
如果我们希望在第11行中的可变sum下遵循程序,
public class Example {
public static void main(String[] args) {
int sum = 0;
int prod = 0;
int i;
int n = 10;
for (i = 0; i < 10; i++) {
sum += 1;
prod += n;
}
System.out.println(sum);
System.out.println(prod);
}
}
可以将程序保存到Example.java ,而切片机则运行:
java -jar sdg-cli.jar -c Example.java#11:sum
可以看到以下可用选项的更详细的描述:
java -jar sdg-cli.jar --help
我们的切片机要求输入Java程序是可编译的,因此必须使用-i标志提供所有库。对于不可用源代码的情况,您可以使用以下呼叫:
java -cp your-libraries.jar -jar sdg-cli.jar -c Example.java#11:sum
由于库呼叫的内容未知,因此这种方法会产生较低的质量切片。
可以从slicer.java#slice()获得sdg-core源代码可用于从源代码获得切片的一个很好的用法示例,其中执行以下步骤:
CompilationUnit列表s。SlicingCriterion ,并获得了切片。CompilationUnit列表(每个代表文件)。CompilationUnit的内容都倾倒到其相应的文件中。如果图表很感兴趣,则可以通过SDGLog#generateImages()以dot或pdf格式输出,如phpslice.java#124(此类为未发行的Web Java SliCer提供了前端)。