(57)【要約】      （修正有）【課題】、プログラムコードに対して実用性の高い修正を可能とするプログラム修正装置、プログラム修正方法及びプログラムを提供する。【解決手段】プログラム修正装置１０は、１つ以上のテストケースに不合格であったプログラムコードに対して、テストケースを入力とする遺伝的アルゴリズムを適用して、テストケースに合格するように修正されたプログラムコードを生成する修正部１２を有し、遺伝的アルゴリズムの評価関数は、各世代のプログラムコードについて、予め定義された１以上の規約を満たしている程度に基づいて評価値を計算する。【選択図】図３
2020004003.tif 000002
【特許請求の範囲】
【請求項１】
１つ以上のテストケースに不合格であったプログラムコードに対して、前記テストケースを入力とする遺伝的アルゴリズムを適用して、前記テストケースに合格するように修正されプログラムコードを生成する修正部を有し、
前記遺伝的アルゴリズムの評価関数は、各世代のプログラムコードについて、予め定義された１以上の規約を満たしている程度に基づいて評価値を計算する、
ことを特徴とするプログラム修正装置。
【請求項２】
前記評価関数は、複数のテストケースのうち合格したテストケースの数に基づく指標と、前記規約を満たしている程度との加重和を前記評価値として計算する、
ことを特徴とする請求項１記載のプログラム修正装置。
【請求項３】
前記修正部は、前記評価値が閾値以上であり、かつ、全ての前記テストケースに合格するプログラムコードが生成されると、当該プログラムコードを前記修正されたプログラムとして出力する、
ことを特徴とする請求項１又は２記載のプログラム修正装置。
【請求項４】
１つ以上のテストケースに不合格であったプログラムコードに対して、前記テストケースを入力とする遺伝的アルゴリズムを適用して、前記テストケースに合格するように修正されプログラムコードを生成する修正手順をコンピュータが実行し、
前記遺伝的アルゴリズムの評価関数は、各世代のプログラムコードについて、予め定義された１以上の規約を満たしている程度に基づいて評価値を計算する、
ことを特徴とするプログラム修正方法。
【請求項５】
前記評価関数は、複数のテストケースのうち合格したテストケースの数に基づく指標と、前記規約を満たしている程度との加重和を前記評価値として計算する、
ことを特徴とする請求項４記載のプログラム修正方法。
【請求項６】
前記修正手順は、前記評価値が閾値以上であり、かつ、全ての前記テストケースに合格するプログラムコードが生成されると、当該プログラムコードを前記修正されたプログラムとして出力する、
ことを特徴とする請求項４又は５記載のプログラム修正方法。
【請求項７】
請求項１乃至３いずれか一項記載の修正部としてコンピュータを機能させることを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム修正装置、プログラム修正方法及びプログラムに関する。
【背景技術】
【０００２】
ソフトウェア開発には様々な工程があり、その中でもデバッグ作業には多くの時間を要する。そのため、開発工程を短縮するためにデバッグ支援の研究が盛んに行われている。デバッグはバグ同定とバグ修正の二つに分けられる。近年、バグの同定及び修正を自動で行う自動プログラム修正技術の研究が盛んに行われている。
【０００３】
自動プログラム修正技術の一つとして、再利用に基づく手法（非特許文献１）がある（以下、単に「既存手法」という。）。既存手法は、バグを含むプログラムコードと、不合格となるテストケース、すなわち、バグを再現するテストケースを含むテストスイートを入力とし、全てのテストケースが合格となるプログラムコードをバグ修正済みのプログラムコードとして出力する。処理としては、バグ同定された箇所（複数箇所の場合もある）に対しての変異（例えば、行の挿入や削除、置換）を遺伝的アルゴリズムに基づいて繰り返し行う。このとき、遺伝的アルゴリズムの評価関数としては合格したテストケースの数を用いる。既存手法におけるバグ同定及びバグ修正の処理の流れの例を図１に示す。
【０００４】
図１では、プログラムコード及びテストスイートがバグ同定技術に入力され、バグ同定技術から、ステートメント（正確には抽象構文木のサブツリー単位）ごとに疑惑値を含む情報（以下、「同定結果」という。）と、テストスイートの実施結果が出力されている。なお、図１において、Ｔ１、Ｔ２、Ｔ３は、テストケースを示し、○は、当該テストケースに合格したこと、×は、当該テストケースに不合格であったことを示す。また、疑惑値とは、いずれかのテストケースに不合格である場合に、当該不合格の原因の箇所である可能性の高さを示す指標である。
【０００５】
遺伝的アルゴリズムでは、最初の世代（いずれかのテストケースに不合格だった修正前のプログラムコード）の一部に対して変異が行われて、複数通りの第１世代のバリアントが生成される。なお、バリアントとは、プログラムコードの一部のステートメント（複数箇所の場合もある）を書き換えることで新たに生成されるプログラムコードをいう。第１世代の各バリアントに対して各テストケースが実施され、テストケースの実施結果に基づく評価関数によって評価値が出力される。図１では、評価値がＥによって示されている。図１に示されるように、既存手法では、テストケースの総数に対する合格したテストケースの数の割合を評価値として出力する評価関数が用いられている。評価値が閾値（図１では、１／３）未満であるバリアントは削除され、残されたバリアントに基づいて次の世代（第２世代）のバリアントが生成される。図１の例では、第２世代において、全テストケースに合格したバリアント（Ｅ＝３／３であるバリアント）が生成されたため、当該バリアントが自動修正の結果として出力される。
【先行技術文献】
【非特許文献】
【０００６】
【非特許文献１】Westley Weimer, ThanhVu Nguyen, Claire Le Goues, and Stephanie Forrest. 2009. Automatically finding patches using genetic programming. In Proceedings of the 31st International Conference on Software Engineering (ICSE '09). IEEE Computer Society, Washington, DC, USA, 364-374. DOI=http://dx.doi.org/10.1109/ICSE.2009.5070536
【発明の概要】
【発明が解決しようとする課題】
【０００７】
このように、既存手法では、遺伝的アルゴリズムの評価関数の評価値が合格したテストケースの数に基づくため、テストケースが全て合格となるようにプログラムコードを生成できたとしても、当該プログラムコードが開発プロジェクトにおいて定められたコード規約を満たさないことが多い。その結果、既存手法が出力したプログラムコードを実務上において使用可能とするためには、コード規約を満たすようにするための修正に大きな稼働が必要とされる。
【０００８】
本発明は、上記の点に鑑みてなされたものであって、プログラムコードに対して実用性の高い修正を可能とすることを目的とする。
【課題を解決するための手段】
【０００９】
そこで上記課題を解決するため、プログラム修正装置は、１つ以上のテストケースに不合格であったプログラムコードに対して、前記テストケースを入力とする遺伝的アルゴリズムを適用して、前記テストケースに合格するように修正されプログラムコードを生成する修正部を有し、前記遺伝的アルゴリズムの評価関数は、各世代のプログラムコードについて、予め定義された１以上の規約を満たしている程度に基づいて評価値を計算する。
【発明の効果】
【００１０】
プログラムコードに対して実用性の高い修正を可能とすることができる。
【図面の簡単な説明】
【００１１】
【図１】既存手法におけるバグ同定及びバグ修正の処理の流れの例を示す図である。
【図２】本発明の実施の形態におけるプログラム修正装置１０のハードウェア構成例を示す図である。
【図３】本発明の実施の形態におけるプログラム修正装置１０の機能構成例を示す図である。
【図４】プログラム修正装置１０が実行する処理手順の一例を説明するためのフローチャートである。
【図５】プログラムコードの修正処理の処理手順の一例を説明するためのフローチャートである。
【図６】バリアントの一例を示す図である。
【発明を実施するための形態】
【００１２】
以下、図面に基づいて本発明の実施の形態を説明する。図２は、本発明の実施の形態におけるプログラム修正装置１０のハードウェア構成例を示す図である。図２のプログラム修正装置１０は、それぞれバスＢで相互に接続されているドライブ装置１００、補助記憶装置１０２、メモリ装置１０３、ＣＰＵ１０４、インタフェース装置１０５、表示装置１０６、及び入力装置１０７等を有する。
【００１３】
プログラム修正装置１０での処理を実現するプログラムは、ＣＤ−ＲＯＭ等の記録媒体１０１によって提供される。プログラムを記憶した記録媒体１０１がドライブ装置１００にセットされると、プログラムが記録媒体１０１からドライブ装置１００を介して補助記憶装置１０２にインストールされる。但し、プログラムのインストールは必ずしも記録媒体１０１より行う必要はなく、ネットワークを介して他のコンピュータよりダウンロードするようにしてもよい。補助記憶装置１０２は、インストールされたプログラムを格納すると共に、必要なファイルやデータ等を格納する。
【００１４】
メモリ装置１０３は、プログラムの起動指示があった場合に、補助記憶装置１０２からプログラムを読み出して格納する。ＣＰＵ１０４は、メモリ装置１０３に格納されたプログラムに従ってプログラム修正装置１０に係る機能を実現する。インタフェース装置１０５は、ネットワークに接続するためのインタフェースとして用いられる。表示装置１０６はプログラムによるＧＵＩ（Graphical User Interface）等を表示する。入力装置１０７はキーボード及びマウス等で構成され、様々な操作指示を入力させるために用いられる。
【００１５】
図３は、本発明の実施の形態におけるプログラム修正装置１０の機能構成例を示す図である。図３において、プログラム修正装置１０は、バグ同定部１１及びコード修正部１２を有する。これら各部は、プログラム修正装置１０にインストールされた１以上のプログラムが、ＣＰＵ１０４に実行させる処理により実現される。
【００１６】
バグ同定部１１は、バグを含むプログラムコードと、当該バグを再現する１つ以上のテストケースを含むテストスイートとを入力とし、当該プログラムコードにおいてバグを同定する（バグの箇所を特定する）。なお、バグを含むプログラムコードとは、当該プログラムコードに対して作成されたテストケース群のうちのいずれかのテストケースに対して不合格であったプログラムコードをいう。したがって、バグを再現するテストケースとは、不合格になったテストケースをいう。
【００１７】
コード修正部１２は、遺伝的アルゴリズムに基づいて、バグ同定部１１によって同定されたバグが解消されたプログラムコード（すなわち、不合格であったテストケースに合格するように修正されたプログラムコード）を生成する。
【００１８】
以下、プログラム修正装置１０が実行する処理手順について説明する。図４は、プログラム修正装置１０が実行する処理手順の一例を説明するためのフローチャートである。
【００１９】
ステップＳ１０１において、バグ同定部１１は、バグを含むプログラムコード（以下、「対象コード」という。）と、当該バグを再現するテストケースを含むテストスイート（以下、「対象テストスイート」という。）とを読み込む。対象プログラムコード及び対象テストスイートは、例えば、予め補助記憶装置１０２に記憶されていてもよいし、ネットワークを介して取得されてもよい。
【００２０】
続いて、バグ同定部１１は、対象テストコード及び対象テストスイートを用いて対象コードに対して、例えば、「W. Eric Wong, Ruizhi Gao, Yihao Li, Rui Abreu, and Franz Wotawa. 2016. A Survey on Software Fault Localization. IEEE Trans. Softw. Eng. 42, 8 (August 2016), 707-740. DOI: http://dx.doi.org/10.1109/TSE.2016.2521368」等に記載された公知技術を用いてバグ同定処理を行う（Ｓ１０２）。その結果、対象コードの部分ごとに疑惑値を含む情報（以下、「同定結果」という。）が出力される。ここで、対象コードの部分ごととは、例えば、対象コードのステートメントごと、行ごと、又は抽象構文木のサブツリー単位ごと等である。疑惑値とは、いずれかのテストケースに不合格の原因の箇所である可能性の高さを示す指標である。
【００２１】
続いて、コード修正部１２は、対象コードの修正処理を実行する（Ｓ１０３）。当該修正処理では、テストスイートに含まれるテストケースのうち、合格したテストケースの数に加えてコード規約を満たしている程度が考慮された評価値を出力する評価関数を用いた遺伝的アルゴリズムが対象コードに対して適用されて、対象コードが修正される。その結果、全テストケースに合格するプログラムコード（以下、「修正コード」という。）の中で、１以上のコード規約を満たしている程度が相対的に高いプログラムコードが生成される。ここで、コード規約とは、プログラムコードの記述に対して開発プロジェクト等において予め定義された規約をいう。例えば、コード規約を示す情報は、予め補助記憶装置１０２等に記憶されていてもよい。
【００２２】
続いて、コード修正部１２は、修正コードを出力する（Ｓ１０４）。例えば、修正コードが補助記憶装置１０２に記憶されてもよいし、ネットワークを介して所定の記憶装置へ送信されてもよい。
【００２３】
続いて、ステップＳ１０３の詳細について説明する。図５は、プログラムコードの修正処理の処理手順の一例を説明するためのフローチャートである。
【００２４】
ステップＳ２０１において、コード修正部１２は、対象コード、同定結果（対象コードの部分ごとの疑惑値）、及び対象テストスイートを読み込む。
【００２５】
続いて、コード修正部１２は、遺伝的アルゴリズムを用いたバグ修正の手法（例えば、非特許文献１）を用いて、各旧世代バリアントについて変異又は交叉により複数通りの新世代バリアントを生成する（Ｓ２０２）。但し、最初の世代については（すなわち、ステップＳ２０２が最初に実行される際には）、ステップＳ２０１において読み込まれた対象コードからの変異により、対象コードに対する複数通りの新世代バリアントが生成される。なお、バリアントとは、プログラムコードの一部分（複数箇所の場合もある）を書き換えることで新たに生成されるプログラムコードをいう。
【００２６】
図６は、バリアントの一例を示す図である。図６には、プログラムコードｐ１に対して２種類の変異が行われて、２つのバリアントｖ１及びｖ２が生成される例が示されている。なお、バリアントｖ１及びｖ２において、破線によって囲まれた部分が変異部分に相当する。
【００２７】
続いて、新世代バリアント群を構成するバリアントごとにループＬ１が実行される。以下、ループＬ１において処理対象とされているバリアントを「対象バリアント」という。
【００２８】
ステップＳ２０３において、コード修正部１２は、対象バリアントに対して対象テストスイートに含まれる各テストケースを実行して、対象テストスイートに含まれる複数のテストケースのうち合格したテストケースの数に基づく（比例する）指標（例えば、テストケースの総数に対する合格したテストケースの数の割合）を出力する。以下、当該指標を「合格率」という。
【００２９】
続いて、コード修正部１２は、１以上のコード規約について、対象バリアントが満たしている程度（コード規約に沿っている程度）を評価し、評価結果を出力する（Ｓ２０４）。斯かる評価は、例えば、プログラムコードの静的解析によって可能であり、公知のツール等を用いて行われてもよい。
【００３０】
続いて、コード修正部１２は、評価関数を用いて対象バリアントの評価値を計算する（Ｓ２０５）。本実施の形態では、合格率に加えてコード規約を満たしている（コード規約に沿っている）程度（度合い）も評価値に反映されるような評価関数が用いられる。例えば、以下のような評価関数が一例として挙げられる。
評価値＝０．５×（合格したテストケース数／全テストケース数）＋０．５×（違反していないコード規約の数）／（コード規約の総数）
このように、当該評価関数は、合格率と、コード規約を満たしている程度との加重和によって評価値を計算する関数である。なお、上記のように、コード規約を満たしている程度は、コード規約の総数と、違反していないコード規約の数とに基づいて算出される。例えば、Ａ、Ｂ、Ｃの３つのコード規約が有る場合、コード規約の総数は３である。また、違反していないコード規約の数とは、Ｂ及びＣに関する違反がそれぞれ１箇所以上検出され、Ａに関する違反が検出されなかった場合、１である。したがって、この場合、上記評価関数において、コード規約を満たしている程度は、１／３となる。
【００３１】
なお、上記の評価関数は一例にすぎない。同趣旨の範囲で変形された他の式によって評価関数が定義されてもよい。
【００３２】
続いて、コード修正部１２は、評価値が閾値以上であるか否かを判定する（Ｓ２０６）。評価値が閾値未満である場合（Ｓ２０６でＮｏ）、コード修正部１２は、対象バリアントを削除する（Ｓ２０７）。すなわち、この場合、対象バリアントは次の世代には残されない。
【００３３】
一方、評価値が閾値以上である場合（Ｓ２０６でＹｅｓ）、コード修正部１２は、対象バリアントを次の世代に残す（Ｓ２０８）。すなわち、この場合、以降に実行されるステップＳ２０２において、対象バリアントは、旧世代バリアント群（新世代バリアントの生成元）を構成することになる。
【００３４】
新世代バリアント群を構成する全てのバリアントについてループＬ１が実行されると、コード修正部１２は、ステップＳ２０８において次の世代に残されたバリアントの中で、テストスイートに含まれる全てのテストケースに合格したバリアントの有無を判定する（Ｓ２０９）。該当するバリアントが無い場合（Ｓ２０９でＮｏ）、ステップＳ２０２へ戻る。
【００３５】
該当するバリアントが１以上有る場合（Ｓ２０９でＹｅｓ）、コード修正部１２は、該当するバリアントの中からいずれか１つを出力対象として選択する（Ｓ２１０）。なお、出力対象は、ランダムに選択されてもよいし、評価値が最も高いバリアントが選択されてもよい。又は、該当する全てのバリアントが出力対象として選択されてもよい。ここで選択されたバリアントが、図４のステップＳ１０４において出力される。
【００３６】
上述したように、本実施の形態によれば、既存手法における遺伝的アルゴリズムの評価関数を改良し、「合格したテストケースの数」に加え「コード規約を満たしている程度」も評価の対象とすることで、全テストケースに合格するだけではなく、なるべくコード規約にも沿ったプログラムコードを修正結果として得ることができる。すなわち、プログラムコードに対して実用性の高い修正を可能とすることができる。
【００３７】
なお、バグ同定部１１及びコード修正部１２のそれぞれは、異なるコンピュータを用いて実現されてもよい。この場合、コード修正部１２として機能するコンピュータには、バグ同定部１１として機能するコンピュータから出力された同定結果と、プログラムコード及びテストスイートとが入力されればよい。
【００３８】
なお、本実施の形態において、コード修正部１２は、修正部の一例である。
【００３９】
以上、本発明の実施の形態について詳述したが、本発明は斯かる特定の実施形態に限定されるものではなく、特許請求の範囲に記載された本発明の要旨の範囲内において、種々の変形・変更が可能である。
【符号の説明】
【００４０】
１０          プログラム修正装置
１１          バグ同定部
１２          コード修正部
１００        ドライブ装置
１０１        記録媒体
１０２        補助記憶装置
１０３        メモリ装置
１０４        ＣＰＵ
１０５        インタフェース装置
１０６        表示装置
１０７        入力装置
Ｂ            バス
【図１】
2020004003.tif 000003
【図２】
2020004003.tif 000004
【図３】
2020004003.tif 000005
【図４】
2020004003.tif 000006
【図５】
2020004003.tif 000007
【図６】
2020004003.tif 000008