160 likes | 277 Views
動的情報を利用した Java スライスシステム ~メソッド間動的データ依存関係の適用 と ユーザインターフェース部の試作~. 藤井 将人 井上研究室. 背景. ソフトウェアの大規模化,複雑化 テスト工程のコストが増大 フォールトの検出・位置の特定・修正 フォールト位置の特定を効率よく行える一手法 プログラムスライス プログラムスライス: プログラム中の,ある変数に対して影響を与える文の集合. a=7. データ依存関係. 1: a=7; 2: b=m(a); 3: max=a; 4: if (a>b) 5: max=b;
E N D
動的情報を利用したJavaスライスシステム ~メソッド間動的データ依存関係の適用 と ユーザインターフェース部の試作~ 藤井 将人 井上研究室
背景 • ソフトウェアの大規模化,複雑化 • テスト工程のコストが増大 • フォールトの検出・位置の特定・修正 • フォールト位置の特定を効率よく行える一手法 プログラムスライス • プログラムスライス: プログラム中の,ある変数に対して影響を与える文の集合
a=7 データ依存関係 1: a=7; 2: b=m(a); 3: max=a; 4: if (a>b) 5: max=b; 6: print(max); m1: int m(int x){ m2: return x-3} 1: a=7; 2: b=m(a); 3: max=a; 4: if (a>b) 5: max=b; 6: print(max); m1: int m(int x){ m2: return x-3} b=m(a) a=7 制御依存関係 b=m(a) if (a>b) max=a; if (a>b) max=b print(max) max=b print(max) m(int x) m(int x) return x-3 return x-3 プログラムスライス計算手順 • 依存関係解析 • データ依存関係解析 • 制御依存関係解析 • プログラム依存グラフ(PDG)構築 • 節点: 文,条件節 • 辺: 節点間の依存関係 • PDG探索 • スライス基準に対応する節点から辺を逆向きにたどる 1: a=7; 2: b=m(a); 3: max=a; 4: if (a>b) 5: max=b; 6: print(max); m1: int m(int x){ m2: return x-3}
Javaスライスシステム • システム概要 • 依存関係解析部 • DCスライス • データ依存関係解析:動的 • 制御依存関係解析:静的 + • メソッド間データ依存関係解析:動的 • メソッド間データ依存関係: メソッド呼び出し文と各メソッドとの依存関係 • ユーザインターフェース(GUI)部 • スライス結果を表示
ユーザインターフェース • スライス基準を指定し、スライス結果を表示 • 主な機能 • スライスにあたる文の背景に色を挿入 • GUI内からプログラムのコンパイル・実行が可能 • 複数のファイルにわたるプログラムに対応 開発言語: Java サイズ: 約3100行
B(){ ・・ c=M(b); ・・ } A(){ ・・ k=g; a=M(k); print(a); ・・ } int M(int x){ ・・ return m; } B(){ ・・ c=M(b); ・・ } A(){ ・・ k=g; a=M(k); print(a); ・・ } A(){ ・・ k=g; a=M(k); print(a); ・・ } int M(int x){ ・・ return m; } int M(int x){ ・・ return m; } 依存関係の存在しない, メソッドBもスライスに含まれる Calling-Contextを考慮した解析を行うことで, スライスサイズを削減できる 手法提案の背景 • Calling-Context(呼び出し経路)を特定できない問題
提案手法 • メソッド間データ依存関係解析を動的に行う • メソッド間データ依存関係: メソッド呼び出し文と各メソッドとの依存関係 • アルゴリズム概要 • PDG構築時に,メソッド間データ依存辺に実行履歴(index)を付加する • indexに沿ってPDGを探索する
index=4 index=9 index=5 index=6 main(){ ・・ g=5; A(); B(); ・・ } A(){ ・・ k=g; a=M(k); print(a); ・・ } A(){ ・・ k=g; a=M(k); print(a); ・・ } A(){ ・・ k=g; a=M(k); print(a); ・・ } int M(int x){ ・・ return m; } 4 5 8 6 9 7 履歴付加アルゴリズム • indexを用意 1.呼び出し,returnのたびに依存辺にindexをインクリメントして付加 2.他のメソッドの変数を直接参照するときはindexをインクリメントせずに付加 index=3 main(){ ・・ g=5; A(); B(); ・・ } main(){ ・・ g=5; A(); B(); ・・ } A(){ ・・ k=g; a=M(k); print(a); ・・ } int M(int x){ ・・ return m; } int M(int x){ ・・ return m; } B(){ ・・ c=M(b); ・・ } 4
main(){ ・・ g=5; A(); B(); ・・ } main(){ ・・ g=5; A(); B(); ・・ } A(){ ・・ k=g; a=M(k); print(a); ・・ } A(){ ・・ k=g; a=M(k); print(a); ・・ } A(){ ・・ k=g; a=M(k); print(a); ・・ } int M(int x){ ・・ return m; } B(){ ・・ c=M(b); ・・ } 4 5 8 8 4 6 9 9 7 7 スライスに含まれない=Calling-Context解決 履歴付きPDG探索アルゴリズム • index値に沿って探索 • 探索可能な依存辺のうち,最後にたどった履歴付き依存辺のindex値より小さく,かつ最大値をもつような依存辺だけをたどる int M(int x){ ・・ return m; } B(){ ・・ c=M(b); ・・ }
Sortプログラム 再帰呼び出し ループ 241行 評価実験 • 提案手法をJavaスライスシステムに実装 • 比較手法 • メソッド間依存辺にだけ履歴をつける手法(本提案手法) • すべての依存辺に履歴をつける手法(all) • 辺を引くたびにindexをインクリメントする • indexが小さい辺を探索 • 履歴をつけない手法(DCスライス)
まとめと今後の課題 • まとめ • 動的にメソッド間データ依存関係を解析する手法の提案 • スライスシステムにおけるGUI部の試作 • 今後の課題 • 本提案手法の有効性の評価 • ループ・再帰呼び出しの存在するプログラムに対する解析の効率化
スライスの有効性 • 拡張酒屋問題プログラムにおける,(941行)に対する スライス評価実験
実験結果 プログラム1 メソッド呼び出し 21行 プログラム2 ループ 32行
main(){ ・・ g=5; A(); B(); ・・ } A(){ ・・ k=g; a=M(k); print(a); ・・ } A(){ ・・ k=g; a=M(k); print(a); ・・ } int M(int x){ ・・ return m; } int M(int x){ ・・ return m; } B(){ ・・ c=M(b); ・・ } 呼び出し経路を特定できないため, メソッドBも探索される Calling-Contextを考慮した解析を行うことで, スライスサイズを削減できる 手法提案の背景 • Calling-Context問題: main(){ ・・ g=5; A(); B(); ・・ } A(){ ・・ k=g; a=M(k); print(a); ・・ } int M(int x){ ・・ return m; } B(){ ・・ c=M(b); ・・ }
GUI オープンファイル名 + 解析ファイル名 メニューバー ファイル ツールバー 実行結果 ファイル情報