背景
開発工程の労力の半分以上はデバッグ作業と言われるほど、デバッグはソフトウエア開発で多大なコストを伴う作業です。デバッグ作業は、バグの検出、バグを引き起こしているプログラム中の記述箇所の特定、特定したバグを修正という3つのタスクから成ります(図1)。
図1:デバッグ作業における自動化技術
このうちバグを検出するタスクは、テストケース自動生成技術やテスト自動実行技術により、自動的に検出できるようになってきました。また、バグを起こしている箇所の特定についても、自動バグ同定技術参考1に関する研究が進んできています。こういったデバッグ作業自動化の流れの中、特定したバグを修正するタスクについても自動化をするような技術研究が多数行われています。今回はこの自動バグ修正技術についてご紹介します。
自動バグ修正技術の概要
自動バグ修正技術には大別して3種類のアプローチがあります。最初の2つのアプローチは、対象となるバグが含まれるプログラムと失敗テストを含むテストスイートを入力として、全てのテストが成功する修正プログラムを出力します。3つ目のアプローチは、大量のバグ修正パッチを機械学習する手法です。
- 1.変異を用いた手法:特定されたバグの箇所を変異させ、全てのテストが成功するまで繰り返すという手法(図2)。さまざまなプログラムの変異の手法が提案されており、遺伝的アルゴリズムを用いるGenProg参考2や、ランダム探索を用いるRSRepair参考3というツールが有名です。
図2:変異を用いた手法
- 2.意味解析に基づいた手法:特定されたバグの箇所が満たすべき制約を導き出し、その制約を満たすプログラムを作り出す手法(図3)。変異を用いた手法による修正は、理解しにくい修正方法である事が多いのに比べて、この手法では比較的理解しやすい修正になると言われています。代表的な手法・ツールとしては、SemFix参考4やDirectFix参考5が知られています。
図3:意味解析に基づいた手法
- 3.機械学習を用いた手法:大量のバグ修正パッチを学習することでプログラムを自動修正するための規則を作成し、その規則に従ってプログラムを修正する手法参考6。前述の2つの手法はプログラム文を「新しく」作り出していましたが、この手法は、既に人間が別のソフトウエアに対して行っていた修正パッチに似たパッチを自動で適用します。全く新しい修正方法で一から修正できるわけではありませんが、この手法で作成されたパッチは人間にも理解しやすいと言われています。
自動バグ修正技術の課題と展望
オープンソースのソフトウエアに対して適用してみたところ、約半数のバグを自動的に修正できたという結果が挙がっているツールもありますが、今のところどの手法も研究段階であり、すぐに実用的に利用できるという状況ではありません。自動バグ修正技術の現状の課題としては、複数箇所を同時に修正しないと治らないような複雑なバグを修正できない、巨大なソフトウエアを対象にすると現実的な時間で修正できなくなってしまう、などが挙げられます。
このようにさまざまな課題があるのは事実ですが、限定的な状況とはいえ半数のバグが自動修正できているのも事実です。今後この技術の研究開発が進むことで、デバッグ作業の工数が削減されていくと考えられます。また近い将来デバッグが完全に自動化されるかもしれません。