A program slicer for Java, based on the system dependence graph (SDG). Program slicing is a software analysis technique to extract the subset of statements that are relevant to the value of a variable in a specific statement (the slicing criterion). The subset of statements is called a slice, and it can be used for debugging, parallelization, clone detection, etc. This repository contains two modules:
sdg-core
, a library that obtains slices from Java source code via the SDG, a data structure that represents statements as nodes and their dependencies as arcs.sdg-cli
, a command line client forsdg-core
, which takes as input a Java program and the slicing criterion, and outputs the corresponding slice.
Warning: all method calls must resolve to a method declaration. If your Java program requires additional libraries, their source code must be available and included in the analysis with the -i
option. Any method call that cannot be resolved will result in a runtime error.
JavaSDGSlicer manages its dependencies through maven, so you need to have the JDK (≥11) and Maven installed, then run
mvn package -Dmaven.test.skip
A fat jar containing all the project's dependencies can be then located at ./sdg-cli/target/sdg-cli-{version}-jar-with-dependencies.jar
.
The slicing criterion can be specified with the flag -c {file}#{line}:{var}
, where the file, line and variable can be specified. If the variable appears multiple times in the given line, all of them will be selected.
If we wish to slice following program with respect to variable sum
in line 11,
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);
}
}
The program can be saved to Example.java
, and the slicer run with:
java -jar sdg-cli.jar -c Example.java#11:sum
A more detailed description of the available options can be seen with:
java -jar sdg-cli.jar --help
Our slicer requires the input Java program to be compilable, so all libraries must be provided using the -i
flag. For the cases where the source code is not available, you may include the required libraries in the Java classpath by using the following call:
java -cp your-libraries.jar -jar sdg-cli.jar -c Example.java#11:sum
This approach produces lower quality slices, as the contents of the library calls are unknown.
A good usage example of sdg-core
to obtain a slice from source code is available at Slicer.java#slice(), where the following steps are performed:
- JavaParser is configured to (a) resolve calls in the JRE and the user-defined libraries, and to (b) ignore comments.
- The user-defined Java files are parsed to build a list of
CompilationUnit
s. - The SDG is created based on that list. The kind of SDG created depends on a flag.
- A
SlicingCriterion
is created, from the input arguments, and the slice is obtained. - The slice is converted to a list of
CompilationUnit
(each representing a file). - The contents of each
CompilationUnit
are dumped to their corresponding file.
If the graph is of interest, it can be outputted in dot
or PDF format via SDGLog#generateImages()
, as can be seen in PHPSlice.java#124 (this class presents a frontend for an unreleased web Java slicer).
- Parallel features: threads, shared memory, synchronized methods, etc.