システム依存グラフ(SDG)に基づくJavaのプログラムスライサー。プログラムスライスは、特定のステートメント(スライス基準)の変数の値に関連するステートメントのサブセットを抽出するソフトウェア分析手法です。ステートメントのサブセットはスライスと呼ばれ、デバッグ、並列化、クローン検出などに使用できます。このリポジトリには2つのモジュールが含まれています。
sdg-core 、SDGを介してJavaソースコードからスライスを取得するライブラリ、ノードとしてのステートメントとその依存関係をアークとして表すデータ構造です。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 -cli/target/sdg-cli- {version} jar-with-dependencies.jarに配置できます。
スライス基準は、flag -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 ClassPathに必要なライブラリを含めることができます。
java -cp your-libraries.jar -jar sdg-cli.jar -c Example.java#11:sum
このアプローチは、ライブラリコールの内容が不明であるため、低品質のスライスを生成します。
ソースコードからスライスを取得するためのsdg-coreの適切な使用例は、slicer.java#slice()で利用できます。ここで、次の手順が実行されます。
CompilationUnitのリストを作成するために解析されます。SlicingCriterionが作成され、スライスが取得されます。CompilationUnitのリスト(それぞれファイルを表す)に変換されます。CompilationUnitの内容は、対応するファイルにダンプされます。グラフが興味深い場合、phpslice.java#124で見ることができるように、 SDGLog#generateImages()を介してdotまたはPDF形式に出力できます(このクラスは未発表のWeb Javaスライサーのフロントエンドを提示します)。