ねえ智也くん、この論文のタイト…
解説
ねえねえ智也くん!この『DynaFix』っていう論文のタイトル、なんか強そうで気になる!ダイナミックに直すってこと?
ああ、これは自動プログラム修正、つまりAPRっていう分野の新しい研究だよ。AIを使ってプログラムのバグを自動で直す技術のことだね。
へー!AIが勝手にバグを直してくれるなんて、夢の技術じゃん!でも、今までのは何がダメだったの?
今までの手法は、コードの文字面だけを見る『静的解析』に頼りすぎていたんだ。でも、バグって実際に動かしてみないと原因がわからないことが多いだろ?
確かに!「書いた時は完璧だと思ったのに!」ってこと、私もあるよ。動かして初めて「あれ?」ってなるよね。
そう。既存の手法でもテスト結果を使うことはあったけど、「テストに落ちた」っていう大雑把な情報だけだったんだ。それじゃあ、複雑なバグは直せない。
じゃあ、このDynaFixはどうやって解決してるの?
DynaFixは『実行レベルの動的情報』をフル活用するんだ。変数の値がどう変わったか、どのルートを通ってエラーになったか、っていう細かい情報をAIに教えるんだよ。
なるほど!お医者さんがレントゲンだけじゃなくて、血液検査の結果も見ながら診断するみたいな感じかな?
いい例えだね。そのために彼らは『ByteTrace』っていうツールを作ったんだ。これは『バイトコード・インストルメンテーション』っていう技術を使っていてね。
ばいとこーど……いんすとる……?呪文?
簡単に言うと、プログラムの元の書き換えずに、実行中にこっそり中身を覗き見るための仕掛けを組み込む技術のことだよ。これで詳細なデータを集めるんだ。
へー!すごい!それで、どうやって直していくの?
まず、バグがあるコードとByteTraceで集めた実行データをAIに渡して、修正案を作らせる。もしその修正案がテストに落ちたら、またその時の実行データを集めてAIに渡すんだ。
あ、一回で諦めないんだ!何度もやり直すの?
そう。これを『反復的修正』と呼んでいる。人間がデバッグする時も、「ここを直してみよう、あ、まだダメだ、次はここかな」って繰り返すだろ?それをAIにやらせるわけだ。
まさに人間みたいだね!それで、結果はどうだったの?
Defects4Jっていう有名なテストセットで試したところ、186個のバグを直せた。これは最新の他手法より10%も高いし、今まで誰も直せなかったバグも38個解決したんだよ。
186個!しかも誰も直せなかったバグまで……!DynaFix、めちゃくちゃ優秀じゃん!
効率も良くて、修正案を探す範囲を従来より70%も減らせたらしい。無駄な試行錯誤が減ったってことだね。実行データがあるから、AIが迷わずに済むんだ。
これがあれば、エンジニアの人たちも楽になれるね!将来はどうなるのかな?
今は一つの関数の中にあるバグがメインだけど、将来的には複数の関数にまたがるもっと複雑なバグにも対応できるようになるはずだよ。ただ、実行データを集める分、計算コストがかかるのが課題かな。
なるほどね〜。あ、じゃあ私の「朝起きられないバグ」も、DynaFixで実行データを解析して直してほしいな!
それはプログラムのバグじゃなくて、ただの夜更かしだろ。生活習慣を自分でデバッグしなさい。
要点
- 従来の自動プログラム修正(APR)は、コードの見た目(静的情報)に頼りすぎており、実際に動かした時の挙動(動的情報)を十分に活用できていなかった。
- 提案手法の『DynaFix』は、プログラム実行時の変数の値や実行ルート、関数の呼び出し履歴などの詳細な情報をAIに与えて修正案を考えさせる。
- 一度で修正できなくても、失敗した時の実行データを再度取得してAIにフィードバックする『反復的な修正プロセス』を導入している。
- Javaプログラムを解析するための専用ツール『ByteTrace』を開発し、ソースコードを書き換えずに詳細な実行データを収集することを可能にした。
- 有名なバグ修正データセット『Defects4J』で評価し、既存の最新手法より10%多い186個のバグを修正。これまで誰も直せなかった38個のバグも解決した。