(57)【要約】      （修正有）【課題】ソースコードにおいてバグを含んでいる可能性の高い箇所を自動的に推定可能とする評価プログラムを提供する。【解決手段】ソースコード評価装置１０において、第１のソースコードと第１のソースコードの変更後の第２のソースコードとの差分となる記述を検出し、検出された差分の内容に基づいて、前記差分がバグの修正によるものであるか否かを判定する差分検出部１１と、差分となる記述を字句に分割し、各字句の種別に応じて定義された数値を記述における各字句の順番で配列したベクトルを生成する生成部１２と、前記ベクトルと差分検出部による判定結果との関係を学習する学習部１３と、第３のソースコードのいずれかの記述について前記ベクトルを生成し、当該ベクトルと学習部による学習結果とに基づいて、記述にバグが含まれている可能性を評価する認識部１５と、をコンピュータに実行させる。【選択図】図２
2018018197.tif 000002
【特許請求の範囲】
【請求項１】
第１のソースコードと前記第１のソースコードの変更後の第２のソースコードとの差分となる記述を検出し、検出された差分の内容に基づいて、前記差分がバグの修正によるものであるか否かを判定する差分検出部と、
前記差分となる記述を字句に分割し、前記各字句の種別に応じて定義された数値を前記記述における前記各字句の順番で配列したベクトルを生成する生成部と、
前記ベクトルと前記差分検出部による判定結果との関係を学習する学習部と、
第３のソースコードのいずれかの記述について前記ベクトルを生成し、当該ベクトルと前記学習部による学習結果とに基づいて、当該記述にバグが含まれている可能性を評価する評価部と、
としてコンピュータを機能させることを特徴とするソースコード評価プログラム。
【請求項２】
ソースコードにおける関連性が相対的に高い前記各種別に対応する数値の違いが相対的に小さくなり、ソースコードにおける関連性が相対的に低い前記各種別に対応する数値の違いが相対的に大きくなるように前記種別に応じた数値が定義されている、
ことを特徴とする請求項１記載のソースコード評価プログラム。
【請求項３】
前記学習部は、前記ベクトルの中央に配置されている数値から前後方向に所定数の数値を抽出し、抽出された数値のベクトルと前記差分検出部による判定結果との関係を学習する、
ことを特徴とする請求項１又は２記載のソースコード評価プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソースコード評価プログラムに関する。
【背景技術】
【０００２】
ソフトウェア開発において、バグの検出作業は、ソフトウェアの品質を確保するために重要な作業である。
【０００３】
一般的に、バグの検出は、開発者等によって作成されたテスト仕様書に基づくテストの実施により行われている。このような作業は、作業者に対する作業負担が大きく、効率性に難が有る。
【０００４】
そこで、従来、バグの検出を支援するための技術が検討されている（例えば、非特許文献１、非特許文献２）。
【先行技術文献】
【非特許文献】
【０００５】
【非特許文献１】Y. Higo, K. Murao, S. Kusumoto, K. Inoue, "Predicting Fault-Prone Modules Based on Metrics Transitions", DEFECTS '08.
【非特許文献２】S. Kim, T. Zimmermann, E.J. Whitehead, and A. Zeller, "Predicting faults from cached history," ICSE '07.
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、上記の従来技術では、バグを含んでいそうな箇所を、行単位又は文単位等の詳細な単位で自動的に推定するのが困難であった。
【０００７】
本発明は、上記の点に鑑みてなされたものであって、ソースコードにおいてバグを含んでいる可能性の高い箇所を自動的に推定可能とすることを目的とする。
【課題を解決するための手段】
【０００８】
そこで上記課題を解決するため、ソースコード評価プログラムは、第１のソースコードと前記第１のソースコードの変更後の第２のソースコードとの差分となる記述を検出し、検出された差分の内容に基づいて、前記差分がバグの修正によるものであるか否かを判定する差分検出部と、前記差分となる記述を字句に分割し、前記各字句の種別に応じて定義された数値を前記記述における前記各字句の順番で配列したベクトルを生成する生成部と、前記ベクトルと前記差分検出部による判定結果との関係を学習する学習部と、第３のソースコードのいずれかの記述について前記ベクトルを生成し、当該ベクトルと前記学習部による学習結果とに基づいて、当該記述にバグが含まれている可能性を評価する評価部と、としてコンピュータを機能させる。
【発明の効果】
【０００９】
ソースコードにおいてバグを含んでいる可能性の高い箇所を自動的に推定可能とすることができる。
【図面の簡単な説明】
【００１０】
【図１】本発明の実施の形態におけるソースコード評価装置のハードウェア構成例を示す図である。
【図２】本発明の実施の形態におけるソースコード評価装置の機能構成例を示す図である。
【図３】学習処理の処理手順の一例を説明するためのフローチャートである。
【図４】差分の検出とバグ修正有無ラベルの付与とを説明するための図である。
【図５】字句ベクトルの生成を説明するための図である。
【図６】字句ベクトルとバグ修正有無ラベルとの関係の学習を説明するための図である。
【図７】ニューラルネットワークの一例を示す図である。
【図８】ソースコードの評価処理の処理手順の一例を説明するためのフローチャートである。
【発明を実施するための形態】
【００１１】
以下、図面に基づいて本発明の実施の形態を説明する。図１は、本発明の実施の形態におけるソースコード評価装置のハードウェア構成例を示す図である。図１のソースコード評価装置１０は、それぞれバスＢで相互に接続されているドライブ装置１００、補助記憶装置１０２、メモリ装置１０３、ＣＰＵ１０４、インタフェース装置１０５、表示装置１０６、及び入力装置１０７等を有する。
【００１２】
ソースコード評価装置１０での処理を実現するプログラムは、ＣＤ−ＲＯＭ等の記録媒体１０１によって提供される。プログラムを記憶した記録媒体１０１がドライブ装置１００にセットされると、プログラムが記録媒体１０１からドライブ装置１００を介して補助記憶装置１０２にインストールされる。但し、プログラムのインストールは必ずしも記録媒体１０１より行う必要はなく、ネットワークを介して他のコンピュータよりダウンロードするようにしてもよい。補助記憶装置１０２は、インストールされたプログラムを格納すると共に、必要なファイルやデータ等を格納する。
【００１３】
メモリ装置１０３は、プログラムの起動指示があった場合に、補助記憶装置１０２からプログラムを読み出して格納する。ＣＰＵ１０４は、メモリ装置１０３に格納されたプログラムに従ってソースコード評価装置１０に係る機能を実現する。インタフェース装置１０５は、ネットワークに接続するためのインタフェースとして用いられる。表示装置１０６はプログラムによるＧＵＩ（Graphical User Interface）等を表示する。入力装置１０７はキーボード及びマウス等で構成され、様々な操作指示を入力させるために用いられる。
【００１４】
図２は、本発明の実施の形態におけるソースコード評価装置の機能構成例を示す図である。図２において、ソースコード評価装置１０は、差分検出部１１、字句ベクトル生成部１２、学習部１３、評価対象解析部１４、及び認識部１５等を有する。これら各部は、ソースコード評価装置１０にインストールされた１以上のプログラムが、ＣＰＵ１０４に実行させる処理により実現される。ソースコード評価装置１０は、また、ＶＣＳリポジトリ１２１、差分記憶部１２２、ラベル記憶部１２３、字句ＤＢ１２４、字句ベクトル記憶部１２５、及び学習情報記憶部１２６を利用する。これら各種記憶部は、例えば、メモリ装置１０３、補助記憶装置１０２、又はソースコード評価装置１０にネットワークを介して接続可能な記憶装置等を用いて実現可能である。
【００１５】
ＶＣＳリポジトリ１２１は、非図示のバージョン管理システム（ＶＣＳ（Version Control System））のリポジトリである。例えば、ＶＣＳリポジトリ１２１には、ソースコードのファイルとその変更履歴やリビジョン番号等が記憶されている。
【００１６】
差分検出部１１は、ＶＣＳリポジトリ１２１に記憶されている情報に基づいて、ソースコードの変更前後（改版前後）の差分を検出する。検出された差分に関する情報は、差分記憶部１２２に記憶される。差分検出部１１は、また、差分ごとに、当該差分の内容に基づいて、当該差分がバグの修正によるものであるか否かを判定し、判定結果を示すラベル（以下、「バグ修正有無ラベル」という。）を各差分に関連付けてラベル記憶部１２３に記憶する。
【００１７】
字句ベクトル生成部１２は、差分記憶部１２２に記憶された各差分について、当該差分となる記述（ソースコード上の記述）を字句（トークン）に分割する。字句ベクトル生成部１２は、各字句の種別に応じて定義された数値を、差分となる記述における各字句の順番で配列したベクトルを生成する。以下、当該ベクトルを「字句ベクトル」という。生成された字句ベクトルは、字句ベクトル記憶部１２５に記憶される。なお、字句の種別に応じて定義された数値は、字句ＤＢ１２４に記憶されている。
【００１８】
学習部１３は、各字句ベクトルと、当該字句ベクトルの生成元の差分に関連付けられているバグ修正有無ラベルとの関係を学習し、学習結果を学習情報記憶部１２６に記憶する。
【００１９】
評価対象解析部１４は、バグの有無の評価対象とされたソースコードの或る箇所（或る行、或る文、又は或る式等）について、字句ベクトルを生成する。
【００２０】
認識部１５は、評価対象解析部１４によって生成された字句ベクトルを、学習情報記憶部１２６に記憶されている学習結果に適用して、当該字句ベクトルに対応する箇所にバグが含まれている可能性を評価する。
【００２１】
以下、ソースコード評価装置１０が実行する処理手順について説明する。図３は、学習処理の処理手順の一例を説明するためのフローチャートである。図３の処理手順は、例えば、ユーザによって学習実施の指示が入力されると開始される。
【００２２】
ステップＳ１０１において、差分検出部１１は、或るプログラムの全てのソースコードについて、ＶＣＳリポジトリ１２１に記憶されている、改版前後の２つのリビジョンごとに差分を検出（抽出）し、検出された差分を差分記憶部１２２に記憶する。なお、差分は、例えば、ｄｉｆｆの出力形式で生成されてもよい。
【００２３】
続いて、差分検出部１１は、検出された差分ごとに、当該差分の内容に基づいて、当該差分がバグ修正によるものであるか否かを判定し、判定結果を示すバグ修正有無ラベルを当該差分に付与する（Ｓ１０２）。付与されたバグ修正有無ラベルは、各差分に関連付けられてラベル記憶部１２３に記憶される。差分とバグ修正有無ラベルとの関連付けは、例えば、差分記憶部１２２に記憶された各差分の識別情報（以下、「差分ＩＤ」という。）と、修正有無ラベルとの関連付けによって実現されてもよい。
【００２４】
図４は、差分の検出とバグ修正有無ラベルの付与とを説明するための図である。図４には、リビジョン１〜リビジョン６の変更履歴を有する或るソースコードについて、前後の２つのリビジョンごと（すなわち、変更前のリビジョンＮ及び変更後のリビジョンＮ＋１ごと）に差分が検出される例が示されている。具体的には、リビジョン１とリビジョン２との差分として、差分ｄ１が検出され、リビジョン２とリビジョン３との差分として、差分ｄ２が検出され、リビジョン３とリビジョン４との差分として、差分ｄ３が検出されている。
【００２５】
差分の内容は、追加された記述、削除された記述である。図４では、追加された記述に対しては「＋」が付与され、削除された記述に対しては「−」が付与されている。なお、差分は、必ずしも行単位でなくてもよい。１文又は１つの式が複数行に跨る場合が有るからである。例えば、改行コードが検出されるまでの範囲を１つの単位として、当該単位ごとに差分が検出されてもよい。
【００２６】
また、図４では、各差分に対するバグ修正有無ラベルＬ１〜Ｌ３が示されている。バグ修正有無ラベルの値は、「バグ修正である」又は「バグ修正でない」のいずれかである。本実施の形態では、相互に対応する箇所について、減った記述と増えた記述の双方が存在する差分（すなわち、或る記述が他の記述に置き換わった箇所）について、「バグ修正である」と判定され、そうでない差分について、「バグ修正でない」と判定される。他の記述に置き換えられた箇所は、経験的にバグの修正である可能性が高いからである。
【００２７】
続いて、字句ベクトル生成部１２は、差分記憶部１２２に記憶された差分ごとに、当該差分の内容（ソースコードの記述）について字句解析を行って、当該記述を字句（トークン）に分割する（Ｓ１０３）。なお、「バグ修正である」のバグ修正有無ラベルが付与された差分については、削除された記述と追加された記述とが含まれている。この場合、削除された記述が各字句に分割される。
【００２８】
続いて、字句ベクトル生成部１２は、各字句について、当該字句の種別（識別子、変数の基本型、制御構造を表すキーワード、括弧など）に対応付けられて字句ＤＢ１２４に記憶されている数値を取得する（Ｓ１０４）。続いて、字句ベクトル生成部１２は、取得された数値を、各字句の並び順に配列することで、字句ベクトルを生成し、当該字句ベクトルを字句ベクトル記憶部１２５に記憶する（Ｓ１０５）。各字句ベクトルは、生成元の差分の差分ＩＤに関連付けられて字句ベクトル記憶部１２５に記憶される。
【００２９】
図５は、字句ベクトルの生成を説明するための図である。図５では、差分ｄ２のうちの削除された記述が字句に分割され、各字句の種別（条件文、識別子）に対応した数値の配列が、字句ベクトルｖ２として生成される例が示されている。すなわち、字句ベクトルは、削除された記述について生成される。或る記述が他の記述に置き換えられた場合、当該或る記述（すなわち、削除された記述）にバグが含まれていた可能性が高いからである。
【００３０】
Ｎ個の字句から成る差分については、Ｎ次元の字句ベクトルが生成される。また、型や識別子等と、制御構造を表すキーワードや括弧等とで、数値には大きな差がつけられる。すなわち、ソースコードにおける関連性が相対的に高い各種別に対応する数値の違いが相対的に小さくなり、ソースコードにおける関連性が相対的に低い各種別に対応する数値の違いが相対的に大きくなるように種別に応じた数値が字句ＤＢ１２４に定義されている。そうすることで、記述ごとのパターンの違いを顕著なものとすることができ、ソースコードの意味合いを定義付けることができる。
【００３１】
具体的には、図５では、制御構造を表す「ｉｆ」の数値は、２００であり、他の字句の数値と大きく異なっている。また、「（」と「）」とは、対応関係を有するため、それぞれに対応する数値は１００、１０１であり、その差分は小さい。
【００３２】
続いて、学習部１３は、差分ごとに、字句ベクトル及びバグ修正有無ラベルの組を、学習アルゴリズムに入力し、字句ベクトルとバグ修正有無ラベルとの関係を学習する（Ｓ１０６）。すなわち、ソースコードの記述のパターンと、バグの有無との関係が学習される。学習部１３は、学習結果を学習情報記憶部１２６に記憶する。なお、学習は、例えば、教師あり二値分類器を利用して行われる。
【００３３】
図６は、字句ベクトルとバグ修正有無ラベルとの関係の学習を説明するための図である。図６では、差分ｄ２について生成された字句ベクトルｖ２と、差分ｄ２に対して付与されたバグ修正有無ラベルＬ２との関係が学習されて、学習結果が学習情報記憶部１２６に記憶される例が示されている。
【００３４】
例えば、教師あり二値分類器においてニューラルネットワークが用いられる場合、図７に示されるようなニューラルネットワークを規定するパラメータ（係数）が、学習情報記憶部１２６に記憶される。なお、ニューラルネットワークについては、例えば、「Rumelhart, David E.; Hinton, Geoffrey E.; Williams, Ronald J. (8 October 1986). "Learning representations by back-propagating errors". Nature 323 (6088): 533-536.」に詳しい。
【００３５】
なお、学習部１３は、字句ベクトルの次元数が、二値分類器の入力次元数（図７では６４字句）に足りないときは、字句ベクトルを中央に寄せて左右をゼロで埋めることで、字句ベクトルの次元数を拡張する。また、学習部１３は、字句ベクトルの次元数が、二値分類器の入力次元数よりも多いときは、字句ベクトルの中央に配置されている数値から前後方向に入力次元数分の字句を抽出することで、字句ベクトルの次元数を縮小する。すなわち、ソースコードの各行の長さにばらつきがあるところ、ソースコードとしての特徴は一部であっても捉えることができる。また、中央寄せにより、重要度の高い情報を中央に寄せることができるため、主要な特徴を反映させることで、精度の高い学習を行うことができる。
【００３６】
次に、学習情報記憶部１２６に記憶された学習結果に基づいて、或るソースコードについて、バグの有無の可能性を評価する処理について説明する。
【００３７】
図８は、ソースコードの評価処理の処理手順の一例を説明するためのフローチャートである。例えば、ユーザによって評価対象のソースコードが指定されて、評価の開始指示が入力されると、図８の処理が開始される。
【００３８】
ステップＳ２０１において、評価対象解析部１４は、評価対象のソースコードから所定の単位の記述（以下、「対象記述」という。）を入力する。所定の単位は、例えば、改行コードによって区分される単位である。
【００３９】
続いて、評価対象解析部１４は、対象記述について字句ベクトルを生成する（Ｓ２０２）。字句ベクトルの生成方法は、上記した通りである。
【００４０】
続いて、認識部１５は、生成された字句ベクトルに対して、学習情報記憶部１２６の学習結果を適用して、対象記述がバグを含んでいる可能性（バグの潜在可能性）を評価する（Ｓ２０３）。例えば、図７に示されるようなニューラルネットワークに対して、対象記述が入力されてもよい。この場合、認識部１５は、字句ベクトルの次元数が、二値分類器の入力次元数（図７では６４字句）に足りないときは、字句ベクトルを中央に寄せて左右をゼロで埋めることで、字句ベクトルの次元数を拡張する。また、認識部１５は、字句ベクトルの次元数が、二値分類器の入力次元数よりも多いときは、字句ベクトルの中央を取り出すことで、字句ベクトルの次元数を縮小する。
【００４１】
なお、評価対象のソースコードが新規のソースコードである場合、図８の処理手順は、当該ソースコードの各記述に対して最初から順番に実行されてもよい。一方、既存のソースコードに対して修正が行われた場合、修正された一部の記述に対して図８の処理が実行されてもよい。修正された記述は、ユーザによって指定されればよい。
【００４２】
上述したように、本実施の形態によれば、プログラムの製造開始以降に、ソースコードにおいてバグを含んでいる可能性の高い箇所を自動的に推定可能とすることができる。その結果、例えば、大規模ソフトウェアの開発においては、開発期間短縮等を可能とし、生産性の向上を期待することができる。
【００４３】
なお、本実施の形態において、字句ベクトル生成部１２は、生成部の一例である。認識部１５は、評価部の一例である。
【００４４】
以上、本発明の実施例について詳述したが、本発明は斯かる特定の実施形態に限定されるものではなく、特許請求の範囲に記載された本発明の要旨の範囲内において、種々の変形・変更が可能である。
【符号の説明】
【００４５】
１０          ソースコード評価装置
１１          差分検出部
１２          字句ベクトル生成部
１３          学習部
１４          評価対象解析部
１５          認識部
１００        ドライブ装置
１０１        記録媒体
１０２        補助記憶装置
１０３        メモリ装置
１０４        ＣＰＵ
１０５        インタフェース装置
１２１        ＶＣＳリポジトリ
１２２        差分記憶部
１２３        ラベル記憶部
１２４        字句ＤＢ
１２５        字句ベクトル記憶部
１２６        学習情報記憶部
Ｂ            バス
【図１】
2018018197.tif 000003
【図２】
2018018197.tif 000004
【図３】
2018018197.tif 000005
【図４】
2018018197.tif 000006
【図５】
2018018197.tif 000007
【図６】
2018018197.tif 000008
【図７】
2018018197.tif 000009
【図８】
2018018197.tif 000010