静的情報と動的情報を用いた プログラムスライス計算法

Slides:



Advertisements
Similar presentations
©2008 Ikuo Tahara探索 状態空間と探索木 基本的な探索アルゴリズム 横形探索と縦形探索 評価関数を利用した探索アルゴリズム 分岐限定法 山登り法 最良優先探索 A ( A* )アルゴリズム.
Advertisements

シーケンス図の生成のための実行履歴圧縮手法
XHTML構文検証手法における スクリプト要素の静的解析アルゴリズム
シーケンシャルパターンマイニングに基づくオブジェクト指向プログラムのための 欠陥検出手法
プログラミング言語としてのR 情報知能学科 白井 英俊.
プログラムの動作を理解するための技術として
Observable modified Condition/Decision coverage
F11: Analysis III (このセッションは論文2本です)
ベイズ基準によるHSMM音声合成の評価 ◎橋本佳,南角吉彦,徳田恵一 (名工大).
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
演算/メモリ性能バランスを考慮した マルチコア向けオンチップメモリ貸与法
プログラム静的解析手法の効率化と 解析フレームワークの構築に関する研究
大阪大学 大学院基礎工学研究科 情報数理系専攻 ソフトウェア科学分野 高田 智規
Java ソフトウェア部品検索システム SPARS-J のための リポジトリ自動更新機能の実現
Occam言語による マルチプリエンプティブシステムの 実装と検証
型付きアセンブリ言語を用いた安全なカーネル拡張
プログラム依存グラフを利用した 情報漏洩解析手法の提案と実現
動的スライスを用いた バグ修正前後の実行系列の比較
動的依存グラフの3-gramを用いた 実行トレースの比較手法
ポインタ解析におけるライブラリの スタブコードへの置換の効果
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
インラインスクリプトに対するデータフロー 解析を用いた XHTML 文書の構文検証
動的情報を利用したソフトウェア 部品評価手法
動的スライスを用いたバグ修正前後の実行系列の差分検出手法
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
実行時情報に基づく OSカーネルのコンフィグ最小化
メモリの準備 メモリには、その準備の方法で2種類ある。 静的変数: コンパイル時にすでにメモリのサイズがわかっているもの。 普通の変数宣言
Javaプログラムの変更を支援する 影響波及解析システム
コードクローン検出ツールを用いた ソースコード分析システムの試作と プログラミング演習への適用
動的データ依存関係解析を用いた Javaプログラムスライス手法
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
オブジェクト指向プログラムにおける エイリアス解析・視覚化ツールの試作
オープンソース開発支援のための リビジョン情報と電子メールの検索システム
コードクローンの動作を比較するためのコードクローン周辺コードの解析
Javaバイトコードの 動的依存解析情報を用いた スライシングシステムの実現
プログラム理解におけるThin sliceの 統計的調査による有用性評価
バイトコードを単位とするJavaスライスシステムの試作
オブジェクト指向プログラミングと開発環境
ソフトウェア保守のための コードクローン情報検索ツール
パターンマイニング技術を 用いた実時間プログラムの コーディングパターン検出
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
Javaバーチャルマシンを利用した 動的依存関係解析手法の提案
JAVAバイトコードにおける データ依存解析手法の提案と実装
インスタンスの型を考慮したJavaプログラムの実行経路の列挙手法の提案
JavaScriptを含んだHTML文書に対する データフロー解析を用いた構文検証手法の提案
コードクローン間の依存関係に基づく リファクタリング支援環境の実装
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
静的情報と動的情報を用いた Javaプログラムスライス計算法
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
設計情報の再利用を目的とした UML図の自動推薦ツール
依存関係の局所性を利用した プログラム依存グラフの 効率的な構築法
保守請負時を対象とした 労力見積のためのメトリクスの提案
オブジェクトの動的支配関係解析を 用いたシーケンス図の縮約
クローン検出ツールを用いた ソフトウェアシステムの類似度調査
オープンソースソフトウェアに対する コーディングパターン分析の適用
メソッドの同時更新履歴を用いたクラスの機能別分類法
アスペクト指向プログラミングの 動的プログラムスライスへの応用
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
回帰テストにおける実行系列の差分の効率的な検出手法
メソッド抽出リファクタリングが 行われるメソッドの特徴調査
木構造の比較に基づく メソッド呼び出し履歴の変化の可視化手法
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
オブジェクト指向メトリクスを用いた 開発支援に関する研究 --- VC++とMFCを用いた開発を対象として ---
プログラム依存グラフを用いた ソースコードのパターン違反検出法
Presentation transcript:

静的情報と動的情報を用いた プログラムスライス計算法 芦田佳行 井上研究室

発表内容 プログラムスライス 静的情報と動的情報を併用するスライス計算法の提案 各手法の評価,考察 動的スライス 静的スライス Call-Markスライス Statement-Markスライス D3スライス 部分解析法 各手法の評価,考察

研究の背景 ソフトウェアシステムの巨大化,複雑化 テスト工程のコストの増大(開発コストの50~80%) テスト(フォールトの検出) デバッグ(フォールト位置の特定,修正) フォールト位置の特定を効率良く行うための一手法 として,プログラムスライスが提案されている.

プログラムスライス ある文のある変数(スライス基準)の値に影響を与える文の集合 誤った値の変数をスライシング 基準に指定する. フォールトに関連の深い部分が スライスとして抽出される.

動的スライス 1: a:=3; 2: b:=2; 3: readln(c); 4: if c=0 then 5: d:=a 6: else 制御依存関係(CD) a データ依存関係(DD) 1: a:=3; 2: b:=2; 3: readln(c); 4: if c=0 then 5: d:=a 6: else 7: d:=a+1; 8: e:=b+a; 9: writeln(d); 10: writeln(e); 1: a:=3; 2: b:=2; 3: readln(c); 4: if c=0 then 5: d:=a 6: else 7: d:=a+1; 8: e:=b+a; 9: writeln(d); 10: writeln(e); 入力がc=0の場合の実行系列 e7: writeln(d); e1: a:=3; e2: b:=2; e3: readln(c); e4: if c=0 then e5: d:=a e6: e:=b+a; e7: writeln(d); e8: writeln(e); e1: a:=3; e3: readln(c); e4: if c=0 then e5: d:=a d e b c a データ依存関係の説明 制御依存関係の説明 実行系列が長くなってしまう場合が多く,それに対応する節点を準備するのに多くのメモリが必要で,かつその解析に多くの時間を必要とする. この方法は,あまり現実的ではない. 9: writeln(d);

静的スライス 1: a:=3; 2: b:=2; 3: readln(c); 4: if c=0 then 5: d:=a 6: else 8: e:=b+a; 10: writeln(e); 1: a:=3; 2: b:=2; 3: readln(c); 4: if c=0 then 5: d:=a 6: else 7: d:=a+1; 8: e:=b+a; 9: writeln(d); 10: writeln(e); 9: writeln(d); 特定のテストデータを考慮せず,ずべての実行系列についての可能性を考える. 配列やポインタの詳細な解析ができない. d スライスサイズの増加

本研究では,静的情報と動的情報の両方を用いた 研究の目的 コスト: 静的スライスに近づける. スライス結果: 動的スライスに近づける. 本研究では,静的情報と動的情報の両方を用いた いくつかのスライス抽出技法を提案する.

Statement-Mark (Call-Mark)スライス 文(関数呼び出し文)の実行履歴を用いて,実行されていない文をスライス結果から除外する. PDG 静的解析 グラフ探索 実行 文の 実行履歴 スライス基準

配列,ポインタ解析 配列やポインタの静的解析の限界 2: a[1]:=3; 3: readln(b); 4: c:=a[b]+4; 5: writeln(c); ポインタ 1: a:=0; 2: b:=2; 3: c:=&a; 4: *c:=4+b; 5: writeln(a); a a b 配列についてのみ説明. ポインタについても,同様な問題がある. ? c

D3スライスの特徴 データ依存関係: 動的に解析 制御依存関係: 静的に解析 依存グラフの節点: ソースプログラムの各文 配列やポインタ,構造体の詳しい解析 制御依存関係: 静的に解析 実行時のコスト削減 依存グラフの節点: ソースプログラムの各文 メモリ使用量の抑制

D3スライス PDG’ 制御依存 関係解析 依存辺 の追加 PDG データ 依存関係 実行 & 解析 グラフ探索 スライス基準

データ依存関係解析 1: a[0]:=0; 2: a[1]:=3; 3: readln(b); 4: a[b]:=2; 5: c:=a[0]+4; 6: writeln(c); 1: a[0]:=0; 各変数がどこで定義されたか 2: a[1]:=3; a[0] a[1] b c 3: readln(b); b e4 s4 s2 s3 - e5 s4 s2 s3 s5 e3 s1 s2 s3 - e6 s4 s2 s3 s5 e2 s1 s2 - - e1 s1 - - - 4: a[b]:=2; a[0] 5: c:=a[0]+4; c 6: writeln(c);

各手法の違い

評価方法 本手法を,すでに試作しているスライシングツール (対象言語: Pascal)に実装し,有効性を確認する. 比較手法 静的スライス 動的スライス Call-Mark Statement-Mark D3スライス 計測項目 スライスサイズ 解析時間(静的解析) 実行時間(動的解析)

計測結果(1) スライスサイズ(行) P1: カレンダー表示プログラム(88行) P2: 酒屋問題(387行)

計測結果(2) 解析時間(静的解析)[ms] 実行時間(動的解析)[ms] (Celeronー450MHz with 128MB)

考察

まとめと今後の課題 静的情報と動的情報を併用するスライス計算法を提案し,評価した. Statement-Markスライス D3スライス これらの手法を使い分けることで,効率良いフォールト位置の特定が期待できる. 新しいスライスツールへの本手法の適用 複数手法の使い分けの指針となるようなメトリクスの提案?

動的スライス(説明無し) 1: a:=3; 2: b:=2; 3: readln(c); 4: if c=0 then 5: d:=a 6: else 7: d:=a+1; 8: e:=b+a; 9: writeln(d); 10: writeln(e); 1: a:=3; 2: b:=2; 3: readln(c); 4: if c=0 then 5: d:=a 6: else 7: d:=a+1; 8: e:=b+a; 9: writeln(d); 10: writeln(e); 入力がc=0の場合の実行系列 e1: a:=3; e3: readln(c); e4: if c=0 then e5: d:=a e1: a:=3; e2: b:=2; e3: readln(c); e4: if c=0 then e5: d:=a e6: e:=b+a; e7: writeln(d); e8: writeln(e); e7: writeln(d); a d e b c 9: writeln(d);

静的スライス(説明無し) 9: writeln(d); 1: a:=3; 2: b:=2; 3: readln(c); 4: if c=0 then 5: d:=a 6: else 7: d:=a+1; 8: e:=b+a; 9: writeln(d); 10: writeln(e); 1: a:=3; 2: b:=2; 3: readln(c); 4: if c=0 then 5: d:=a 6: else 7: d:=a+1; 8: e:=b+a; 10: writeln(e);

動的スライス(説明あり) 1: a:=3; 2: b:=2; 3: readln(c); 4: if c=0 then 5: d:=a 6: else 7: d:=a+1; 8: e:=b+a; 9: writeln(d); 10: writeln(e); 1: a:=3; 2: b:=2; 3: readln(c); 4: if c=0 then 5: d:=a 6: else 7: d:=a+1; 8: e:=b+a; 9: writeln(d); 10: writeln(e); 入力がc=0の場合の実行系列 e7: writeln(d); e1: a:=3; e2: b:=2; e3: readln(c); e4: if c=0 then e5: d:=a e6: e:=b+a; e7: writeln(d); e8: writeln(e); e1: a:=3; e3: readln(c); e4: if c=0 then e5: d:=a d e b c a a 9: writeln(d);

静的スライス(説明あり) 1: a:=3; 2: b:=2; 3: readln(c); 4: if c=0 then 5: d:=a 6: else 7: d:=a+1; 8: e:=b+a; 10: writeln(e); 9: writeln(d); 1: a:=3; 2: b:=2; 3: readln(c); 4: if c=0 then 5: d:=a 6: else 7: d:=a+1; 8: e:=b+a; 9: writeln(d); 10: writeln(e); d

Call-Markスライス (1) ソースプログラムを静的に解析し,PDGを作る. (2) 入力データを与えてプログラムを実行し,各関数呼び出し文が実行されたかどうか調べる. (3) 実行されていない文,その文につながる辺をPDGから取り除く. (4) スライシング基準からスライスを計算する.

Statement-Markスライス (1) ソースプログラムを静的に解析し,PDGを作る. (2) 入力データを与えてプログラムを実行し,各文が実行されたかどうか調べる. (3) 実行されていない文,その文につながる辺をPDGから取り除く. (4) スライシング基準からスライスを計算する.

発表内容 プログラムスライス 静的情報と動的情報を併用するスライス計算法の提案 各手法の評価,考察 静的スライス 動的スライス Statement-Markスライス D3スライス 各手法の評価,考察