静的情報と動的情報を用いた プログラムスライス計算法 芦田佳行 井上研究室 発表内容 プログラムスライス 動的スライス 静的スライス 静的情報と動的情報を併用するスライス計算法の 提案 Call-Markスライス Statement-Markスライス D3スライス 部分解析法 各手法の評価,考察 研究の背景 ソフトウェアシステムの巨大化,複雑化 テスト工程のコストの増大(開発コストの50~80%) テスト(フォールトの検出) デバッグ(フォールト位置の特定,修正) フォールト位置の特定を効率良く行うための一手法 として,プログラムスライスが提案されている. プログラムスライス ある文のある変数(スライス基準)の値に影響を与え る文の集合 誤った値の変数をスライシング 基準に指定する. フォールトに関連の深い部分が スライスとして抽出される. 動的スライス 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: a:=3; b:=2; readln(c); if c=0 then d:=a else d:=a+1; e:=b+a; writeln(d); writeln(e); 制御依存関係(CD) データ依存関係(DD) 入力がc=0の場合の実行系列 b c e e1: e2: e3: e4: e5: e6: e7: e8: a:=3; a a b:=2; readln(c); if c=0 then d:=a e:=b+a; writeln(d); writeln(e); d 静的スライス 1: a 2: b c 3: 4: 5: 6: 7: 8: e 9: 10: a:=3; aa b:=2; readln(c); if c=0 then d:=a d else d:=a+1; d e:=b+a; writeln(d); writeln(e); 特定のテストデータを 考慮せず,ずべての実 行系列についての可能 性を考える. 配列やポインタの詳細 な解析ができない. スライスサイズの増加 研究の目的 コスト: 静的スライスに近づける. スライス結果: 動的スライスに近づける. 本研究では,静的情報と動的情報の両方を用いた いくつかのスライス抽出技法を提案する. Statement-Mark (Call-Mark)スライス 文(関数呼び出し文)の実行履歴を用いて,実行さ れていない文をスライス結果から除外する. 静的解析 実行 文の 実行履歴 PDG グラフ探索 スライス基準 配列,ポインタ解析 配列やポインタの静的解析の限界 配列 a b c 1: 2: 3: 4: 5: a[0]:=0; a[1]:=3; a readln(b); c:=a[b]+4; writeln(c); ポインタ 1: 2: 3: 4: 5: a:=0; b:=2; c:=&a; *c:=4+b; ? writeln(a); D3スライスの特徴 データ依存関係: 動的に解析 配列やポインタ,構造体の詳しい解析 制御依存関係: 静的に解析 実行時のコスト削減 依存グラフの節点: ソースプログラムの各文 メモリ使用量の抑制 D3スライス 実行 & 解析 制御依存 関係解析 PDG’ データ 依存関係 依存辺 の追加 グラフ探索 PDG スライス基準 データ依存関係解析 入力がb=0の場合 b a[0] c 1: 2: 3: 4: 5: 6: a[0]:=0; a[1]:=3; readln(b); a[b]:=2; c:=a[0]+4; writeln(c); 各変数がどこで定義されたか e1 e2 e3 e4 e5 e6 a[0] a[1] b s1 s2 s4 s3 - c s5 -- 各手法の違い StatementMark 実行前解析 DD/CD DD/CD DD/CD 実行中解析 なし Call 文に flag 各文に flag を立てる を立てる 依 存 グ ラ フ ソースプログ ソースプログ ソースプログ の節点 ラムの各文 ラムの各文 ラムの各文 静的 Call-Mark D3 動的 CD DD なし DD/CD ソースプログ 実行系列 ラムの各文 評価方法 本手法を,すでに試作しているスライシングツール (対象言語: Pascal)に実装し,有効性を確認する. 比較手法 静的スライス 動的スライス Call-Mark Statement-Mark D3スライス 計測項目 スライスサイズ 解析時間(静的解析) 実行時間(動的解析) 計測結果(1) P1: カレンダー表示プログラム(88行) P2: 酒屋問題(387行) P3: 拡張酒屋問題(941行) スライスサイズ(行) P1 P2 P3 静的 27 185 189 CM 19 169 168 SM 19 146 150 D3 18 18 63 動的 12 4 6 計測結果(2) 解析時間(静的解析)[ms] P1 P2 P3 静的 14 219 710 CM 15 230 754 SM 14 223 717 D3 4.5 19 48 動的 N/A N/A N/A 実行時間(動的解析)[ms] P1 P2 P3 静的 52 46 4,869 CM 53 46 4,899 SM 53 47 4,955 D3 55 49 5,274 (Celeronー450MHz with 128MB) 動的 184 4,649 38,969 考察 まとめと今後の課題 静的情報と動的情報を併用するスライス計算法を 提案し,評価した. Statement-Markスライス D3スライス これらの手法を使い分けることで,効率良いフォー ルト位置の特定が期待できる. 新しいスライスツールへの本手法の適用 複数手法の使い分けの指針となるようなメトリクス の提案? 動的スライス(説明無し) 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: a:=3; b:=2; readln(c); if c=0 then d:=a else d:=a+1; e:=b+a; writeln(d); writeln(e); 入力がc=0の場合の実行系列 b c e e1: e2: e3: e4: e5: e6: e7: e8: a a:=3; b:=2; readln(c); if c=0 then d:=a d e:=b+a; writeln(d); writeln(e); 静的スライス(説明無し) 1: a 2: b c 3: 4: 5: 6: 7: 8: e 9: 10: a:=3; aa b:=2; readln(c); if c=0 then d:=a d else d:=a+1; d e:=b+a; writeln(d); writeln(e); 動的スライス(説明あり) 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: a:=3; b:=2; readln(c); if c=0 then d:=a else d:=a+1; e:=b+a; writeln(d); writeln(e); 入力がc=0の場合の実行系列 b c e e1: e2: e3: e4: e5: e6: e7: e8: a:=3; a a b:=2; readln(c); if c=0 then d:=a e:=b+a; writeln(d); writeln(e); d 静的スライス(説明あり) 1: a 2: b c 3: 4: 5: 6: 7: 8: e 9: 10: a:=3; aa b:=2; readln(c); if c=0 then d:=a d else d:=a+1; d e:=b+a; writeln(d); writeln(e); Call-Markスライス (1) ソースプログラムを静的に解析し,PDGを作る. (2) 入力データを与えてプログラムを実行し,各関数 呼び出し文が実行されたかどうか調べる. (3) 実行されていない文,その文につながる辺をPDG から取り除く. (4) スライシング基準からスライスを計算する. Statement-Markスライス (1) ソースプログラムを静的に解析し,PDGを作る. (2) 入力データを与えてプログラムを実行し,各文が 実行されたかどうか調べる. (3) 実行されていない文,その文につながる辺をPDG から取り除く. (4) スライシング基準からスライスを計算する. 発表内容 プログラムスライス 静的スライス 動的スライス 静的情報と動的情報を併用するスライス計算法の 提案 Statement-Markスライス D3スライス 各手法の評価,考察
© Copyright 2024 ExpyDoc