基於系統依賴圖(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提供了前端)。