(57)【要約】      （修正有）【課題】ソースコード上のどの要素のミューテーションのテスト結果であるかを把握できる解析プログラム、解析方法および解析装置を提供する。【解決手段】解析装置１００は、ソースコード内の要素について、要素をミュータントに変化させるメタミューテーション関数に置換する際に、メタミューテーション関数のＩＤと、ソースコード内の要素の位置情報とを記憶部１２０に記憶する。解析装置１００は、要素がメタミューテーション関数に置換されたソースコードを中間コードにコンパイルして、中間コードに対してミューテーションを実行するとともにテストを実行する。解析装置１００は、要素がメタミューテーション関数に置換されたソースコードに対するテスト結果と、記憶部１２０に記憶されたＩＤおよび位置情報とに基づいて、要素とテスト結果とを対応付けて出力する。【選択図】図１
2017054453.tif 000002
【特許請求の範囲】
【請求項１】
ソースコード内の要素について、前記要素をミュータントに変化させるメタミューテーション関数に置換する際に、前記メタミューテーション関数のＩＤと、前記ソースコード内の前記要素の位置情報とを記憶部に記憶し、
前記要素が前記メタミューテーション関数に置換されたソースコードを中間コードにコンパイルして、前記中間コードに対してミューテーションを実行するとともにテストを実行し、
前記要素が前記メタミューテーション関数に置換されたソースコードに対するテスト結果と、前記記憶部に記憶された前記ＩＤおよび前記位置情報とに基づいて、前記要素と前記テスト結果とを対応付けて出力する、
処理をコンピュータに実行させることを特徴とする解析プログラム。
【請求項２】
前記ＩＤは、前記メタミューテーション関数の引数に含まれる、
ことを特徴とする請求項１に記載の解析プログラム。
【請求項３】
前記出力する処理は、前記テスト結果から前記ＩＤを抽出し、抽出した前記ＩＤに対応する前記位置情報と、抽出した前記ＩＤに対応する前記メタミューテーション関数によって置換された前記要素とに基づいて、前記要素と前記テスト結果とを対応付けて出力する、
ことを特徴とする請求項１または２に記載の解析プログラム。
【請求項４】
前記出力する処理は、前記テストによって検出されなかった前記ミュータントに対応する前記メタミューテーション関数によって置換された前記要素と、該要素の前記位置情報とを対応付けて出力する、
ことを特徴とする請求項１〜３のいずれか１つに記載の解析プログラム。
【請求項５】
前記出力する処理は、前記テストによって検出されなかった前記ミュータントと、該ミュータントに対応する前記メタミューテーション関数によって置換された前記要素と、該要素の前記位置情報と、前記ソースコード内の該要素の前記位置情報に対応する箇所とを表示する結果画面を出力する、
ことを特徴とする請求項４に記載の解析プログラム。
【請求項６】
ソースコード内の要素について、前記要素をミュータントに変化させるメタミューテーション関数に置換する際に、前記メタミューテーション関数のＩＤと、前記ソースコード内の前記要素の位置情報とを記憶部に記憶し、
前記要素が前記メタミューテーション関数に置換されたソースコードを中間コードにコンパイルして、前記中間コードに対してミューテーションを実行するとともにテストを実行し、
前記要素が前記メタミューテーション関数に置換されたソースコードに対するテスト結果と、前記記憶部に記憶された前記ＩＤおよび前記位置情報とに基づいて、前記要素と前記テスト結果とを対応付けて出力する、
処理をコンピュータが実行することを特徴とする解析方法。
【請求項７】
ソースコード内の要素について、前記要素をミュータントに変化させるメタミューテーション関数に置換する際に、前記メタミューテーション関数のＩＤと、前記ソースコード内の前記要素の位置情報とを記憶部に記憶する記憶処理部と、
前記要素が前記メタミューテーション関数に置換されたソースコードを中間コードにコンパイルして、前記中間コードに対してミューテーションを実行するとともにテストを実行するミューテーション部と、
前記要素が前記メタミューテーション関数に置換されたソースコードに対するテスト結果と、前記記憶部に記憶された前記ＩＤおよび前記位置情報とに基づいて、前記要素と前記テスト結果とを対応付けて出力する出力部と、
を有することを特徴とする解析装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、解析プログラム、解析方法および解析装置に関する。
【背景技術】
【０００２】
従来、ソフトウェアのテストを評価する方法として、プログラムの１要素を変化させることでバグを埋め込み、テストによって埋め込んだバグをどれだけ検出できるかを調べるミューテーション解析という方法がある。ミューテーション解析では、要素を変化させたものであるミュータントを網羅的に生成するために、ミューテーションを行ったソースコードをそれぞれコンパイルして実行するので、処理に時間がかかっていた。このため、要素を複数のミュータントに置き換えてミューテーションを行うことに代えて、パラメータを与えることで具体的なミュータントを表す関数であるメタミューテーション関数に置き換えることで、コンパイルのコストを抑えることが提案されている。この様にメタミューテーション関数に置き換える方法は、ＭＳＧ（Mutant  Schema  Generation）と呼ばれている。ＭＳＧは、例えば、論文（R.H.Untch,  A.J.Offutt,  and  M.J.Harrold,  “Mutation  analysis  using  mutant  schemata,”  ISSTA,  1993.）により提案されている。
【０００３】
また、ソースコードからコンパイルされた中間コード（Bitcode,Bytecode）について、ＶＭ（Virtual  Machine）上でミューテーションを行うことで、ＭＳＧよりもプロセス起動回数を減らすことが提案されている。ＶＭ上でミューテーションを行う方法は、ビットコードミューテーション（Bitcode  Mutation）、または、バイトコードトランスレーション（Bytecode  Translation）と呼ばれている。ビットコードミューテーションは、例えば、論文（Y.-S.Ma,  A.J.Offutt,  and  Y.-R.Kwon,  “MuJava:  An  Automated  Class  Mutation  System,”  STVR,  2005.）により提案されている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０００−２２２２４４号公報
【特許文献２】特開２０１３−２１８４９２号公報
【特許文献３】特開２００１−１７５４８７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、ビットコードやバイトコード等の中間コードは、ソースコードと１対１対応ではないため、中間コードへのミューテーションがソースコード上のどの要素のミューテーションと対応するのかわからない場合がある。すなわち、中間コードのミューテーションのテスト結果がソースコード上のどの要素のミューテーションのテスト結果であるかを把握することが困難である。
【０００６】
一つの側面では、本発明は、ソースコード上のどの要素のミューテーションのテスト結果であるかを把握できる解析プログラム、解析方法および解析装置を提供することにある。
【課題を解決するための手段】
【０００７】
一つの態様では、解析プログラムは、ソースコード内の要素について、前記要素をミュータントに変化させるメタミューテーション関数に置換する際に、前記メタミューテーション関数のＩＤと、前記ソースコード内の前記要素の位置情報とを記憶部に記憶する処理をコンピュータに実行させる。解析プログラムは、前記要素が前記メタミューテーション関数に置換されたソースコードを中間コードにコンパイルして、前記中間コードに対してミューテーションを実行するとともにテストを実行する処理をコンピュータに実行させる。解析プログラムは、前記要素が前記メタミューテーション関数に置換されたソースコードに対するテスト結果と、前記記憶部に記憶された前記ＩＤおよび前記位置情報とに基づいて、前記要素と前記テスト結果とを対応付けて出力する処理をコンピュータに実行させる。
【発明の効果】
【０００８】
ソースコード上のどの要素のミューテーションのテスト結果であるかを把握できる。
【図面の簡単な説明】
【０００９】
【図１】図１は、実施例の解析装置の構成の一例を示すブロック図である。
【図２】図２は、ミューテーション解析の一例を説明する図である。
【図３】図３は、ミューテーション解析の実行コストの一例を説明する図である。
【図４】図４は、ＭＳＧの一例を説明する図である。
【図５】図５は、ビットコードミューテーションの一例を説明する図である。
【図６】図６は、ソースコードとビットコードとの対応の一例を説明する図である。
【図７】図７は、最適化によるミュータントの消失の一例を説明する図である。
【図８】図８は、実施例のビットコードミューテーションの一例を説明する図である。
【図９】図９は、実施例の結果レポート生成の一例を説明する図である。
【図１０】図１０は、メタミューテーション情報記憶部の一例を示す図である。
【図１１】図１１は、ミュータント記憶部の一例を示す図である。
【図１２】図１２は、テスト結果記憶部の一例を示す図である。
【図１３】図１３は、ソースコードの一例を示す図である。
【図１４】図１４は、置換後のソースコードの一例を示す図である。
【図１５】図１５は、ソースコードとビットコードとのミューテーション箇所の対応の一例を示す図である。
【図１６】図１６は、テスト項目の一例を示す図である。
【図１７】図１７は、ミューテーションオペレータリストの一例を示す図である。
【図１８】図１８は、ビットコードとミューテーション後の命令との関係の一例を示す図である。
【図１９】図１９は、結果画面の一例を示す図である。
【図２０】図２０は、実施例の解析処理の一例を示すフローチャートである。
【図２１】図２１は、置換処理の一例を示すフローチャートである。
【図２２】図２２は、ミューテーション実行処理の一例を示すフローチャートである。
【図２３】図２３は、出力処理の一例を示すフローチャートである。
【図２４】図２４は、解析プログラムを実行するコンピュータの一例を示す図である。
【発明を実施するための形態】
【００１０】
以下、図面に基づいて、本願の開示する解析プログラム、解析方法および解析装置の実施例を詳細に説明する。なお、本実施例により、開示技術が限定されるものではない。また、以下の実施例は、矛盾しない範囲で適宜組みあわせてもよい。
【実施例】
【００１１】
図１は、実施例の解析装置の構成の一例を示すブロック図である。図１に示す解析装置１００は、ソースコードが入力されると、ソースコード内の要素について、要素をミュータントに変化させるメタミューテーション関数に置換する。解析装置１００は、要素をメタミューテーション関数に置換する際に、メタミューテーション関数のＩＤ（IDentifier）と、ソースコード内の要素の位置情報とを記憶部１２０に記憶する。解析装置１００は、要素がメタミューテーション関数に置換されたソースコードを中間コードにコンパイルし、中間コードに対してミューテーションを実行するとともにテストを実行する。解析装置１００は、要素がメタミューテーション関数に置換されたソースコードに対するテスト結果と、記憶部１２０に記憶されたＩＤおよび位置情報とに基づいて、要素とテスト結果とを対応付けて出力する。これにより、解析装置１００は、ソースコード上のどの要素のミューテーションのテスト結果であるかを把握できる。
【００１２】
ここで、ミューテーション解析について説明する。図２は、ミューテーション解析の一例を説明する図である。図２に示すように、ミューテーション解析では、テスト対象プログラムであるソースコード１０の要素に対して、ミューテーションが行われる。ソースコード１０ａは、例えば、ソースコード１０に対して「ｍｕｔａｎｔ１」で示すミューテーションが行われたソースコードである。「ｍｕｔａｎｔ１」は、例えば、２行目の「＜＝」を「＞」に変化させる。すなわち、ソースコード１０ａでは、ソースコード１０と比べて、ミューテーション箇所１１で示す部分が変化している。
【００１３】
同様に、ソースコード１０ｂは、例えば、ソースコード１０に対して「ｍｕｔａｎｔ２」で示すミューテーションが行われたソースコードである。「ｍｕｔａｎｔ２」は、例えば、２行目の「０」を「１」に変化させる。すなわち、ソースコード１０ｂでは、ソースコード１０と比べて、ミューテーション箇所１２で示す部分が変化している。同様に、ソースコード１０ｃは、例えば、ソースコード１０に対して「ｍｕｔａｎｔ３」で示すミューテーションが行われたソースコードである。「ｍｕｔａｎｔ３」は、例えば、３行目の「−」を「−−」に変化させる。すなわち、ソースコード１０ｃでは、ソースコード１０と比べて、ミューテーション箇所１３で示す部分が変化している。
【００１４】
これらのミューテーションされたソースコード１０ａ〜１０ｃに対して、あるテストを実行した結果がテスト結果１４である。例えば「Ｔｅｓｔ１」では、「ａｂｓ」に「２」が入力されて「２」が出力されると「ｐａｓｓ」とし、「２」以外が出力されると「ｆａｉｌ」とする。また、例えば「Ｔｅｓｔ２」では、「ａｂｓ」に「−２」が入力されて「２」が出力されると「ｐａｓｓ」とし、「２」以外が出力されると「ｆａｉｌ」とする。このとき、「ｍｕｔａｎｔ１」〜「ｍｕｔａｎｔ３」のそれぞれの結果は、テスト結果１４に示す通りとなる。
【００１５】
「ｍｕｔａｎｔ１」は、「Ｔｅｓｔ１」および「Ｔｅｓｔ２」のいずれも「ｆａｉｌ」となり、埋め込まれたバグを検出できるので「ｋｉｌｌｅｄ」となる。「ｍｕｔａｎｔ２」は、「Ｔｅｓｔ１」および「Ｔｅｓｔ２」のいずれも「ｐａｓｓ」となり、埋め込まれたバグを検出できないので「ｕｎｋｉｌｌｅｄ」となる。「ｍｕｔａｎｔ３」は、「Ｔｅｓｔ１」が「ｐａｓｓ」、「Ｔｅｓｔ２」が「ｆａｉｌ」となり、埋め込まれたバグを検出できるので「ｋｉｌｌｅｄ」となる。この結果、「ｋｉｌｌｅｄ」となったミュータントの割合を示すミューテーションスコア（mutation  score）は、２／３＝０．６６７となる。
【００１６】
次に、ミューテーション解析の実行コストについて説明する。図３は、ミューテーション解析の実行コストの一例を説明する図である。図３に示すように、ミューテーション解析では、ソースコード２１をミューテーションしたソースコード群２２を、それぞれコンパイルして実行ファイル群２３を生成する。ミューテーション解析では、さらに、生成した実行ファイル群２３についてテストを実行し、テスト結果群２４を得る。このときのミューテーション解析の実行時間は、合計時間＝（ミュータント数）×（ミューテーション時間＋コンパイル時間）＋（ミュータント数）×（テスト項目数）×（１回の実行時間）となる。すなわち、図３に示すミューテーション解析の実行時間は、ミュータントを網羅的に生成するため、多くの時間がかかってしまうことになる。
【００１７】
これに対し、ＭＳＧを適用した場合について説明する。図４は、ＭＳＧの一例を説明する図である。図４に示すように、ＭＳＧでは、図３に示すミューテーションに代えて、要素を、パラメータを与えることで具体的なミュータントを表す関数であるメタミューテーション関数に置き換えることでコンパイルのコストを抑える。図４の例では、ソースコード３１の要素をメタミューテーション関数に置き換えたソースコード３２をコンパイルし、実行ファイル３３を生成する。図４の例では、実行ファイル３３に対してインスタンス化、つまりパラメータを付与して実行ファイル群３４を生成し、生成した実行ファイル群３４についてテストを実行してテスト結果群３５を得る。ＭＳＧでは、実行ファイル３３を実行するタイミング、すなわち、バイナリ状態でミュータントを切り替える。図４の例では、実行ファイル群３４の各実行ファイルにかかるプロセスを、それぞれ起動するので、処理が重くなる。
【００１８】
これに対して、中間コードをＶＭ上でミューテーションする場合について説明する。図５は、ビットコードミューテーションの一例を説明する図である。図５に示すように、ビットコードミューテーションでは、中間コードであるビットコードをＶＭ上でミューテーションを行うことで、ＭＳＧよりもプロセス起動回数を減らすことができる。なお、中間コードは、ビットコードの他に、バイトコードトランスレーションを用いてもよい。図５の例では、ソースコード４１をビットコード４２にコンパイルし、ミューテーションしたビットコード４２についてＶＭ群４３でテストを実行し、テスト結果群４４を得る。ところが、ビットコードやバイトコード等の中間コードは、ソースコードと１対１対応ではないため、中間コードへのミューテーションがソースコード上のどの要素のミューテーションと対応するのかわからない場合がある。すなわち、中間コードのミューテーションのテスト結果が、ソースコード上のどの要素のミューテーションのテスト結果であるかを把握することが困難である。
【００１９】
図６は、ソースコードとビットコードとの対応の一例を説明する図である。図６に示すように、例えば、ビットコード４５は、同一の動作を示すソースコード４６とソースコード４７のうち、どちらのソースコードから生成されたものであるかについて、ビットコード４５からはわからない。つまり、ビットコード４５と、ソースコード４６、４７とは、ビットコード４５へのミューテーションがソースコード４６、４７上のどの要素のミューテーションと対応するのか不明となっている。
【００２０】
また、コンパイル時の最適化によってミュータントが消失する場合もある。図７は、最適化によるミュータントの消失の一例を説明する図である。図７に示すように、例えば、元のソースコード４８ａをビットコードにコンパイルすると、ビットコード４９ａとなる。このとき、元のソースコード４８ａに対して、シフト演算子をミュータントとしてミューテーションを行った、すなわちシフト演算子の置換を行ったソースコード４８ｂをビットコードにコンパイルすると、ビットコード４９ｂとなる。図７の例では、ソースコードからビットコードへのコンパイルの際に、定数の演算など冗長なプログラム要素が削除される等の最適化が行われる。このため、ビットコード４９ａ、４９ｂでは、シフト演算子が見えなくなってしまい、ビットコードレベルでのシフト演算子の置換が適用できなくなる。
【００２１】
上述の様な課題に対して、本実施例では、メタミューテーション関数のＩＤ（メタミューテーションＩＤ）と、ソースコード内の要素の位置情報とを対応付けて記憶することで、中間コードとソースコードとの間で要素の１対１対応をとることができる。図８は、実施例のビットコードミューテーションの一例を説明する図である。図８に示すように、本実施例のビットコードミューテーションでは、ソースコード５１に対して要素をメタミューテーション関数に置換するメタミューテーションを行ってソースコード５２を生成し、メタミューテーション情報５３を記憶部１２０に記憶しておく。本実施例のビットコードミューテーションでは、ソースコード５２をビットコード５３にコンパイルし、ミューテーションしたビットコード５３についてＶＭ群５４でテストを実行し、テスト結果群５５を得る。本実施例のビットコードミューテーションでは、メタミューテーション情報５３とテスト結果群５５とに基づいて、結果レポート５６を得る。
【００２２】
結果レポート５６の生成について図９を用いて説明する。図９は、実施例の結果レポート生成の一例を説明する図である。図９に示すように、本実施例のビットコードミューテーションでは、メタミューテーション情報５３とテスト結果群５５とに基づいて出力処理を実行する。出力処理では、テスト結果群５５に含まれるメタミューテーションＩＤを、メタミューテーション情報５３から検索して対応するソースコード位置情報を取得する。出力処理では、例えば、ミューテーションスコア、「ｕｎｋｉｌｌｅｄ」となったミュータントに係るオリジナルの要素、ミュータントおよびソースコード位置情報等を含む結果レポート５６を生成する。すなわち、本実施例のビットコードミューテーションでは、テスト結果が「ｕｎｋｉｌｌｅｄ」となったソースコード上の要素およびミュータントを把握できる。
【００２３】
次に、図１の説明に戻って、解析装置１００の構成について説明する。図１に示すように、解析装置１００は、通信部１１０と、入力部１１１と、表示部１１２と、操作部１１３と、記憶部１２０と、制御部１３０とを有する。なお、解析装置１００は、図１に示す機能部以外にも既知のコンピュータが有する各種の機能部、例えば各種の入力デバイスや音声出力デバイス等の機能部を有することとしてもかまわない。
【００２４】
通信部１１０は、例えば、ＮＩＣ（Network  Interface  Card）等によって実現される。通信部１１０は、図示しないネットワークを介して他の情報処理装置と有線または無線で接続され、他の情報処理装置との間で情報の通信を司る通信インタフェースである。通信部１１０は、例えば、他の情報処理装置から解析対象のソースコード、テスト項目およびミューテーションオペレータリストを受信する。通信部１１０は、受信した解析対象のソースコード、テスト項目およびミューテーションオペレータリストを制御部１３０に出力する。
【００２５】
入力部１１１は、例えば、光学ディスク、ＵＳＢ（Universal  Serial  Bus）メモリ、ＳＤメモリカード等の外部記憶媒体に対する媒体アクセス装置等によって実現される。入力部１１１は、外部記憶媒体に記憶された解析対象のソースコード、テスト項目およびミューテーションオペレータリストを読み取って、読み取った解析対象のソースコード、テスト項目およびミューテーションオペレータリストを制御部１３０に出力する。なお、解析対象のソースコード、テスト項目およびミューテーションオペレータリストは、通信部１１０または入力部１１１のいずれかから制御部１３０に入力されればよく、以下の説明では、入力部１１１から制御部１３０に入力される場合について説明する。
【００２６】
表示部１１２は、各種情報を表示するための表示デバイスである。表示部１１２は、例えば、表示デバイスとして液晶ディスプレイ等によって実現される。表示部１１２は、制御部１３０から入力された結果画面等の各種画面を表示する。
【００２７】
操作部１１３は、解析装置１００のユーザから各種操作を受け付ける入力デバイスである。操作部１１３は、例えば、入力デバイスとして、キーボードやマウス等によって実現される。操作部１１３は、ユーザによって入力された操作を操作情報として制御部１３０に出力する。なお、操作部１１３は、入力デバイスとして、タッチパネル等によって実現されるようにしてもよく、表示部１１２の表示デバイスと、操作部１１３の入力デバイスとは、一体化されるようにしてもよい。
【００２８】
記憶部１２０は、例えば、ＲＡＭ（Random  Access  Memory）、フラッシュメモリ（Flash  Memory）等の半導体メモリ素子、ハードディスクや光ディスク等の記憶装置によって実現される。記憶部１２０は、メタミューテーション情報記憶部１２１と、命令記憶部１２２と、ミュータント記憶部１２３と、テスト結果記憶部１２４とを有する。また、記憶部１２０は、制御部１３０での処理に用いる情報を記憶する。
【００２９】
メタミューテーション情報記憶部１２１は、メタミューテーション関数のＩＤと、ソースコード内の要素の位置情報とを対応付けて記憶する。図１０は、メタミューテーション情報記憶部の一例を示す図である。図１０に示すように、メタミューテーション情報記憶部１２１は、「メタミューテーションＩＤ」、「ソースコード位置情報」といった項目を有する。メタミューテーション情報記憶部１２１は、例えば、メタミューテーションＩＤごとに１レコードとして記憶する。なお、以下の説明では、メタミューテーションＩＤをＭＭＩＤとも表現する。
【００３０】
「メタミューテーションＩＤ」は、メタミューテーション関数ごとに一意に付される番号（ＩＤ）であり、メタミューテーション関数を識別する識別子である。「ソースコード位置情報」は、メタミューテーション関数に置換するソースコード内の要素の位置情報であり、例えば、ファイル名、行数、桁数を用いて特定する。図１０の１行目の例では、メタミューテーションＩＤ「０」のメタミューテーション関数は、ファイル名が「ａ．ｃ」のソースコード上の「２行６桁」から「２行２０桁」までの位置にある要素に対応することを示す。
【００３１】
図１の説明に戻って、命令記憶部１２２は、ビットコードに対してミューテーションが実行され、ＶＭ上で実行される命令を記憶する。すなわち、命令記憶部１２２は、ビットコードのメタミューテーション関数が具体的なミュータントに置換された命令を記憶する。
【００３２】
ミュータント記憶部１２３は、メタミューテーション関数を具体的なミュータントに置換するパターンを記憶する。図１１は、ミュータント記憶部の一例を示す図である。図１１に示すように、ミュータント記憶部１２３は、「ミュータントＩＤ」、「メタミューテーションＩＤ」、「ミューテーションオペレータ」といった項目を有する。ミュータント記憶部１２３は、例えば、置換するパターンごとに１レコードとして記憶する。
【００３３】
「ミュータントＩＤ」は、メタミューテーションＩＤとミューテーションオペレータとのペアを識別する識別子である。すなわち、「ミュータントＩＤ」は、メタミューテーション関数を具体的なミュータントに置換するパターンを識別する識別子である。「メタミューテーションＩＤ」は、メタミューテーション関数を識別する識別子である。「ミューテーションオペレータ」は、メタミューテーションＩＤで示されるメタミューテーション関数をどの様に変更するかを示す情報である。「ミューテーションオペレータ」は、１つのメタミューテーションＩＤに対して、複数種類ある場合には、例えば、アンダースコア後にどの様な変更を行うかの記号を付している。図１１の１行目の例では、ミュータントＩＤ「１」は、メタミューテーションＩＤ「０」のメタミューテーション関数について、ミューテーションオペレータ「ＯＲＲＮ＿ＥＱ」を実行することを示す。ここで、「ＯＲＲＮ＿ＥＱ」は、比較演算子を「＝＝」にすることを示す。
【００３４】
図１の説明に戻って、テスト結果記憶部１２４は、ミューテーションされたソースコードに対して、テストを実行した結果であるテスト結果、すなわちテスト結果群を記憶する。図１２は、テスト結果記憶部の一例を示す図である。図１２に示すように、テスト結果記憶部１２４は、「テストＩＤ」、「ミュータントＩＤ」、「テスト合否」といった項目を有する。テスト結果記憶部１２４は、テスト項目ごとに１レコードとして記憶する。
【００３５】
「テストＩＤ」は、テスト項目を識別する識別子である。「ミュータントＩＤ」は、メタミューテーションＩＤとミューテーションオペレータとのペアを識別する識別子である。「テスト合否」は、テスト対象のソースコードのミューテーションに対するテストの合否を示す情報であり、「Ｐａｓｓ」または「Ｆａｉｌ」で表わされる。「Ｐａｓｓ」は、ソースコード内の要素が、ミュータントＩＤに基づくミュータントに置換された場合に、当該テスト項目において埋め込まれたバグを検出できなかったことを示す。「Ｆａｉｌ」は、ソースコード内の要素が、ミュータントＩＤに基づくミュータントに置換された場合に、当該テスト項目において埋め込まれたバグを検出できたことを示す。図１２の１行目の例では、テストＩＤ「TEST(func_test,testcase1)」で示すテスト項目において、要素がミュータントＩＤ「１」に基づくミュータントに置換された場合に、テスト合否は「Ｆａｉｌ」、つまり埋め込まれたバグを検出できたことを示す。
【００３６】
図１の説明に戻って、制御部１３０は、例えば、ＣＰＵ（Central  Processing  Unit）やＭＰＵ（Micro  Processing  Unit）等によって、内部の記憶装置に記憶されているプログラムがＲＡＭを作業領域として実行されることにより実現される。また、制御部１３０は、例えば、ＡＳＩＣ（Application  Specific  Integrated  Circuit）やＦＰＧＡ（Field  Programmable  Gate  Array）等の集積回路により実現されるようにしてもよい。制御部１３０は、置換部１３１と、コンパイラ１３２と、ミューテーション部１３３と、命令実行部１３４と、出力部１３５とを有し、以下に説明する情報処理の機能や作用を実現または実行する。なお、制御部１３０の内部構成は、図１に示した構成に限られず、後述する情報処理を行う構成であれば他の構成であってもよい。
【００３７】
置換部１３１は、入力部１１１からソースコードが入力されると、ソースコード内の要素について、要素をミュータントに変化させるメタミューテーション関数に置換する。置換部１３１は、入力されたソースコードから次の要素を抽出する。なお、置換部１３１は、初回の場合には１つ目の要素を抽出する。置換部１３１は、次の要素が抽出出来たか否か、すなわち、ソースコードの要素が空か否かを判定する。置換部１３１は、要素が空である場合には、要素からメタミューテーション関数への置換を終了する。置換部１３１は、要素が空でない場合には、要素がミューテーション対象か否かを判定する。
【００３８】
置換部１３１は、要素がミューテーション対象である場合には、メタミューテーション関数のＩＤであるＭＭＩＤと、ソースコード内の要素の位置情報とをメタミューテーション情報記憶部１２１に記憶する。すなわち、置換部１３１は、メタミューテーション関数のＩＤと、ソースコード内の要素の位置情報とを、メタミューテーション情報記憶部１２１に記憶する記憶処理部である。なお、ソースコード内の要素の位置情報は、例えば、ソースコードのファイル名、行数および桁数を用いることができる。
【００３９】
また、置換部１３１は、当該要素を、ＭＭＩＤを引数に持つメタミューテーション関数に置換する。置換部１３１は、要素がミューテーション対象でない場合には、次の要素を抽出する。置換部１３１は、ソースコード内の要素がメタミューテーション関数に置換された置換後のソースコードをコンパイラ１３２に出力する。
【００４０】
ここで、図１３および図１４を用いて、置換前後のソースコードの一例について説明する。図１３は、ソースコードの一例を示す図である。図１４は、置換後のソースコードの一例を示す図である。図１３に示すソースコード６１は、ＩＦ文６１ａ、インクリメント文６１ｂおよびデクリメント文６１ｃを有する。また、図１４に示す置換後のソースコード６２は、ＩＦ文６１ａに対応するＩＦ文６２ａ、インクリメント文６１ｂに対応するインクリメント文６２ｂ、および、デクリメント文６１ｃに対応するデクリメント文６２ｃを有する。
【００４１】
置換部１３１は、ＩＦ文６１ａ内の要素「！＝」を、メタミューテーション関数「ｂｏｐ＿ｎｅ」に置換し、ＩＦ文６１ａ内の要素「＜＜」を、メタミューテーション関数「ｂｏｐ＿ｓｈｌ」に置換する。このとき、置換部１３１は、各要素に係る変数および定数をメタミューテーション関数の引数とする。また、置換部１３１は、メタミューテーション関数の引数に、ＭＭＩＤを設定する。置換部１３１は、例えば「ｂｏｐ＿ｎｅ」のＭＭＩＤを「０」と設定し、「ｂｏｐ＿ｓｈｌ」のＭＭＩＤを「１」と設定する。
【００４２】
置換部１３１は、同様に、インクリメント文６１ｂ内の要素「＋＋」を、メタミューテーション関数「ｕｏｐ＿ｐｏｓｔｉｎｃ」に置換し、デクリメント文６１ｃ内の要素「−−」を、メタミューテーション関数「ｕｏｐ＿ｐｏｓｔｄｅｃ」に置換する。また、置換部１３１は、例えば「ｕｏｐ＿ｐｏｓｔｉｎｃ」のＭＭＩＤを「２」と設定し、「ｕｏｐ＿ｐｏｓｔｄｅｃ」のＭＭＩＤを「３」と設定する。
【００４３】
図１の説明に戻って、コンパイラ１３２は、置換部１３１から置換後のソースコードが入力されると、置換後のソースコードをＶＭ上で実行可能な中間コードであるビットコードにコンパイルする。コンパイラ１３２は、例えば、置換後のソースコードをＬＬＶＭビットコードにコンパイルする。なお、以下の説明では、ＬＬＶＭビットコードを、単にビットコードと称して説明する。コンパイラ１３２は、コンパイルしたビットコードをミューテーション部１３３に出力する。
【００４４】
ここで、置換後のソースコードとビットコードとにおけるミューテーション箇所の対応について説明する。図１５は、ソースコードとビットコードとのミューテーション箇所の対応の一例を示す図である。図１５に示すように、ソースコード６１の要素は、置換後のソースコード６２のメタミューテーション関数に置き換えられる。このとき、各メタミューテーション関数にはＭＭＩＤが付与される。例えば、ＭＭＩＤ６２ｄで示す「ｂｏｐ＿ｎｅ」のＭＭＩＤは「０」、ＭＭＩＤ６２ｅで示す「ｂｏｐ＿ｓｈｌ」のＭＭＩＤは「１」とする。また、例えば、ＭＭＩＤ６２ｆで示す「ｕｏｐ＿ｐｏｓｔｉｎｃ」のＭＭＩＤは「２」、ＭＭＩＤ６２ｇで示す「ｕｏｐ＿ｐｏｓｔｄｅｃ」のＭＭＩＤは「３」とする。
【００４５】
置換後のソースコード６２がビットコード６５にコンパイルされると、ビットコード６５には、ＭＭＩＤ６２ｄに対応するＭＭＩＤ６５ｄ、ＭＭＩＤ６２ｅに対応するＭＭＩＤ６５ｅが１対１対応可能に含まれる。また、ビットコード６５には、ＭＭＩＤ６２ｆに対応するＭＭＩＤ６５ｆ、ＭＭＩＤ６２ｇに対応するＭＭＩＤ６５ｇが１対１対応可能に含まれる。すなわち、コンパイラ１３２におけるコンパイルでは、ミューテーション箇所がビットコードに全て残るので、最適化によるミュータントの消失が発生しない。
【００４６】
図１の説明に戻って、ミューテーション部１３３には、入力部１１１からテスト項目およびミューテーションオペレータリストが入力される。ミューテーション部１３３は、コンパイラ１３２からビットコードが入力されると、ミューテーション実行処理を開始する。ミューテーション部１３３は、コンパイラ１３２からビットコードが入力されるか、命令実行部１３４から次のテスト項目の入力指示が入力されると、入力されたテスト項目のうち、次のテスト項目をビットコードに入力する。なお、次のテスト項目は、コンパイラ１３２からビットコードが入力された場合、つまり初回のテスト項目の場合には、１つ目のテスト項目を用いる。
【００４７】
ミューテーション部１３３は、テスト項目がビットコードに入力されるか、命令実行部１３４からインクリメント指示が入力されると、ＭＭＩＤをインクリメントする。ミューテーション部１３３は、例えば、ＭＭＩＤを「０」から付番する場合には、初期値を「−１」としておき、ＭＭＩＤをインクリメントすることで１回目に処理するＭＭＩＤを「０」とすることができる。
【００４８】
ミューテーション部１３３は、ＭＭＩＤがインクリメントされるか、命令実行部１３４から次の命令の処理指示が入力されると、ビットコードから次の命令を抽出する。なお、次の命令は初回の命令の場合には１つ目の命令を抽出する。ミューテーション部１３３は、抽出した命令が当該ＭＭＩＤのメタミューテーション関数の呼び出しであるか否かを判定する。ミューテーション部１３３は、抽出した命令が当該ＭＭＩＤのメタミューテーション関数の呼び出しである場合には、メタミューテーション関数に対応するミューテーションオペレータとＭＭＩＤとをミュータント記憶部１２３に記憶する。また、ミューテーション部１３３は、ミューテーションオペレータによって変更された命令を命令記憶部１２２に記憶する。
【００４９】
ミューテーション部１３３は、抽出した命令が当該ＭＭＩＤのメタミューテーション関数の呼び出しでない場合には、元の命令を命令記憶部１２２に記憶する。ミューテーション部１３３は、変更された命令または元の命令を命令記憶部１２２に記憶すると、命令実行部１３４に命令実行指示を出力する。
【００５０】
ここで、図１６および図１７を用いて、テスト項目およびミューテーションオペレータリストについて説明する。図１６は、テスト項目の一例を示す図である。図１７は、ミューテーションオペレータリストの一例を示す図である。図１６に示すように、テスト項目６３は、例えば、テスト項目ごとに関数の形で表現される。また、図１７に示すように、ミューテーションオペレータリスト６４は、例えば、ＯＳＳＮ（Shift  operator  mutation）、ＯＲＲＮ（Relational  operator  mutation）、ＯＩＤＯ（Increment/Decrement  Replacement）といった形で表現される。
【００５１】
また、図１８を用いて、ビットコードとミューテーション後の命令との関係について説明する。図１８は、ビットコードとミューテーション後の命令との関係の一例を示す図である。図１８に示すように、メタミューテーション関数を含むビットコード６５は、ミューテーション部１３３に入力されると、ミューテーションが実行され、例えば命令群６６が命令記憶部１２２に記憶される。このとき、ビットコード６５のメタミューテーション関数６７ａを含む命令文６５ａは、命令文６６ａとなる。また、メタミューテーション関数６７ｂを含む命令文６５ｂは、命令文６６ｂとなる。また、メタミューテーション関数６７ｃを含む命令文６５ｃは、命令文６６ｃとなる。
【００５２】
図１の説明に戻って、命令実行部１３４は、ミューテーション部１３３から命令実行指示が入力されると、命令記憶部１２２に記憶された命令を読み出して実行する。命令実行部１３４は、同一のＭＭＩＤにおける各命令の実行結果を記憶部１２０に一時的に記憶する。命令実行部１３４は、ビットコードに次の命令があるか否かを判定する。命令実行部１３４は、ビットコードに次の命令がある場合には、ミューテーション部１３３に次の命令の処理指示を出力する。
【００５３】
命令実行部１３４は、ビットコードに次の命令がない場合には、記憶部１２０に一時的に記憶した各命令の実行結果を読み出して、テストＩＤ、ミュータントＩＤおよびテスト合否をテスト結果として、テスト結果記憶部１２４に記憶する。命令実行部１３４は、テスト結果をテスト結果記憶部１２４に記憶すると、ＭＭＩＤが上限か否かを判定する。
【００５４】
命令実行部１３４は、ＭＭＩＤが上限でない場合には、ミューテーション部１３３にインクリメント指示を出力する。命令実行部１３４は、ＭＭＩＤが上限である場合には、次のテスト項目があるか否かを判定する。命令実行部１３４は、次のテスト項目がある場合には、ミューテーション部１３３に次のテスト項目の入力指示を出力する。命令実行部１３４は、次のテスト項目がない場合には、ミューテーション実行処理を終了し、出力部１３５に出力指示を出力する。なお、コンパイラ１３２、ミューテーション部１３３および命令実行部１３４は、コンパイルを行って、ミューテーションおよびテストを実行して命令の実行結果であるテスト結果を得る一連の動作を実行するミューテーション部として統合してもよい。
【００５５】
出力部１３５は、命令実行部１３４から出力指示が入力されると、テスト結果記憶部１２４を参照し、テスト結果から「ｕｎｋｉｌｌｅｄ」であるミュータントを抽出する。すなわち、出力部１３５は、ミュータントＩＤごとのテスト結果記憶部１２４のテスト合否の項目について、全て「Ｐａｓｓ」であるミュータントＩＤを抽出する。また、出力部１３５は、テスト結果記憶部１２４のテスト合否の項目が１つ以上「Ｆａｉｌ」であるミュータントＩＤの数、つまり「ｋｉｌｌｅｄ」となったミュータントＩＤの数を、ミュータントＩＤの総数で除算した値をミューテーションスコアとして算出する。
【００５６】
出力部１３５は、メタミューテーション情報記憶部１２１およびミュータント記憶部１２３をミュータントＩＤに基づいて検索し、ミュータントＩＤに対応するメタミューテーション情報を取得する。出力部１３５は、取得したメタミューテーション情報に基づいて、ミュータントの位置情報を復元する。
【００５７】
出力部１３５は、算出したミューテーションスコアと、「ｕｎｋｉｌｌｅｄ」であるミュータントとに基づいて、結果レポートを生成する。出力部１３５は、結果レポートを含む結果画面を生成し、生成した結果画面を表示部１１２に出力して表示させる。すなわち、出力部１３５は、要素がメタミューテーション関数に置換されたソースコードに対するテスト結果と、ＭＭＩＤおよび位置情報とに基づいて、要素とテスト結果とを対応付けて出力する。言い換えると、出力部１３５は、テスト結果からＭＭＩＤを抽出し、抽出したＭＭＩＤに対応する位置情報と、抽出したＭＭＩＤに対応するメタミューテーション関数によって置換された要素とに基づいて、要素とテスト結果とを対応付けて出力する。
【００５８】
ここで、図１９を用いて結果画面について説明する。図１９は、結果画面の一例を示す図である。図１９に示すように、結果画面７０は、ミューテーションスコアを表示する領域７１と、「ｕｎｋｉｌｌｅｄ」であるミュータントを表示する領域７２と、ソースコードを表示する領域７３とを有する。領域７２には、テストで検出出来なかった、つまり「ｋｉｌｌｅｄ］とならなかったミュータントがリスト表示される。例えば、項目７２ａには、ソースコード位置情報が「ａ．ｃ：３行５桁−３行８桁」であるオリジナルの要素「ｘ＋＋」に対するミュータント「＋＋ｘ」が表示される。また、結果画面７０では、例えば、項目７２ａが選択されると、領域７３にソースコードの該当箇所７３ａが表示される。これにより、解析装置１００では、ソースコードにおけるミューテーション箇所の行および桁レベルの対応をとることができる。
【００５９】
すなわち、出力部１３５は、テストによって検出されなかったミュータントに対応するメタミューテーション関数によって置換された要素と、該要素の位置情報とを対応付けて出力する。言い換えると、出力部１３５は、テストによって検出されなかったミュータントと、該ミュータントに対応するメタミューテーション関数によって置換された要素と、該要素の位置情報と、ソースコード内の該要素の位置情報に対応する箇所とを表示する結果画面を出力する。
【００６０】
次に、実施例の解析装置１００の動作について説明する。図２０は、実施例の解析処理の一例を示すフローチャートである。
【００６１】
置換部１３１は、入力部１１１からソースコードが入力されると（ステップＳ１）、ソースコード内の要素をメタミューテーション関数に置換する置換処理を実行する（ステップＳ２）。ここで、図２１を用いて置換処理について説明する。図２１は、置換処理の一例を示すフローチャートである。
【００６２】
置換部１３１は、入力されたソースコードから次の要素を抽出する（ステップＳ２１）。置換部１３１は、ソースコードの要素が空か否かを判定する（ステップＳ２２）。置換部１３１は、要素が空でない場合には（ステップＳ２２：否定）、要素がミューテーション対象か否かを判定する（ステップＳ２３）。置換部１３１は、要素がミューテーション対象である場合には（ステップＳ２３：肯定）、ＭＭＩＤと要素の位置情報とをメタミューテーション情報記憶部１２１に記憶する（ステップＳ２４）。また、置換部１３１は、当該要素を、ＭＭＩＤを引数に持つメタミューテーション関数に置換して（ステップＳ２５）、ステップＳ２１に戻る。置換部１３１は、要素がミューテーション対象でない場合には（ステップＳ２３：否定）、ステップＳ２１に戻る。
【００６３】
置換部１３１は、要素が空である場合には（ステップＳ２２：肯定）、ソースコード内の要素がメタミューテーション関数に置換された置換後のソースコードをコンパイラ１３２に出力し、置換処理を終了して元の処理に戻る。これにより、解析装置１００は、ソースコード内の要素をメタミューテーション関数に置換できる。
【００６４】
図２０の解析処理の説明に戻って、コンパイラ１３２は、置換後のソースコードが入力されると、置換後のソースコードをビットコードにコンパイルする（ステップＳ３）。コンパイラ１３２は、コンパイルしたビットコードをミューテーション部１３３に出力する。
【００６５】
ミューテーション部１３３は、入力部１１１からテスト項目およびミューテーションオペレータリストが入力され、コンパイラ１３２からビットコードが入力されると（ステップＳ４）、ミューテーション実行処理を開始する（ステップＳ５）。
【００６６】
ここで、図２２を用いてミューテーション実行処理について説明する。図２２は、ミューテーション実行処理の一例を示すフローチャートである。ミューテーション部１３３は、コンパイラ１３２からビットコードが入力されるか、命令実行部１３４から次のテスト項目の入力指示が入力されると、次のテスト項目をビットコードに入力する（ステップＳ５１）。
【００６７】
ミューテーション部１３３は、テスト項目がビットコードに入力されるか、命令実行部１３４からインクリメント指示が入力されると、ＭＭＩＤをインクリメントする（ステップＳ５２）。ミューテーション部１３３は、ＭＭＩＤがインクリメントされるか、命令実行部１３４から次の命令の処理指示が入力されると、ビットコードから次の命令を抽出する（ステップＳ５３）。ミューテーション部１３３は、抽出した命令が当該ＭＭＩＤのメタミューテーション関数の呼び出しであるか否かを判定する（ステップＳ５４）。
【００６８】
ミューテーション部１３３は、抽出した命令が当該ＭＭＩＤのメタミューテーション関数の呼び出しである場合には（ステップＳ５４：肯定）、メタミューテーション関数に対応するミューテーションオペレータとＭＭＩＤとをミュータント記憶部１２３に記憶する（ステップＳ５５）。また、ミューテーション部１３３は、ミューテーションオペレータによって変更された命令を命令記憶部１２２に記憶する（ステップＳ５６）。
【００６９】
ミューテーション部１３３は、抽出した命令が当該ＭＭＩＤのメタミューテーション関数の呼び出しでない場合には（ステップＳ５４：否定）、元の命令を命令記憶部１２２に記憶する（ステップＳ５７）。ミューテーション部１３３は、変更された命令または元の命令を命令記憶部１２２に記憶すると、命令実行部１３４に命令実行指示を出力する。
【００７０】
命令実行部１３４は、ミューテーション部１３３から命令実行指示が入力されると、命令記憶部１２２に記憶された命令を読み出して実行する（ステップＳ５８）。命令実行部１３４は、同一のＭＭＩＤにおける各命令の実行結果を記憶部１２０に一時的に記憶する。命令実行部１３４は、ビットコードに次の命令があるか否かを判定する（ステップＳ５９）。命令実行部１３４は、ビットコードに次の命令がある場合には（ステップＳ５９：肯定）、ミューテーション部１３３に次の命令の処理指示を出力し、ステップＳ５３に戻る。
【００７１】
命令実行部１３４は、ビットコードに次の命令がない場合には（ステップＳ５９：否定）、記憶部１２０に一時的に記憶した各命令の実行結果を読み出して、テスト結果をテスト結果記憶部１２４に記憶する（ステップＳ６０）。命令実行部１３４は、テスト結果をテスト結果記憶部１２４に記憶すると、ＭＭＩＤが上限か否かを判定する（ステップＳ６１）。
【００７２】
命令実行部１３４は、ＭＭＩＤが上限でない場合には（ステップＳ６１：否定）、ミューテーション部１３３にインクリメント指示を出力し、ステップＳ５２に戻る。命令実行部１３４は、ＭＭＩＤが上限である場合には（ステップＳ６１：肯定）、次のテスト項目があるか否かを判定する（ステップＳ６２）。命令実行部１３４は、次のテスト項目がある場合には（ステップＳ６２：肯定）、ミューテーション部１３３に次のテスト項目の入力指示を出力し、ステップＳ５１に戻る。命令実行部１３４は、次のテスト項目がない場合には（ステップＳ６２：否定）、ミューテーション実行処理を終了し、出力部１３５に出力指示を出力して元の処理に戻る。これにより、解析装置１００は、ミューテーションの結果であるテスト結果を得ることができる。
【００７３】
図２０の解析処理の説明に戻って、出力部１３５は、命令実行部１３４から出力指示が入力されると、出力処理を実行する（ステップＳ６）。ここで、図２３を用いて出力処理について説明する。図２３は、出力処理の一例を示すフローチャートである。
【００７４】
出力部１３５は、命令実行部１３４から出力指示が入力されると、テスト結果記憶部１２４を参照し、テスト結果から「ｕｎｋｉｌｌｅｄ」であるミュータントを抽出する（ステップＳ７１）。また、出力部１３５は、テスト結果記憶部１２４のテスト合否の項目に基づいて、ミューテーションスコアを算出する（ステップＳ７２）。
【００７５】
出力部１３５は、メタミューテーション情報記憶部１２１およびミュータント記憶部１２３をミュータントＩＤに基づいて検索し、ミュータントＩＤに対応するメタミューテーション情報を取得する。出力部１３５は、取得したメタミューテーション情報に基づいて、ミュータントの位置情報を復元する（ステップＳ７３）。
【００７６】
出力部１３５は、算出したミューテーションスコアと、「ｕｎｋｉｌｌｅｄ」であるミュータントとに基づいて、結果レポートを生成する（ステップＳ７４）。出力部１３５は、結果レポートを含む結果画面を生成し、生成した結果画面を表示部１１２に出力して表示させ（ステップＳ７５）、元の処理に戻る。これにより、解析装置１００は、ビットコードミューテーションによるテストの高速な実行を維持しつつ、テストで検出されないミュータントに対応するソースコード上の要素を把握できる。すなわち、解析装置１００は、ソースコード上のどの要素のミューテーションのテスト結果であるかを把握できる。
【００７７】
このように、解析装置１００は、ソースコード内の要素について、要素をミュータントに変化させるメタミューテーション関数に置換する際に、メタミューテーション関数のＭＭＩＤと、ソースコード内の要素の位置情報とを記憶部１２０に記憶する。また、解析装置１００は、要素がメタミューテーション関数に置換されたソースコードを中間コードにコンパイルして、中間コードに対してミューテーションを実行するとともにテストを実行する。また、解析装置１００は、要素がメタミューテーション関数に置換されたソースコードに対するテスト結果と、記憶部１２０に記憶されたＭＭＩＤおよび位置情報とに基づいて、要素とテスト結果とを対応付けて出力する。その結果、ソースコード上のどの要素のミューテーションのテスト結果であるかを把握できる。また、解析装置１００は、コンパイル時の最適化によるミュータントの消失を防止できる。
【００７８】
また、解析装置１００では、ＭＭＩＤは、メタミューテーション関数の引数に含まれる。その結果、ソースコード上のどの要素のミューテーションのテスト結果であるかを把握できる。
【００７９】
また、解析装置１００は、テスト結果からＭＭＩＤを抽出し、抽出したＭＭＩＤに対応する位置情報と、抽出したＭＭＩＤに対応するメタミューテーション関数によって置換された要素とに基づいて、要素とテスト結果とを対応付けて出力する。その結果、ビットコードでのミュータントがソースコードのどの要素に対応するか正確に知ることができる。
【００８０】
また、解析装置１００は、テストによって検出されなかったミュータントに対応するメタミューテーション関数によって置換された要素と、該要素の位置情報とを対応付けて出力する。その結果、テストで検出されなかったミュータントに対応するソースコード上の要素を把握できる。
【００８１】
また、解析装置１００は、テストによって検出されなかったミュータントと、該ミュータントに対応するメタミューテーション関数によって置換された要素と、該要素の位置情報と、ソースコード内の該要素の位置情報に対応する箇所とを表示する結果画面を出力する。その結果、テストで検出されなかったミュータントに対応するソースコード上の要素を把握できる。
【００８２】
なお、上記実施例では、中間コードの一例としてＬＬＶＭビットコードを用いたが、これに限定されない。例えば、Ｊａｖａ（登録商標）ＶＭで実行可能なＪａｖａバイトコード等を用いてもよい。
【００８３】
また、図示した各部の各構成要素は、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各部の分散・統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況等に応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。例えば、コンパイラ１３２と、ミューテーション部１３３と、命令実行部１３４とは統合されてもよい。また、図示した各処理は、上記の順番に限定されるものではなく、処理内容を矛盾させない範囲において、同時に実施してもよく、順序を入れ替えて実施してもよい。
【００８４】
さらに、各装置で行われる各種処理機能は、ＣＰＵ（またはＭＰＵ、ＭＣＵ（Micro  Controller  Unit）等のマイクロ・コンピュータ）上で、その全部または任意の一部を実行するようにしてもよい。また、各種処理機能は、ＣＰＵ（またはＭＰＵ、ＭＣＵ等のマイクロ・コンピュータ）で解析実行されるプログラム上、またはワイヤードロジックによるハードウェア上で、その全部または任意の一部を実行するようにしてもよいことは言うまでもない。
【００８５】
ところで、上記の実施例で説明した各種の処理は、予め用意されたプログラムをコンピュータで実行することで実現できる。そこで、以下では、上記の実施例と同様の機能を有するプログラムを実行するコンピュータの一例を説明する。図２４は、解析プログラムを実行するコンピュータの一例を示す図である。
【００８６】
図２４に示すように、コンピュータ２００は、各種演算処理を実行するＣＰＵ２０１と、データ入力を受け付ける入力装置２０２と、モニタ２０３とを有する。また、コンピュータ２００は、記憶媒体からプログラム等を読み取る媒体読取装置２０４と、各種装置と接続するためのインタフェース装置２０５と、他の情報処理装置等と有線または無線により接続するための通信装置２０６とを有する。また、コンピュータ２００は、各種情報を一時記憶するＲＡＭ２０７と、ハードディスク装置２０８とを有する。また、各装置２０１〜２０８は、バス２０９に接続される。
【００８７】
ハードディスク装置２０８には、図１に示した置換部１３１、コンパイラ１３２、ミューテーション部１３３、命令実行部１３４および出力部１３５の各処理部と同様の機能を有する解析プログラムが記憶される。また、ハードディスク装置２０８には、メタミューテーション情報記憶部１２１、命令記憶部１２２、ミュータント記憶部１２３、テスト結果記憶部、および、解析プログラムを実現するための各種データが記憶される。入力装置２０２は、例えば、コンピュータ２００のユーザから操作情報、管理情報等の各種情報の入力を受け付ける。モニタ２０３は、例えば、コンピュータ２００の管理者に対して結果画面、管理情報の画面および各種画面を表示する。媒体読取装置２０４は、記憶媒体からソースコード、テスト項目およびミューテーションオペレータリストを読み取る。インタフェース装置２０５は、例えば印刷装置等が接続される。通信装置２０６は、例えば、図１に示した通信部１１０と同様の機能を有し図示しないネットワークと接続され、他の情報処理装置と各種情報をやりとりする。
【００８８】
ＣＰＵ２０１は、ハードディスク装置２０８に記憶された各プログラムを読み出して、ＲＡＭ２０７に展開して実行することで、各種の処理を行う。また、これらのプログラムは、コンピュータ２００を図１に示した置換部１３１、コンパイラ１３２、ミューテーション部１３３、命令実行部１３４および出力部１３５として機能させることができる。
【００８９】
なお、上記の解析プログラムは、必ずしもハードディスク装置２０８に記憶されている必要はない。例えば、コンピュータ２００が読み取り可能な記憶媒体に記憶されたプログラムを、コンピュータ２００が読み出して実行するようにしてもよい。コンピュータ２００が読み取り可能な記憶媒体は、例えば、ＣＤ−ＲＯＭやＤＶＤディスク、ＵＳＢメモリ等の可搬型記録媒体、フラッシュメモリ等の半導体メモリ、ハードディスクドライブ等が対応する。また、公衆回線、インターネット、ＬＡＮ等に接続された装置にこの解析プログラムを記憶させておき、コンピュータ２００がこれらから解析プログラムを読み出して実行するようにしてもよい。
【００９０】
以上、本実施例を含む実施の形態に関し、さらに以下の付記を開示する。
【００９１】
（付記１）ソースコード内の要素について、前記要素をミュータントに変化させるメタミューテーション関数に置換する際に、前記メタミューテーション関数のＩＤと、前記ソースコード内の前記要素の位置情報とを記憶部に記憶し、
前記要素が前記メタミューテーション関数に置換されたソースコードを中間コードにコンパイルして、前記中間コードに対してミューテーションを実行するとともにテストを実行し、
前記要素が前記メタミューテーション関数に置換されたソースコードに対するテスト結果と、前記記憶部に記憶された前記ＩＤおよび前記位置情報とに基づいて、前記要素と前記テスト結果とを対応付けて出力する、
処理をコンピュータに実行させることを特徴とする解析プログラム。
【００９２】
（付記２）前記ＩＤは、前記メタミューテーション関数の引数に含まれる、
ことを特徴とする付記１に記載の解析プログラム。
【００９３】
（付記３）前記出力する処理は、前記テスト結果から前記ＩＤを抽出し、抽出した前記ＩＤに対応する前記位置情報と、抽出した前記ＩＤに対応する前記メタミューテーション関数によって置換された前記要素とに基づいて、前記要素と前記テスト結果とを対応付けて出力する、
ことを特徴とする付記１または２に記載の解析プログラム。
【００９４】
（付記４）前記出力する処理は、前記テストによって検出されなかった前記ミュータントに対応する前記メタミューテーション関数によって置換された前記要素と、該要素の前記位置情報とを対応付けて出力する、
ことを特徴とする付記１〜３のいずれか１つに記載の解析プログラム。
【００９５】
（付記５）前記出力する処理は、前記テストによって検出されなかった前記ミュータントと、該ミュータントに対応する前記メタミューテーション関数によって置換された前記要素と、該要素の前記位置情報と、前記ソースコード内の該要素の前記位置情報に対応する箇所とを表示する結果画面を出力する、
ことを特徴とする付記４に記載の解析プログラム。
【００９６】
（付記６）ソースコード内の要素について、前記要素をミュータントに変化させるメタミューテーション関数に置換する際に、前記メタミューテーション関数のＩＤと、前記ソースコード内の前記要素の位置情報とを記憶部に記憶し、
前記要素が前記メタミューテーション関数に置換されたソースコードを中間コードにコンパイルして、前記中間コードに対してミューテーションを実行するとともにテストを実行し、
前記要素が前記メタミューテーション関数に置換されたソースコードに対するテスト結果と、前記記憶部に記憶された前記ＩＤおよび前記位置情報とに基づいて、前記要素と前記テスト結果とを対応付けて出力する、
処理をコンピュータが実行することを特徴とする解析方法。
【００９７】
（付記７）前記ＩＤは、前記メタミューテーション関数の引数に含まれる、
ことを特徴とする付記６に記載の解析方法。
【００９８】
（付記８）前記出力する処理は、前記テスト結果から前記ＩＤを抽出し、抽出した前記ＩＤに対応する前記位置情報と、抽出した前記ＩＤに対応する前記メタミューテーション関数によって置換された前記要素とに基づいて、前記要素と前記テスト結果とを対応付けて出力する、
ことを特徴とする付記６または７に記載の解析方法。
【００９９】
（付記９）前記出力する処理は、前記テストによって検出されなかった前記ミュータントに対応する前記メタミューテーション関数によって置換された前記要素と、該要素の前記位置情報とを対応付けて出力する、
ことを特徴とする付記６〜８のいずれか１つに記載の解析方法。
【０１００】
（付記１０）前記出力する処理は、前記テストによって検出されなかった前記ミュータントと、該ミュータントに対応する前記メタミューテーション関数によって置換された前記要素と、該要素の前記位置情報と、前記ソースコード内の該要素の前記位置情報に対応する箇所とを表示する結果画面を出力する、
ことを特徴とする付記９に記載の解析方法。
【０１０１】
（付記１１）ソースコード内の要素について、前記要素をミュータントに変化させるメタミューテーション関数に置換する際に、前記メタミューテーション関数のＩＤと、前記ソースコード内の前記要素の位置情報とを記憶部に記憶する記憶処理部と、
前記要素が前記メタミューテーション関数に置換されたソースコードを中間コードにコンパイルして、前記中間コードに対してミューテーションを実行するとともにテストを実行するミューテーション部と、
前記要素が前記メタミューテーション関数に置換されたソースコードに対するテスト結果と、前記記憶部に記憶された前記ＩＤおよび前記位置情報とに基づいて、前記要素と前記テスト結果とを対応付けて出力する出力部と、
を有することを特徴とする解析装置。
【０１０２】
（付記１２）前記ＩＤは、前記メタミューテーション関数の引数に含まれる、
ことを特徴とする付記１１に記載の解析装置。
【０１０３】
（付記１３）前記出力部は、前記テスト結果から前記ＩＤを抽出し、抽出した前記ＩＤに対応する前記位置情報と、抽出した前記ＩＤに対応する前記メタミューテーション関数によって置換された前記要素とに基づいて、前記要素と前記テスト結果とを対応付けて出力する、
ことを特徴とする付記１１または１２に記載の解析装置。
【０１０４】
（付記１４）前記出力部は、前記テストによって検出されなかった前記ミュータントに対応する前記メタミューテーション関数によって置換された前記要素と、該要素の前記位置情報とを対応付けて出力する、
ことを特徴とする付記１１〜１３のいずれか１つに記載の解析装置。
【０１０５】
（付記１５）前記出力部は、前記テストによって検出されなかった前記ミュータントと、該ミュータントに対応する前記メタミューテーション関数によって置換された前記要素と、該要素の前記位置情報と、前記ソースコード内の該要素の前記位置情報に対応する箇所とを表示する結果画面を出力する、
ことを特徴とする付記１４に記載の解析装置。
【符号の説明】
【０１０６】
１００  解析装置
１１０  通信部
１１１  入力部
１１２  表示部
１１３  操作部
１２０  記憶部
１２１  メタミューテーション情報記憶部
１２２  命令記憶部
１２３  ミュータント記憶部
１２４  テスト結果記憶部
１３０  制御部
１３１  置換部
１３２  コンパイラ
１３３  ミューテーション部
１３４  命令実行部
１３５  出力部
【図１】
2017054453.tif 000003
【図２】
2017054453.tif 000004
【図３】
2017054453.tif 000005
【図４】
2017054453.tif 000006
【図５】
2017054453.tif 000007
【図６】
2017054453.tif 000008
【図７】
2017054453.tif 000009
【図８】
2017054453.tif 000010
【図９】
2017054453.tif 000011
【図１０】
2017054453.tif 000012
【図１１】
2017054453.tif 000013
【図１２】
2017054453.tif 000014
【図１３】
2017054453.tif 000015
【図１４】
2017054453.tif 000016
【図１５】
2017054453.tif 000017
【図１６】
2017054453.tif 000018
【図１７】
2017054453.tif 000019
【図１８】
2017054453.tif 000020
【図１９】
2017054453.tif 000021
【図２０】
2017054453.tif 000022
【図２１】
2017054453.tif 000023
【図２２】
2017054453.tif 000024
【図２３】
2017054453.tif 000025
【図２４】
2017054453.tif 000026