静的情報と動的情報を用いた
プログラムスライス計算法
芦田佳行
井上研究室
発表内容
プログラムスライス
動的スライス
静的スライス
静的情報と動的情報を併用するスライス計算法の
提案
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スライス
各手法の評価,考察
ダウンロード

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