1 / 16

動的情報を利用した Java スライスシステム   ~メソッド間動的データ依存関係の適用 と ユーザインターフェース部の試作~

動的情報を利用した Java スライスシステム   ~メソッド間動的データ依存関係の適用 と ユーザインターフェース部の試作~. 藤井 将人 井上研究室. 背景. ソフトウェアの大規模化,複雑化 テスト工程のコストが増大 フォールトの検出・位置の特定・修正 フォールト位置の特定を効率よく行える一手法     プログラムスライス プログラムスライス: プログラム中の,ある変数に対して影響を与える文の集合. a=7. データ依存関係. 1: a=7; 2: b=m(a); 3: max=a; 4: if (a>b) 5: max=b;

agrata
Download Presentation

動的情報を利用した Java スライスシステム   ~メソッド間動的データ依存関係の適用 と ユーザインターフェース部の試作~

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 動的情報を利用したJavaスライスシステム  ~メソッド間動的データ依存関係の適用 と ユーザインターフェース部の試作~ 藤井 将人 井上研究室

  2. 背景 • ソフトウェアの大規模化,複雑化 • テスト工程のコストが増大 • フォールトの検出・位置の特定・修正 • フォールト位置の特定を効率よく行える一手法     プログラムスライス • プログラムスライス: プログラム中の,ある変数に対して影響を与える文の集合

  3. 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}

  4. Javaスライスシステム • システム概要 • 依存関係解析部 • DCスライス • データ依存関係解析:動的 • 制御依存関係解析:静的          + • メソッド間データ依存関係解析:動的 • メソッド間データ依存関係:   メソッド呼び出し文と各メソッドとの依存関係 • ユーザインターフェース(GUI)部 • スライス結果を表示

  5. ユーザインターフェース • スライス基準を指定し、スライス結果を表示 • 主な機能 • スライスにあたる文の背景に色を挿入 • GUI内からプログラムのコンパイル・実行が可能 • 複数のファイルにわたるプログラムに対応 開発言語:  Java サイズ:  約3100行

  6. 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(呼び出し経路)を特定できない問題

  7. 提案手法 • メソッド間データ依存関係解析を動的に行う • メソッド間データ依存関係:     メソッド呼び出し文と各メソッドとの依存関係 • アルゴリズム概要 • PDG構築時に,メソッド間データ依存辺に実行履歴(index)を付加する • indexに沿ってPDGを探索する

  8. 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

  9. 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); ・・ }

  10. Sortプログラム  再帰呼び出し  ループ 241行 評価実験 • 提案手法をJavaスライスシステムに実装 • 比較手法 • メソッド間依存辺にだけ履歴をつける手法(本提案手法) • すべての依存辺に履歴をつける手法(all) • 辺を引くたびにindexをインクリメントする • indexが小さい辺を探索 • 履歴をつけない手法(DCスライス)

  11. まとめと今後の課題 • まとめ • 動的にメソッド間データ依存関係を解析する手法の提案 • スライスシステムにおけるGUI部の試作 • 今後の課題 • 本提案手法の有効性の評価 • ループ・再帰呼び出しの存在するプログラムに対する解析の効率化

  12. スライスの有効性 • 拡張酒屋問題プログラムにおける,(941行)に対する スライス評価実験

  13. 実験結果 プログラム1  メソッド呼び出し 21行 プログラム2  ループ 32行

  14. 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); ・・ }

  15. GUI オープンファイル名    + 解析ファイル名 メニューバー ファイル ツールバー 実行結果 ファイル情報

More Related