3. Predicate-Level Statistical Debugging
1 // 一次元距離を求める 行 条件式 2, 5, 5, -4, 1, 従来法 提案法
2 int distance(int x, int y) 2 4 1 -2 0
3 { 5 diff == 0 T F F F F 4 3
4 int diff = x – y; 5 diff > 0 F T F F T 1 1
5 if (diff <= 1) { 欠陥:正しくはdiff <= F
5 diff < 0 0 F T T F 4 3
6 int dist = 0; 6 dist == 0 T T T T T 3 3
7 dist = y – x; 6 dist > 0 F F F F F 4 3
8 return dist; 6 dist < 0 F F F F F 4 3
9 } 7 dist == 0 T F F F F 4 3
10 int dist = 0; 7 dist > 0 F F T T F 4 3
11 dist = x – y; 7 dist < 0 F T F F T 1 2
12 return dist; テスト結果 S F S S F
13 }
5行目に欠陥を含むプログラム 3
4. Predicate-Level Statistical Debugging
1 // 一次元距離を求める 行 条件式 2, 5, 5, -4, 1, 従来法 提案法
2 int distance(int x, int y) 2 4 1 -2 0
3 { 5 diff == 0 T F F F F 4 3
4 int diff = x – y; 5 diff > 0 F T F F T 1 1
5 if (diff <= 1) { 5 diff < 0 F F T T F 4 3
6 int dist = 0; 6 dist == 0 T T T T T 3 3
7 dist = y – x; 6 dist > 0 F F F F F 4 3
8 return dist; 6 dist < 0 F F F F F 4 3
9 } 7 dist == 0 T F F F F 4 3
10 int dist = 0; 7 dist > 0 F F T T F 4 3
11 dist = x – y; 7 dist < 0 F T F F T 1 2
12 return dist; 1. 文中の変数
テスト結果 S F S S F
13 } に対し
条件文生成
5行目に欠陥を含むプログラム 4
5. Predicate-Level Statistical Debugging
x, yの値
1 // 一次元距離を求める 行 条件式 2, 5, 1, -4, 1, 従来法 提案法
2 int distance(int x, int y) 2 4 5 -2 0
3 { 5 diff == 0 T F F F F 4 3
4 int diff = x – y; 5 diff > 0 F T F F T 1 1
5 if (diff <= 1) { 5 diff < 0 F F T T F 4 3
6 int dist = 0; 6 dist == 0 T T T T T 3 3
7 dist = y – x; 6 dist > 0 F F F F F 4 3
8 return dist; 6 dist < 0 F F F F F 4 3
9 } 7 dist == 0 T F F F F 4 3
10 int dist = 0; 7 dist > 0 F F T T F 4 3
11 dist = x – y; 7 dist < 0 F T F F T 1 2
12 return dist; 1. 文中の変数
テスト結果 S F S S F
13 } に対し 2. テストを実行
条件文生成 ?条件真偽
5行目に欠陥を含むプログラム ?テスト結果 5
6. Predicate-Level Statistical Debugging
x, yの値
1 // 一次元距離を求める 行 条件式 2, 5, 1, -4, 1, 従来法 提案法
2 int distance(int x, int y) 2 4 5 -2 0
3 { 欠陥に関連する文?条件に高い優先度 4
5 diff == 0 T F F F F 3
4 int diff = x – y; 5 diff > 0 F T F F T 1 1
5 if (diff <= 1) { 5 diff < 0 F F T T F 4 3
6 int dist = 0; 6 dist == 0 T T T T T 3 3
7 dist = y – x; 6 dist > 0 F F F F F 4 3
8 return dist; 6 dist < 0 F F F F F 4 3
9 } 7 dist == 0 T F F F F 4 3
10 int dist = 0; 7 dist > 0 F F T T F 4 3
11 dist = x – y; 7 dist < 0 F T F F T 1 2
12 return dist; 1. 文中の変数 S F S S F
テスト結果
13 } に対し 2. テストを実行 3. 欠陥に
条件文生成 ?条件真偽 関連しそうな
5行目に欠陥を含むプログラム ?テスト結果 文?条件推定
6
7. 2つのバイアス
1 // 一次元距離を求める 行 条件式 2, 5, 1, -4, 1, 従来法 提案法
2 int distance(int x, int y) 2 4 5 -2 0
3 { 欠陥に関連する文?条件に高い優先度 4
5 diff == 0 T F F F F 3
4 int diff = x – y; 5 diff > 0 F T F F T 1 1
5 if (diff <= 1) { 5 diff < 0 F F T T F 4 3
6 int dist = 0; 6 dist == 0 T T T T T 3 3
7 dist = y – x; 2. 失敗フローバイアス F F F
6 dist > 0 F F 4 3
8 return dist; 対象: 欠陥の発現後に実行される文 3
6 dist < 0 F F F F F 4
9 } 7 dist == 0 T F F F F 4 3
10 int dist = 0; 7 dist > 0 F F T T F 4 3
11 dist = x – y; 7 dist < 0 F T F F T 1 2
12 return dist; 1. 制御フロー依存バイアスS F
テスト結果 S F S
13 } 対象: 欠陥を含む文と依存関係を持つ文
(e.g., 5行目でdiff > 0 なら 7行目でdist < 0)
5行目に欠陥を含むプログラム
7
8. 制御フロー依存バイアスの検出
ステートメントレベルでの既存手法* int diff = x – y;
制御フローを解析して直前の分岐文を判別
→ 制御フロー依存する文
!(diff <= 1)
If (diff <= 1)
貢献:
条件式レベルに拡張 diff <= 1
制御フロー依存
直前の分岐文の条件式と,その否定を考える int dist = 0;
e.g., (diff <= 1), (!(diff <= 1)) dist = y – x;
注目する式に到達するために return dist;
成立すべきものが,制御フロー依存する条件式
*本論文参考文献[10, 11] 8