4. 問題の定式化
3
TM を満たす
SM を⾃動⽣成
テストケース TM
pass
l 構⽂的競合
SM が構⽂解析に失敗
l 静的な意味的競合
SM がコンパイルに失敗
l 振る舞い競合
SM が予期しない振る舞いを実⾏
従来⼿法の
対象
public class Book {
private String priceInfo;
public Book(int price) {
if (price > 0) {
<<<<<<< HEAD
priceInfo = String.valueOf(price) + "-yen";
} else {
priceInfo = "Not on sale";
=======
this.price = price;
>>>>>>> branch-B
}
}
public String getPriceInfo() {
return priceInfo;
}
public String getPriceInfo() {
return String.valueOf(price) + "-yen";
}
}
SB
So
⼲渉
SM
?競合
ΔB
ΔA
派⽣
SA
8. 実験
7
https://www.fse.cs.ritsumei.ac.jp/APR-based-Merge
対象 SO SA SB 競合⾏数
VS1 425 +313−35 +57−10 7
VS2 425 +315−44 +45−14 7
DT 2610 +479−24 +168−6 27+10
実験A
SO SA SB 競合⾏数
11 +8−4 +7−1 4
意図的に作成した
振る舞い競合
リファクタリング
& 機能変更
機能追加 & 機能追加
実験B
対象 SO SA SB 競合⾏数 SM
Jsoup 1 356† +12−6 +2−2 3 +12-6/+2-2/+12-6
Jsoup 7 807† +90−3 +25−23 11 +113−24/+25−23/+90−3
実験C
† 競合するソースファイルの⾏数
修正パッチの最⼤数を100個, シードを変えた10回の試⾏
OSSプロジェクトにおける振る舞い競合
9. 実験Aの結果 〜 出⼒数
8
世代数G=10 世代数G=20
変異数V=20 78 / 5 / 2 213 / 7 / 2
変異数V=50 242 / 7 / 5 833/ 13 / 5
変異数V=100 590 / 12 / 5 1,498/ 16 / 5
213個の出⼒に対して,
機械的な削減で7個,著者により
2個を受け⼊れ可能と判断
public class Book {
private String priceInfo;
private int price;
public Book(int price) {
if (price > 0) {
priceInfo = String.valueOf(price) + "-yen";
+ this.price = price;
} else {
priceInfo = "Not on sale";
}
}
public int getPrice() {
return price;
}
public String getPriceInfo() {
return priceInfo;
}
}
public class Book {
private String priceInfo;
private int price;
public Book(int price) {
if (price > 0) {
this.price = price;
}
}
public int getPrice() {
return price;
}
public String getPriceInfo() {
- return priceInfo;
+ if (price > 0) {
+ priceInfo = String.valueOf(price) + "-yen";
+ } else {
+ priceInfo = "Not on sale";
+ }
+ return priceInfo;
}
}
if (price > 0) {
this.price = price;
priceInfo = String.valueOf(price) + "-yen";
} else {
priceInfo = "Not on sale";
if (price > 0) {
priceInfo = String.valueOf(price) + "-yen";
} else {
priceInfo = "Not on sale";
}
...
10. 実験Aの結果 〜 実⾏時間
9
世代数
G=10
世代数
G=20
世代数
G=30
世代数
G=40
世代数
G=50
変異数V=20 153 s (2) 261 s (2) 386 s (3) 532 s (3) 703 s (3)
変異数V=50 259 s (5) 521 s (5) 827 s (5) 1,068 s (5) 1,345 s (5)
変異数V=100 418 s (5) 903 s (5) 1,332 s (5) 1,773 s (5) 2,222 s (5)
37分2秒/40
40回の試⾏は並列で実施可能
→ 約6.5秒 (40回の試⾏時間が同じ場合)で出⼒可能
修正材料に SI を指定することの有意性を確認
5個の受け⼊れ可能なソースプログラムを
取得するまでに4分19秒
修正材料に SI を指定 → V = 50; G =10で5個出⼒
修正材料に SI を指定しない → V = 100; G =100でも出⼒は0個
11. 実験Bの結果 〜 出⼒数と実⾏時間
10
対象
競合
⾏数
SI
世代数
G=10
VS1 7
2
(1)
変位数
V=50
2 / 0
87 s
変位数
V=100
45 / 1
295 s
VS2 7 2
変位数
V=50
3 / 2
201 s
変位数
V=100
6 / 3
300 s
DT 37 2
変位数
V=50
11 / 2
858 s
変位数
V=100
15 / 2
1,463
修正範囲を限定することの有意性を確認(DT)
条件式の置換を採⽤することの意義を確認(VS2)
競合するメソッド外部(+1−1)で解決
式レベルでの変換により解決
修正範囲をテストに失敗したメソッドに
限定することで受け⼊れ可能な SM を
出⼒可能
競合メソッド内部(+4−1)で解決
=
VS1 7
2
(1)
2 / 0
87 s
45 / 1
295 s
VS2 7 2
3 / 2
201 s
6 / 3
300 s
DT 37 2
11 / 2
858 s
15 / 2
1,463
) (2
( ) (
−
V 4 0 5 0
+1) G(
= 5 −