More Related Content
Similar to バグ自動修正ツールって本当に使えるの? ~自動デバッグ技術の現状と課題~ (20)
バグ自動修正ツールって本当に使えるの? ~自動デバッグ技術の現状と課題~
- 1. Copyright 2018 FUJITSU LABORATORIES LTD.
バグ自動修正ツールって
本当に使えるの?
~自動デバッグ技術の現状と課題~
2018年12月14日
株式会社富士通研究所
徳本 晋
0
- 2. 自己紹介
氏名:徳本 晋(とくもと すすむ)
所属:㈱富士通研究所 ソフトウェア研究所
早稲田大学 招聘研究員
専門:ソフトウェア工学
特にソフトウェアテスト、デバッグ
最近の対外的な活動
情報処理学会誌 2019年1月号 「特集」機械学習工学 一部記事執筆
QA4AIコンソーシアム メンバー
国際会議APSEC2018 SEIP track PC member / Session chair
国際会議ICST2017 Registration chair
ソフトウェアエンジニアリングシンポジウム2018 プログラム委員
ソフトウェアエンジニアリングシンポジウム2017 インタラクティブ賞
トップエスイーコンテスト2017 モデルチェッキングコンテスト優勝
Copyright 2018 FUJITSU LABORATORIES LTD.1
- 3. ソフトウェアデバッグの費用
Copyright 2018 FUJITSU LABORATORIES LTD.
34兆円/年
- Cambridge University
Research Study[2]
7兆円/年
-NIST
Survey [1]
2003 2013
1) Tassey, Gregory. "The economic impacts of
inadequate infrastructure for software testing."
National Institute of Standards and Technology,
RTI Project 7007.011 (2002).
2) http://www.prweb.com/releases/2013/1/prwe
b10298185.htm
ソフトウェア開発者は
開発時間の 50% を
バグの局所化と修正に
費やしている
6ヶ月
バグ修正の平均期間
オープンソースソフトウェア
商用ソフトウェア - Coverity® Scan Open Source
Report 2014
2
- 6. Copyright 2018 FUJITSU LABORATORIES LTD.
修正パターンからパッチを探索的に生成し、
テストがすべて通るパッチを出力する
どうやってバグを見つけて直すのか?
バグ局所化
パッチ生成
パッチ検査
バグを含む
プログラム
テストスイート
(失敗含む) 正しい
パッチ
成功
失敗
バグ個所を
絞り込み
誤った
パッチ
(テスト
漏れ)
パッチ
なし
全てのパッチ
をテスト済み
プログラム
を変更
5
- 7. バグ局所化では何をやっているか?
Copyright 2018 FUJITSU LABORATORIES LTD.
バグ局所化
バグを含む
プログラム
バグ個所を
絞り込み
int mid(int x,
int y,
int z){
S1 int m = z;
S2 if (y < z)
S3 if (x < y)
S4 m = y;
S5 else if (x < z)
S6 m = y;
S7 else
S8 if (x > y)
S9 m = y;
S10 else if (x > z)
S11 m = x;
S12 return m;
}
Susp 𝑆6
=
1
1
1
1
+ 1
5
3,
3,
5
1,
2,
3
3,
2,
1
5,
5,
5
5,
3,
4
2,
1,
3
Susp.
50.0%
50.0%
62.5%
0%
71.4%
83.3%
0%
0%
0%
0%
0%
50.0%
● ● ● ● ● ●
● ● ● ● ● ●
● ● ● ●
●
● ● ●
● ●
● ●
● ●
●
●
● ● ● ● ● ●
P P P P P F
6
- 8. パッチ生成では何をやっているか?
Copyright 2018 FUJITSU LABORATORIES LTD.
パッチ生成
プログラム
を変更
変更タイプ1:ステートメントレベル
if(a==0){
exit(0);
}
foo(b);
if(a==0){
foo(b);
}
exit(0);
if(a==0){
foo(b);
exit(0);
}
foo(b);
交換
複製
削除
if(a==0){
exit(0);
}
代表的なツール:
GenProg, RSRepair
探索範囲が広いため、
探索方法に工夫が必要
変更タイプ2:テンプレートベース
if(a==0){
exit(0);
}
foo(b);
if(a==0 || b!=0){
exit(0);
}
foo(b);
代表的なツール:
Prophet, PAR
if(a!=0){
exit(0);
}
if(b!=0)
foo(b);
条件
追加
if文
追加
探索コストは低いが
直せる範囲は
テンプレート依存
7
- 10. Copyright 2018 FUJITSU LABORATORIES LTD.
修正パターンからパッチを探索的に生成し、
テストがすべて通るパッチを出力する
どうやってバグを見つけて直すのか?
バグ局所化
パッチ生成
パッチ検査
バグを含む
プログラム
テストスイート
(失敗含む) 正しい
パッチ
成功
失敗
バグ個所を
絞り込み
誤った
パッチ
(テスト
漏れ)
パッチ
なし
全てのパッチ
をテスト済み
プログラム
を変更
9
- 11. Copyright 2018 FUJITSU LABORATORIES LTD.
富士通研で定義したバグ自動修正レベル
どのようなバグが直せるのか?直せないのか?
レベ
ル
名称 定義 自動修復タ
スクの実施
システム
出力
バグの
原因箇所
バグの
再現性
正しいパッチ
であるかの判
断
0自動修復なし 開発者が全ての修復タ
スクを実施
人
ー ー ー ー
1バグ箇所特定 システムが修復箇所の
特定を実施
人+システ
ム
バグ個所
ー ー ー
2単純バグ自動
修復
システムが再現可能な
単一原因箇所バグに対
して修復パッチを生成
人+システ
ム
パッチ 単一原因箇
所バグ
再現可能 人
3複雑バグ自動
修復
システムが再現可能な
複数原因箇所バグに対
して修復パッチを生成
人+システ
ム
パッチ 複数原因箇
所バグ
再現可能 人
4高度バグ自動
修復
システムが確率的に再
現可能なバグに対して
修復パッチを生成
人+システ
ム
パッチ 単一/複数
原因箇所バ
グ
再現可能/
確率的に再
現可能
人
5完全自動修復 正しいパッチであるか
の判断までシステムが
行う
システム パッチ 単一/複数
原因箇所バ
グ
再現可能/
確率的に再
現可能
システム
直せる
直せない
10
- 14. 直せないバグの例
• 例:メモリリーク、性能・ユーザビリティなどの問題
• 例:テストで通ってない箇所、期待値設定が不十分な場合
• 失敗テストを手掛かりに探索的にパッチを生成するため
自動テストで
検出できないバグ
• 組合せ爆発が起こるため
原因個所が複数に
またがるバグ
• 例:リソース競合、デッドロック、ライブロックなど
• パッチが正しいかはテストが通るかによって決まるため
確率的に
発生するバグ
• 例:設定ファイル、インフラ、外部ライブラリなど
対象プログラム
以外の不具合
• 例:変数宣言、メソッド定義、複雑な条件式、
修正パターン
にないバグ
Copyright 2018 FUJITSU LABORATORIES LTD.13
- 17. SapFixはどうやってバグを直しているか?
Copyright 2018 FUJITSU LABORATORIES LTD.
修正テンプレートから
パッチを生成する
バグ混入前の版に戻すバグ混入前の版に戻す 単純な変更を
網羅的に試す
(わかる範囲では)特別なことはやっていないが割り切りがよい
・直すよりも元に戻すことを優先(Revertをする)
・修正対象は実行時エラーに絞っている
(既発表ツール)
遺伝的アルゴリズム
を用いたファジング
16
- 19. ELIXIR: AIを活用したバグ自動修正ツール
Copyright 2018 FUJITSU LABORATORIES LTD.
バグを含む
プログラム
(Java 7 or 8
& Maven)
バグ
修正済み
プログラム
テスト失敗
(JUnit)
ELIXIR
ソフトウェア開発者
ビッグコード
テスト成功
過去の修正履歴から学習する
ことで正しい修正方法を発見
CI/CDに組み込んで
自動的に実行可能
ユーザーは確認するだけ
このパッチは
正しい!
バグ修正
パッチ
入力
学習
出力 確認 適用
小規模バグであれば3件に
1件程度を正しく修正可能
米国富士通研究所
(FLA)との共同研究
public StringBuffer format(Calendar calendar, StringBuffer buf) {
if (mTimeZoneForced) {
+ calendar.getTime();
calendar = (Calendar) calendar.clone();
calendar.setTimeZone(mTimeZone);
}
return applyRules(calendar, buf);
} 実際のバグ修正例
新たなコード追加が
必要なバグ修正も可能
18
- 20. ELIXIRはどのようにパッチを生成するのか
Copyright 2018 FUJITSU LABORATORIES LTD.
バグを含む
プログラム
(Java 7 or 8
& Maven)
テスト失敗
(JUnit)
ELIXIR
バグ修正
パッチ
①バグ局所化
②パッチ生成
③パッチ検査失敗
バグ個所を
絞り込み
プログラム
を変更
1.
2.
n.
機械学習で
ランク付け
学習
修正パターンから
パッチ候補を生成
修正
パターン
出力入力
19
- 26. バグ自動修正技術で開発スタイルが変わる
Copyright 2018 FUJITSU LABORATORIES LTD.
コードと
テストケース
コミット
リポジトリ
コンパイル
ビルドテスト
継続的インテグレーション
トリガー
テスト成功?
パッチ
データ
取得
レビュー
開発者
通知
トリガー
1 2
3
4
5
6
End
マージ
リクエスト
AI
モデル
LIXIR BotE
パッチ生成?
単純なバグは
Botに直してもらう
25
Editor's Notes
- 0
- ・高品質の要求、複雑化、環境の多様化によりデバッグの費用が世界的にも増えている
- 5
- 9
- 10
- 次に研究所で取り組んでいるJava向けのバグ自動修正ツールElixirを紹介します。Elixirは基本的には他のバグ自動修正ツールと同じように、バグを含むソースコードとそれを発見したテストコードを入力として、そのテストをすべて成功させるようなパッチ候補を出力するものですが、このとき、既存の大規模資産からソースコードとテストコードの類似度などの重みを機械学習したモデルを用いることにより既存技術よりも高い精度で正しい修正パッチが生成できます。生成したパッチはユーザーが正しいパッチかを確認し、プログラムに適用することでバグ修正が完了します。こちらが実際のバグ修正例ですが、メソッド追加のようなバグも修正可能です。
- さらにElixirの詳細についてご説明します。Elixirに限らず多くのバグ自動修正ツールは内部で3つのステップを経ることで修正パッチを生成しておりまして、最初にバグ箇所を絞り込むバグ局所化、次に絞り込んだ箇所に適合するパッチを生成し、最後にそのパッチでテストが成功するかを調べるパッチ検査を行い、検査が通ればそのパッチを出力し、検査に通らなければ、また新たな箇所や新たなパッチを探すためバグ局所化やパッチ生成をやりなおすという流れになります。Elixirはパッチ生成のステップで特徴がありまして、バグ被疑箇所に対して修正パターンを適用してパッチ候補を生成するのですが、その修正パターンは統計的にバグになりやすいものを集めています。また、パッチ候補の中から既存の大規模資産を用いた機械学習により、より正しいそうなパッチをランク付けすることで