(57)【特許請求の範囲】
【請求項１】
ソースコード内の要素をミュータントに変化させるメタ関数に置換してコンパイルした中間コードを実行する際に、前記メタ関数に対応するミューテーション演算について、前記ミュータントの変化を示すミューテーション記述子の集合を保持し、
前記ミューテーション記述子それぞれの命令を評価し、
前記ミューテーション記述子の集合のうち、前記命令の評価結果が同じとなる１つ以上の前記ミューテーション記述子を選択し、
前記選択された前記ミューテーション記述子と、前記ミューテーション演算、または、前記命令の評価前の前記ミューテーション記述子の集合である第１のステートとの直積を算出して第２のステートを生成し、
生成された前記第２のステートの前記ミューテーション記述子それぞれの命令を評価する際に、前記第２のステートが複数ある場合には、当該複数の前記第２のステートを１つのグループとして、該グループ内の前記第２のステートそれぞれに対して並列に前記命令を評価し、
前記グループ内における前記命令の評価結果に基づく第３のステートのうち、該評価結果が同じとなる前記第３のステートをマージする、
処理をコンピュータに実行させることを特徴とする解析プログラム。
【請求項２】
前記マージする処理は、副作用がない前記命令が続く間、前記グループ内で前記第３のステートをマージする、
ことを特徴とする請求項１に記載の解析プログラム。
【請求項３】
前記並列に前記命令を評価する処理は、副作用がない前記命令以外の命令に到達すると、前記グループを解消して前記第２のステートの前記命令を評価する、
ことを特徴とする請求項１または２に記載の解析プログラム。
【請求項４】
前記マージする処理は、前記マージを行うことで、前記第１のステートまたは前記第２のステートに戻る場合には、前記マージを行わない、
ことを特徴とする請求項１〜３のいずれか１つに記載の解析プログラム。
【請求項５】
ソースコード内の要素をミュータントに変化させるメタ関数に置換してコンパイルした中間コードを実行する際に、前記メタ関数に対応するミューテーション演算について、前記ミュータントの変化を示すミューテーション記述子の集合を保持し、
前記ミューテーション記述子それぞれの命令を評価し、
前記ミューテーション記述子の集合のうち、前記命令の評価結果が同じとなる１つ以上の前記ミューテーション記述子を選択し、
前記選択された前記ミューテーション記述子と、前記ミューテーション演算、または、前記命令の評価前の前記ミューテーション記述子の集合である第１のステートとの直積を算出して第２のステートを生成し、
生成された前記第２のステートの前記ミューテーション記述子それぞれの命令を評価する際に、前記第２のステートが複数ある場合には、当該複数の前記第２のステートを１つのグループとして、該グループ内の前記第２のステートそれぞれに対して並列に前記命令を評価し、
前記グループ内における前記命令の評価結果に基づく第３のステートのうち、該評価結果が同じとなる前記第３のステートをマージする、
処理をコンピュータが実行することを特徴とする解析方法。
【請求項６】
前記マージする処理は、副作用がない前記命令が続く間、前記グループ内で前記第３のステートをマージする、
ことを特徴とする請求項５に記載の解析方法。
【請求項７】
前記並列に前記命令を評価する処理は、副作用がない前記命令以外の命令に到達すると、前記グループを解消して前記第２のステートの前記命令を評価する、
ことを特徴とする請求項５または６に記載の解析方法。
【請求項８】
前記マージする処理は、前記マージを行うことで、前記第１のステートまたは前記第２のステートに戻る場合には、前記マージを行わない、
ことを特徴とする請求項５〜７のいずれか１つに記載の解析方法。
【請求項９】
ソースコード内の要素をミュータントに変化させるメタ関数に置換してコンパイルした中間コードを実行する際に、前記メタ関数に対応するミューテーション演算について、前記ミュータントの変化を示すミューテーション記述子の集合を管理する管理部と、
前記ミューテーション記述子それぞれの命令を評価する第１評価部と、
前記ミューテーション記述子の集合のうち、前記命令の評価結果が同じとなる１つ以上の前記ミューテーション記述子を選択する選択部と、
前記選択された前記ミューテーション記述子と、前記ミューテーション演算、または、前記命令の評価前の前記ミューテーション記述子の集合である第１のステートとの直積を算出して第２のステートを生成する生成部と、
生成された前記第２のステートの前記ミューテーション記述子それぞれの命令を評価する際に、前記第２のステートが複数ある場合には、当該複数の前記第２のステートを１つのグループとして、該グループ内の前記第２のステートそれぞれに対して並列に前記命令を評価する第２評価部と、
前記グループ内における前記命令の評価結果に基づく第３のステートのうち、該評価結果が同じとなる前記第３のステートをマージするマージ部と、
を有することを特徴とする解析装置。
【請求項１０】
前記マージ部は、副作用がない前記命令が続く間、前記グループ内で前記第３のステートをマージする、
ことを特徴とする請求項９に記載の解析装置。
【請求項１１】
前記第２評価部は、副作用がない前記命令以外の命令に到達すると、前記グループを解消して前記第２のステートの前記命令を評価する、
ことを特徴とする請求項９または１０に記載の解析装置。
【請求項１２】
前記マージ部は、前記マージを行うことで、前記第１のステートまたは前記第２のステートに戻る場合には、前記マージを行わない、
ことを特徴とする請求項９〜１１のいずれか１つに記載の解析装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、解析プログラム、解析方法および解析装置に関する。
【背景技術】
【０００２】
従来、ソフトウェアのテストを評価する方法として、プログラムの１要素を変化させることでバグを埋め込み、テストによって埋め込んだバグをどれだけ検出できるかを調べるミューテーション解析という方法がある。ミューテーション解析では、要素を変化させたものであるミュータントを網羅的に生成するために、ミューテーションを行ったソースコードをそれぞれコンパイルして実行するので、処理に時間がかかっていた。このため、要素を複数のミュータントに置き換えてミューテーションを行うことに代えて、パラメータを与えることで具体的なミュータントを表す関数であるメタ関数に置き換えることで、コンパイルのコストを抑えることが提案されている。
【０００３】
また、要素をそれぞれのミュータントに置き換えた状態（以下、ステートともいう。）を分割しながら実行することで、計算コストを低減させることが、論文（K.  N.  King  and  J.  Offutt,  "A  Fortran  Language  System  for  Mutation-Based  Software  Testing",  Software-Practice  and  Experience,1991.）により提案されている。
【０００４】
また、ミュータントの実行結果が元の実行結果と同じものを除去し、さらに、同じ実行結果となるミュータントをまとめることで、計算コストを低減させることが、論文（Rene  Just,  et  al.,  Efficient  mutation  analysis  by  propagating  and  partitioning  infected  execution  states.  ISSTA2014）により提案されている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００９−１８１５４９号公報
【特許文献２】特開平８−０４４５９０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、同じ実行結果となるミュータントをまとめる場合に、ミュータントの実行のパスが元の実行のパスと変わる可能性がある。このため、例えば、ループを複数回実行したときに状態が等価であるか否かは、ミュータントを実行しないとわからないこととなる。すなわち、同じ実行結果となるミュータントをまとめることができない場合があるため、高次ミューテーション（Higher  order  mutation）の状態数を削減することが困難である。
【０００７】
一つの側面では、本発明は、高次ミューテーションの状態数を削減できる解析プログラム、解析方法および解析装置を提供することにある。
【課題を解決するための手段】
【０００８】
一つの態様では、記録媒体に記録された解析プログラムは、ソースコード内の要素をミュータントに変化させるメタ関数に置換してコンパイルした中間コードを実行する際に、前記メタ関数に対応するミューテーション演算について、前記ミュータントの変化を示すミューテーション記述子の集合を保持する処理をコンピュータに実行させる。解析プログラムは、前記ミューテーション記述子それぞれの命令を評価する処理をコンピュータに実行させる。解析プログラムは、前記ミューテーション記述子の集合のうち、前記命令の評価結果が同じとなる１つ以上の前記ミューテーション記述子を選択する処理をコンピュータに実行させる。解析プログラムは、前記選択された前記ミューテーション記述子と、前記ミューテーション演算、または、前記命令の評価前の前記ミューテーション記述子の集合である第１のステートとの直積を算出して第２のステートを生成する処理をコンピュータに実行させる。解析プログラムは、生成された前記第２のステートの前記ミューテーション記述子それぞれの命令を評価する際に、前記第２のステートが複数ある場合には、当該複数の前記第２のステートを１つのグループとして、該グループ内の前記第２のステートそれぞれに対して並列に前記命令を評価する処理をコンピュータに実行させる。解析プログラムは、前記グループ内における前記命令の評価結果に基づく第３のステートのうち、該評価結果が同じとなる前記第３のステートをマージする処理をコンピュータに実行させる。
【発明の効果】
【０００９】
高次ミューテーションの状態数を削減できる。
【図面の簡単な説明】
【００１０】
【図１】図１は、実施例の解析装置の構成の一例を示すブロック図である。
【図２】図２は、ミューテーション解析の一例を説明する図である。
【図３】図３は、ミューテーション解析の実行コストの一例を説明する図である。
【図４】図４は、状態を分割しながら実行する方法の一例を説明する図である。
【図５】図５は、計算コストを削減する方法の一例を説明する図である。
【図６】図６は、ミューテーション箇所の置き換えの一例を説明する図である。
【図７】図７は、ミュータント解析の一例を説明する図である。
【図８】図８は、同じ実行結果となるミュータントをまとめることができない場合の一例を説明する図である。
【図９】図９は、命令記憶部の一例を示す図である。
【図１０】図１０は、評価結果記憶部の一例を示す図である。
【図１１】図１１は、実行状態集合記憶部の一例を示す図である。
【図１２】図１２は、テスト結果記憶部の一例を示す図である。
【図１３】図１３は、テスト対象のソースコードの一例を示す図である。
【図１４】図１４は、メタ関数を埋め込んだソースコードの一例を示す図である。
【図１５】図１５は、中間コードの一例を示す図である。
【図１６】図１６は、テスト項目の一例を示す図である。
【図１７】図１７は、ミューテーションオペレータリストの一例を示す図である。
【図１８】図１８は、実施例の解析処理の一例を示すフローチャートである。
【図１９】図１９は、ステート選択処理の一例を示すフローチャートである。
【図２０】図２０は、ステート分割処理の一例を示すフローチャートである。
【図２１】図２１は、ステートマージ処理の一例を示すフローチャートである。
【図２２】図２２は、ステート完了チェック処理の一例を示すフローチャートである。
【図２３】図２３は、ｗｈｉｌｅループの１回目の一例を説明する図である。
【図２４】図２４は、ｗｈｉｌｅループの１回目の一例を説明する図である。
【図２５】図２５は、ｗｈｉｌｅループの１回目の一例を説明する図である。
【図２６】図２６は、ｗｈｉｌｅループの１回目の一例を説明する図である。
【図２７】図２７は、ｗｈｉｌｅループの１回目の一例を説明する図である。
【図２８】図２８は、ｗｈｉｌｅループの１回目の一例を説明する図である。
【図２９】図２９は、ｗｈｉｌｅループの１回目の一例を説明する図である。
【図３０】図３０は、ｗｈｉｌｅループの１回目の一例を説明する図である。
【図３１】図３１は、ｗｈｉｌｅループの２回目の一例を説明する図である。
【図３２】図３２は、ｗｈｉｌｅループの２回目の一例を説明する図である。
【図３３】図３３は、ｗｈｉｌｅループの２回目の一例を説明する図である。
【図３４】図３４は、ｗｈｉｌｅループの２回目の一例を説明する図である。
【図３５】図３５は、ｗｈｉｌｅループの２回目の一例を説明する図である。
【図３６】図３６は、ｗｈｉｌｅループの２回目の一例を説明する図である。
【図３７】図３７は、ｗｈｉｌｅループの２回目の一例を説明する図である。
【図３８】図３８は、ｗｈｉｌｅループの３回目の一例を説明する図である。
【図３９】図３９は、ｗｈｉｌｅループの３回目の一例を説明する図である。
【図４０】図４０は、ｗｈｉｌｅループの４回目の一例を説明する図である。
【図４１】図４１は、ｗｈｉｌｅループの４回目の一例を説明する図である。
【図４２】図４２は、ｗｈｉｌｅループの５回目の一例を説明する図である。
【図４３】図４３は、ｗｈｉｌｅループの２回目の一例を説明する図である。
【図４４】図４４は、ｗｈｉｌｅループの２回目の一例を説明する図である。
【図４５】図４５は、ｗｈｉｌｅループの２回目の一例を説明する図である。
【図４６】図４６は、ｗｈｉｌｅループの２回目の一例を説明する図である。
【図４７】図４７は、各ステートの割り振りの一例を説明する図である。
【図４８】図４８は、解析プログラムを実行するコンピュータの一例を示す図である。
【発明を実施するための形態】
【００１１】
以下、図面に基づいて、本願の開示する解析プログラムを記録した記録媒体、解析方法および解析装置の実施例を詳細に説明する。なお、本実施例により、開示技術が限定されるものではない。また、以下の実施例は、矛盾しない範囲で適宜組みあわせてもよい。
【実施例】
【００１２】
図１は、実施例の解析装置の構成の一例を示すブロック図である。図１に示す解析装置１００は、ソースコード内の要素をミュータントに変化させるメタ関数に置換してコンパイルした中間コードを実行する際に、メタ関数に対応するミューテーション演算について、ミュータントの変化を示すミューテーション記述子の集合を保持する。解析装置１００は、ミューテーション記述子それぞれの命令を評価する。解析装置１００は、ミューテーション記述子の集合のうち、命令の評価結果が同じとなる１つ以上のミューテーション記述子を選択する。解析装置１００は、選択されたミューテーション記述子と、ミューテーション演算、または、命令の評価前のミューテーション記述子の集合である第１のステートとの直積を算出して第２のステートを生成する。解析装置１００は、生成された第２のステートのミューテーション記述子それぞれの命令を評価する際に、第２のステートが複数ある場合には、当該複数の第２のステートを１つのグループとして、該グループ内の第２のステートそれぞれに対して並列に命令を評価する。解析装置１００は、グループ内における命令の評価結果に基づく第３のステートのうち、該評価結果が同じとなる第３のステートをマージする。これにより、解析装置１００は、高次ミューテーションの状態数を削減できる。
【００１３】
ここで、ミューテーション解析について説明する。図２は、ミューテーション解析の一例を説明する図である。図２に示すように、ミューテーション解析では、テスト対象プログラムであるソースコード１０の要素に対して、ミューテーションが行われる。ソースコード１０ａは、例えば、ソースコード１０に対して「ｍｕｔａｎｔ１」で示すミューテーションが行われたソースコードである。「ｍｕｔａｎｔ１」は、例えば、２行目の「＜＝」を「＞」に変化させる。すなわち、ソースコード１０ａでは、ソースコード１０と比べて、ミューテーション箇所１１で示す部分が変化している。
【００１４】
同様に、ソースコード１０ｂは、例えば、ソースコード１０に対して「ｍｕｔａｎｔ２」で示すミューテーションが行われたソースコードである。「ｍｕｔａｎｔ２」は、例えば、２行目の「０」を「１」に変化させる。すなわち、ソースコード１０ｂでは、ソースコード１０と比べて、ミューテーション箇所１２で示す部分が変化している。同様に、ソースコード１０ｃは、例えば、ソースコード１０に対して「ｍｕｔａｎｔ３」で示すミューテーションが行われたソースコードである。「ｍｕｔａｎｔ３」は、例えば、３行目の「−」を「−−」に変化させる。すなわち、ソースコード１０ｃでは、ソースコード１０と比べて、ミューテーション箇所１３で示す部分が変化している。
【００１５】
これらのミューテーションされたソースコード１０ａ〜１０ｃに対して、あるテストを実行した結果がテスト結果１４である。例えば「Ｔｅｓｔ１」では、「ａｂｓ」に「２」が入力されて「２」が出力されると「ｐａｓｓ」とし、「２」以外が出力されると「ｆａｉｌ」とする。また、例えば「Ｔｅｓｔ２」では、「ａｂｓ」に「−２」が入力されて「２」が出力されると「ｐａｓｓ」とし、「２」以外が出力されると「ｆａｉｌ」とする。このとき、「ｍｕｔａｎｔ１」〜「ｍｕｔａｎｔ３」のそれぞれの結果は、テスト結果１４に示す通りとなる。
【００１６】
「ｍｕｔａｎｔ１」は、「Ｔｅｓｔ１」および「Ｔｅｓｔ２」のいずれも「ｆａｉｌ」となり、埋め込まれたバグを検出できるので「ｋｉｌｌｅｄ」となる。「ｍｕｔａｎｔ２」は、「Ｔｅｓｔ１」および「Ｔｅｓｔ２」のいずれも「ｐａｓｓ」となり、埋め込まれたバグを検出できないので「ｕｎｋｉｌｌｅｄ」となる。「ｍｕｔａｎｔ３」は、「Ｔｅｓｔ１」が「ｐａｓｓ」、「Ｔｅｓｔ２」が「ｆａｉｌ」となり、埋め込まれたバグを検出できるので「ｋｉｌｌｅｄ」となる。この結果、「ｋｉｌｌｅｄ」となったミュータントの割合を示すミューテーションスコア（mutation  score）は、２／３＝０．６６７となる。
【００１７】
次に、ミューテーション解析の実行コストについて説明する。図３は、ミューテーション解析の実行コストの一例を説明する図である。図３に示すように、ミューテーション解析では、ソースコード２１をミューテーションしたソースコード群２２を、それぞれコンパイルして実行ファイル群２３を生成する。ミューテーション解析では、さらに、生成した実行ファイル群２３についてテストを実行し、テスト結果群２４を得る。このときのミューテーション解析の実行時間は、合計時間＝（ミュータント数）×（ミューテーション時間＋コンパイル時間）＋（ミュータント数）×（テスト項目数）×（１回の実行時間）となる。すなわち、図３に示すミューテーション解析の実行時間は、ミュータントを網羅的に生成するため、多くの時間がかかってしまうことになる。
【００１８】
これに対し、例えば、ＭＳＧ（Mutant  Schema  Generation）は、ソースコードの要素を、パラメータを与えることで具体的なミュータントを表す関数であるメタ関数に置き換えることで、コンパイルのコストを抑える。また、要素をそれぞれのミュータントに置き換えたステートを分割しながら実行することで、計算コストを低減させる分割実行ストリーム（Split-Stream  Execution）がある。
【００１９】
図４は、状態を分割しながら実行する方法の一例を説明する図である。図４の例では、「％１＝２＋２」という命令２６に対してミューテーションを行う。図４の例では、「Ｓｔａｔｅ１」で示すステート２５に対して命令２６を実行する際に、演算子「＋」をミューテーションさせる。図４の例では、「Ｓｔａｔｅ１」で示すステート２７ａ、「Ｓｔａｔｅ２」で示すステート２７ｂ、「Ｓｔａｔｅ３」で示すステート２７ｃ、「Ｓｔａｔｅ４」で示すステート２７ｄ、および、「Ｓｔａｔｅ５」で示すステート２７ｅの５つに分割される。
【００２０】
ステート２７ａは、命令２６の演算子「＋」をそのまま用いるので、命令２６の計算結果は「％１＝４」となる。ステート２７ａのミューテーション記述子２８ａは、「｛｝」となる。ステート２７ｂは、命令２６の演算子を「−」にミューテーションさせるので、命令２６の計算結果は「％１＝０」となる。ステート２７ｂのミューテーション記述子２８ｂは、「｛（１，−）｝」となる。なお、ミューテーション記述子２８ｂは、ミューテーション箇所を示すミューテーションＩＤ（IDentifier）「１」と、変更内容「−」とのペアで表され、以下のミューテーション記述子においても同様である。
【００２１】
ステート２７ｃは、命令２６の演算子を「＊」にミューテーションさせるので、命令２６の計算結果は「％１＝４」となる。ステート２７ｃのミューテーション記述子２８ｃは、「｛（１，＊）｝」となる。ステート２７ｄは、命令２６の演算子を「／」にミューテーションさせるので、命令２６の計算結果は「％１＝１」となる。ステート２７ｄのミューテーション記述子２８ｄは、「｛（１，／）｝」となる。ステート２７ｅは、命令２６の演算子を「％」にミューテーションさせるので、命令２６の計算結果は「％１＝０」となる。ステート２７ｅのミューテーション記述子２８ｅは、「｛（１，％）｝」となる。
【００２２】
また、ミュータントの実行結果が元の実行結果と同じものを除去し、さらに、同じ実行結果となるミュータントをまとめる方法について、図５を用いて説明する。図５は、計算コストを削減する方法の一例を説明する図である。なお、図５の方法は、Mutants  filtering  with  dynamic  analysisという。図５の例では、インフェクション（Infection）２９、プロパゲーション（Propagation）３０およびパーティショニング（Partitioning）３１の順番で計算コストを削減する。インフェクション２９は、値が変化しない、つまり感染しないミュータントを除去する。図５の例では、テスト入力がａ＝２、ｂ＝２、ｃ＝０とすると、元の命令における式２９ａは、ａ＋ｂ＝２＋２＝４となる。インフェクション２９では、演算子「＋」が「＊」、「／」、「％」および「−」にミューテーションされると、演算子「＊」にミューテーションされた式２９ｂが式２９ａと同じ「４」となるので、演算子「＊」のミュータントが除去される。
【００２３】
続いて、プロパゲーション３０は、伝染しないミュータントを除去する。図５の例では、元の命令における式３０ａは、ａ＋ｂ＞ｃ、つまり２＋２＞０となるので「ｔｒｕｅ」となる。プロパゲーション３０では、演算子「＋」が「／」、「％」および「−」にミューテーションされた場合に、式３０ａが演算子「／」にミューテーションされた式３０ｂを含むと、演算子「＋」である式３０ａと同じ「ｔｒｕｅ」となるので、演算子「／」のミュータントが除去される。
【００２４】
次に、パーティショニング３１は、同じ結果となるミュータントをまとめる。図５の例では、式３０ａは、演算子「＋」が「％」および「−」にミューテーションされた場合に、どちらも「ｆａｌｓｅ」となるので、式３１ａと式３１ｂとをまとめることができる。
【００２５】
この図５の方法は、４ステップの実行手順を有する。４ステップの実行手順について、図６  および  図７を用いて説明する。図６は、ミューテーション箇所の置き換えの一例を説明する図である。図６に示すように、１つ目のステップは、対象プログラムのミューテーション箇所をｅｖａｌメソッド呼出に置き換え、ＩＤに基づく２つのマップを生成する。図６の例では、ミューテーション箇所を含む式３２について、「ａ」をｅｘｐｒ１、「ｂ」をｅｘｐｒ２、「ａ＋ｂ」をｅｘｐｒ３、「ｃ」をｅｘｐｒ４、「ａ＋ｂ＞ｃ」をｅｘｐｒ５とする。
【００２６】
式３３は、ミューテーション箇所をｅｖａｌメソッド呼出に置き換えた式である。表３４は、ｅｘｐｒ３に対応するＩＤ「３ｅ」、および、ｅｘｐｒ５に対応するＩＤ「５ｅ」のそれぞれに含まれる要素を示す。表３５は、どのようなミューテーションができるかを示す表、つまりモニタ対象を示す表であり、例えば、ＩＤ「１ｍ」は、ＩＤ「３ｅ」について「＋」を「−」に変化させることを示す。また、例えば、ＩＤ「３ｍ」は、ＩＤ「５ｅ」について「＞」を「＞＝」に変化させることを示す。
【００２７】
図７は、ミュータント解析の一例を説明する図である。図７に示すように、２つ目のステップは、置換されたプログラムでテストを実行し、必要なミュータントを解析する。図７の例では、まず、式３６について、モニタ対象のミュータントのうち「３ｅ」が対象のものが解析される。解析結果３７では、「２ｍ」の結果が「４」となり「３ｅ」の結果と同じとなるので、「２ｍ」は除去される。
【００２８】
次に、図７の例では、式３８について、モニタ対象のミュータントのうち「５ｅ」が対象のものと、伝播している「１ｍ」とについて解析される。解析結果３９では、「３ｍ」の結果が「ｔｒｕｅ」となり「５ｅ」の結果と同じとなるので、「３ｍ」は除去される。同様に、解析結果３９では、「４ｍ」の結果が「ｆａｌｓｅ」となり「１ｍ」の結果と同じとなるので、「４ｍ」と「１ｍ」とは１つにまとめられ、インフェクションが確定した「１ｍ」はモニタ対象から外される。なお、「４ｍ」と「１ｍ」とは、どちらにまとめても構わない。
【００２９】
３つ目のステップは、元のプログラムにミュータントを埋め込む。４つ目のステップは、各ミュータントに対してテストを実行する。すなわち、図６および図７では、１つ目と２つ目のステップでミュータントを削減し、３つ目と４つ目のステップでミューテーションを実行する。しかしながら、上述の計算コストを削減する方法では、２つ目のステップにおいてミュータントの実行を行わないため、高次ミューテーションの状態数を削減することが困難である。
【００３０】
図８は、同じ実行結果となるミュータントをまとめることができない場合の一例を説明する図である。図８の例では、ソースコード４０に対してテスト入力ａ＝２、ｂ＝２、ｃ＝０であった場合の各ミュータントのコンテキストが異なる場合が発生する。表４１は、ソースコード４０の１回目と２回目の実行後の各ミュータントのコンテキストを示す。式４２ａおよび式４２ｂは、１回目の実行後は同じ結果４３となり、同じパーティションと判定される。ところが、式４２ａおよび式４２ｂは、２回目の実行後は、それぞれ結果４３ａおよび結果４３ｂのように、異なる結果となり、異なるパーティションであると判定される。すなわち、範囲４４で示す結果は、ミュータントを実行しないと結果が分からないこととなる。
【００３１】
また、計算コストを削減する方法に対して、状態を分割しながら実行する方法をそのまま適用すると、無駄な状態分割が多くなる。状態を分割するには、重い処理であるコピーする処理が含まれるため、状態分割は、なるべく少ない方が好ましい。
【００３２】
上述の様な課題に対して、本実施例では、ソースコード内の命令を先に評価し、命令の評価結果に基づいて状態（ステート）をまとめることで、高次ミューテーションの状態数を削減できる。
【００３３】
次に、図１の説明に戻って、解析装置１００の構成について説明する。図１に示すように、解析装置１００は、通信部１１０と、入力部１１１と、表示部１１２と、操作部１１３と、記憶部１２０と、制御部１３０とを有する。なお、解析装置１００は、図１に示す機能部以外にも既知のコンピュータが有する各種の機能部、例えば各種の入力デバイスや音声出力デバイス等の機能部を有することとしてもかまわない。
【００３４】
通信部１１０は、例えば、ＮＩＣ（Network  Interface  Card）等によって実現される。通信部１１０は、図示しないネットワークを介して他の情報処理装置と有線または無線で接続され、他の情報処理装置との間で情報の通信を司る通信インタフェースである。通信部１１０は、例えば、他の情報処理装置から解析対象のソースコード、テスト項目およびミューテーションオペレータリストを受信する。通信部１１０は、受信した解析対象のソースコード、テスト項目およびミューテーションオペレータリストを制御部１３０に出力する。
【００３５】
入力部１１１は、例えば、光学ディスク、ＵＳＢ（Universal  Serial  Bus）メモリ、ＳＤメモリカード等の外部記憶媒体に対する媒体アクセス装置等によって実現される。入力部１１１は、外部記憶媒体に記憶された解析対象のソースコード、テスト項目およびミューテーションオペレータリストを読み取って、読み取った解析対象のソースコード、テスト項目およびミューテーションオペレータリストを制御部１３０に出力する。なお、解析対象のソースコード、テスト項目およびミューテーションオペレータリストは、通信部１１０または入力部１１１のいずれかから制御部１３０に入力されればよく、以下の説明では、入力部１１１から制御部１３０に入力される場合について説明する。
【００３６】
表示部１１２は、各種情報を表示するための表示デバイスである。表示部１１２は、例えば、表示デバイスとして液晶ディスプレイ等によって実現される。表示部１１２は、制御部１３０から入力された結果画面等の各種画面を表示する。
【００３７】
操作部１１３は、解析装置１００のユーザから各種操作を受け付ける入力デバイスである。操作部１１３は、例えば、入力デバイスとして、キーボードやマウス等によって実現される。操作部１１３は、ユーザによって入力された操作を操作情報として制御部１３０に出力する。なお、操作部１１３は、入力デバイスとして、タッチパネル等によって実現されるようにしてもよく、表示部１１２の表示デバイスと、操作部１１３の入力デバイスとは、一体化されるようにしてもよい。
【００３８】
記憶部１２０は、例えば、ＲＡＭ（Random  Access  Memory）、フラッシュメモリ（Flash  Memory）等の半導体メモリ素子、ハードディスクや光ディスク等の記憶装置によって実現される。記憶部１２０は、命令記憶部１２１と、評価結果記憶部１２２と、実行状態集合記憶部１２３と、テスト結果記憶部１２４とを有する。また、記憶部１２０は、制御部１３０での処理に用いる情報を記憶する。
【００３９】
命令記憶部１２１は、ソースコードがコンパイルされた中間コードの各命令を命令ＩＤと対応付けて記憶する。なお、中間コードは、例えば、ビットコードが挙げられる。図９は、命令記憶部の一例を示す図である。図９に示すように、命令記憶部１２１は、「命令ＩＤ」、「命令」といった項目を有する。命令記憶部１２１は、例えば、命令ＩＤごとに１レコードとして記憶する。
【００４０】
「命令ＩＤ」は、命令ごとに一意に付される番号（ＩＤ）であり、命令を識別する識別子である。「命令」は、中間コードの各命令を示す情報である。
【００４１】
図１の説明に戻って、評価結果記憶部１２２は、ミューテーションされた各ミュータントの評価結果を記憶する。図１０は、評価結果記憶部の一例を示す図である。図１０に示すように、評価結果記憶部１２２は、例えば、命令の結果を格納するレジスタを示す「％１」に対して、ミューテーション記述子で記述された各ミュータントの評価結果を対応付けて記憶する。なお、評価結果記憶部１２２は、評価される命令が変わる度に、ミューテーション記述子に応じて更新される。
【００４２】
図１の説明に戻って、実行状態集合記憶部１２３は、各命令のミューテーション記述子と評価結果とを、ステートＩＤに対応付けて記憶する。すなわち、実行状態集合記憶部１２３は、実行状態集合を記憶する。図１１は、実行状態集合記憶部の一例を示す図である。図１１に示すように、実行状態集合記憶部１２３は、「ステートＩＤ」、「命令ＩＤ」、「命令結果」、「ミューテーション記述子」、「同期実行グループ」といった項目を有する。実行状態集合記憶部１２３は、例えば、ステートＩＤごとに１レコードとして記憶する。
【００４３】
「ステートＩＤ」は、実行状態、つまりステートを識別する識別子である。なお、「ステートＩＤ」は、命令の評価後のステートに引き継いでもよい。「命令ＩＤ」は、命令を識別する識別子である。「命令結果」は、命令の評価結果、つまり実行結果を示す情報である。「ミューテーション記述子」は、対応するステートＩＤにおける命令のミューテーション記述子を示す情報である。「同期実行グループ」は、複数のステートの命令を並列に評価するグループを示す情報である。「同期実行グループ」は、例えば、並列に評価中のステートＩＤに対して○印が付されることで、並列に評価中のステートＩＤを識別できる。
【００４４】
図１の説明に戻って、テスト結果記憶部１２４は、ミューテーションされたソースコードに対して、テストを実行した結果であるテスト結果、すなわちテスト結果群を記憶する。図１２は、テスト結果記憶部の一例を示す図である。図１２に示すように、テスト結果記憶部１２４は、「テスト」、「ミュータント」、「テスト合否」といった項目を有する。テスト結果記憶部１２４は、テスト項目ごとに１レコードとして記憶する。
【００４５】
「テスト」は、命令に対するテスト入力を示す情報である。「ミュータント」は、命令に対するミュータントを示す情報である。「ミュータント」は、例えば、「｛（２，！＝）｝」のように、ミューテーション記述子で記述される。「テスト合否」は、テスト対象のソースコードのミューテーションに対するテストの合否を示す情報であり、「Ｐａｓｓ」または「Ｆａｉｌ」で表わされる。「Ｐａｓｓ」は、ソースコード内の要素がミュータントに置換された場合に、当該テスト項目において埋め込まれたバグを検出できなかったことを示す。「Ｆａｉｌ」は、ソースコード内の要素がミュータントに置換された場合に、当該テスト項目において埋め込まれたバグを検出できたことを示す。図１２の１行目の例では、テスト入力「ａ＝２，ｂ＝２，ｃ＝０」に対してミューテーションＩＤ「２」の要素（演算子）を「！＝」にミューテーションした結果、テスト合否は「Ｐａｓｓ」、つまり埋め込まれたバグを検出できなかったことを示す。
【００４６】
図１の説明に戻って、制御部１３０は、例えば、ＣＰＵ（Central  Processing  Unit）やＭＰＵ（Micro  Processing  Unit）等によって、内部の記憶装置に記憶されているプログラムがＲＡＭを作業領域として実行されることにより実現される。また、制御部１３０は、例えば、ＡＳＩＣ（Application  Specific  Integrated  Circuit）やＦＰＧＡ（Field  Programmable  Gate  Array）等の集積回路により実現されるようにしてもよい。制御部１３０は、置換部１３１と、コンパイラ１３２と、状態管理部１３３と、命令評価部１３４と、出力部１３５とを有し、以下に説明する情報処理の機能や作用を実現または実行する。なお、制御部１３０の内部構成は、図１に示した構成に限られず、後述する情報処理を行う構成であれば他の構成であってもよい。
【００４７】
置換部１３１は、入力部１１１からソースコードが入力されると、ソースコード内の要素について、要素をミュータントに変化させるメタ関数に置換する。なお、メタ関数は、ミューテーションＩＤを引数に持つ。置換部１３１は、ソースコード内の要素がメタ関数に置換された、つまりメタ関数が埋め込まれた置換後のソースコードをコンパイラ１３２に出力する。
【００４８】
ここで、図１３および図１４を用いて、メタ関数の埋め込みについて説明する。図１３は、テスト対象のソースコードの一例を示す図である。図１４は、メタ関数を埋め込んだソースコードの一例を示す図である。置換部１３１は、例えば、図１３に示すソースコード４５に対して、２行目のｗｈｉｌｅ文の演算子「＋」、「＞」、および、３行目のインクリメントを示す演算子「＋＋」にそれぞれ対応するメタ関数を埋め込む。置換部１３１は、ソースコード４５にメタ関数を埋め込んで、図１４に示す置換後のソースコード４６を生成する。
【００４９】
図１の説明に戻って、コンパイラ１３２は、置換部１３１から置換後のソースコードが入力されると、置換後のソースコードをＶＭ（Virtual  Machine）上で実行可能な中間コードであるビットコードにコンパイルする。コンパイラ１３２は、例えば、置換後のソースコードをＬＬＶＭビットコードにコンパイルする。なお、以下の説明では、ＬＬＶＭビットコードを、単に中間コードと称して説明する。コンパイラ１３２は、コンパイルした中間コードを状態管理部１３３に出力する。
【００５０】
ここで、図１５を用いて、中間コードについて説明する。図１５は、中間コードの一例を示す図である。図１５に示すように、コンパイラ１３２は、例えば、置換後のソースコードをＬＬＶＭビットコードである中間コード４７にコンパイルする。図１５に示す中間コード４７には、図１４で埋め込まれたメタ関数を含む命令がコンパイルされる。
【００５１】
図１の説明に戻って、状態管理部１３３には、入力部１１１からテスト項目およびミューテーションオペレータリストが入力される。また、状態管理部１３３には、コンパイラ１３２から中間コードが入力される。状態管理部１３３は、中間コードが入力されると、テスト項目およびミューテーションオペレータリストに基づいて、テスト入力、つまりテストケースを選択する。テストケースは、例えば、「ａ＝２，ｂ＝２，ｃ＝０」等が挙げられる。
【００５２】
ここで、図１６および図１７を用いて、テスト項目およびミューテーションオペレータリストについて説明する。図１６は、テスト項目の一例を示す図である。図１７は、ミューテーションオペレータリストの一例を示す図である。図１６に示すように、テスト項目４８は、例えば、テスト項目ごとに関数の形で表現される。また、図１７に示すように、ミューテーションオペレータリスト４９は、例えば、ＯＳＳＮ（Shift  operator  mutation）、ＯＲＲＮ（Relational  operator  mutation）、ＯＩＤＯ（Increment/Decrement  Replacement）といった形で表現される。
【００５３】
状態管理部１３３は、テストケースを選択すると、初期実行ステートを生成する。状態管理部１３３は、初期実行ステートを生成すると、ステート選択処理を実行する。状態管理部１３３は、ステート選択処理として、まず、実行状態集合記憶部１２３を参照し、実行状態集合の中に同期実行グループ（以下、単にグループともいう。）に含まれるステートが存在するか否かを判定する。状態管理部１３３は、グループに含まれるステートが存在しない場合には、任意の方法、例えば、深さ優先でステートを選択し、ステート選択処理を終了する。
【００５４】
状態管理部１３３は、グループに含まれるステートが存在する場合には、グループ内に評価中の命令が未実施のステートが存在するか否かを判定する。状態管理部１３３は、グループ内に評価中の命令が未実施のステートが存在する場合には、グループのうち評価中の命令が未実施のステートから任意の１ステートを選択し、ステート選択処理を終了する。状態管理部１３３は、グループ内に評価中の命令が未実施のステートが存在しない場合には、次の命令を評価中として該命令が未実施のステートを選択し、ステート選択処理を終了する。状態管理部１３３は、ステート選択処理を終了すると、選択したステートのステートＩＤを命令評価部１３４に出力する。
【００５５】
状態管理部１３３は、命令評価部１３４からグループ解除指示が入力されると、実行状態集合記憶部１２３の同期実行グループ欄を消去してグループを解除する。状態管理部１３３は、グループを解除すると、解除完了情報を命令評価部１３４に出力する。
【００５６】
状態管理部１３３は、命令評価部１３４からステート分割指示が入力されると、ステート分割処理を実行する。状態管理部１３３は、ステート分割処理として、まず、ステート分割指示に対応するステートで実行済みのメタ関数か否かを判定する。状態管理部１３３は、実行済みのメタ関数である場合には、元のステートのミューテーション記述子のうち、当該メタ関数に対応するミューテーション演算を集めた集合Ｍ、つまりミューテーション演算に用いるミューテーション記述子を、ステートＩＤに対応付けて実行状態集合記憶部１２３に記憶する。状態管理部１３３は、集合ＭをステートＩＤに対応付けて実行状態集合記憶部１２３に記憶すると、評価指示を命令評価部１３４に出力する。
【００５７】
状態管理部１３３は、実行済みのメタ関数でない場合には、当該メタ関数に対応するミューテーション演算の集合Ｍ、つまりミューテーション演算に用いるミューテーション記述子を、ステートＩＤに対応付けて実行状態集合記憶部１２３に記憶する。状態管理部１３３は、集合ＭをステートＩＤに対応付けて実行状態集合記憶部１２３に記憶すると、評価指示を命令評価部１３４に出力する。
【００５８】
状態管理部１３３は、命令評価部１３４からグループ判定指示が入力されると、実行状態集合記憶部１２３を参照し、分割前のステートがグループに属しているか否かを判定する。状態管理部１３３は、分割前のステートがグループに属している場合には、分割前のグループに分割後のステートも含めることとする。つまり、状態管理部１３３は、実行状態集合記憶部１２３の対応するステートの同期実行グループ欄に○印を記憶する。状態管理部１３３は、分割したステートをグループに分類すると、ステート分割処理を終了する。
【００５９】
状態管理部１３３は、分割前のステートがグループに属していない場合には、新たにグループを生成し、分割後のステートを生成したグループに含めることとする。つまり、状態管理部１３３は、実行状態集合記憶部１２３の分割後のステートの同期実行グループ欄に○印を記憶する。状態管理部１３３は、分割したステートをグループに分類すると、ステート分割処理を終了する。
【００６０】
状態管理部１３３は、ステート分割処理が終了するか、命令評価部１３４から命令実行情報が入力されると、ステートがグループに含まれ、かつ、グループ内の全てのステートが同じ命令を実行済みか否かを判定する。状態管理部１３３は、ステートがグループに含まれ、かつ、グループ内の全てのステートが同じ命令を実行済みである場合には、ステートマージ処理を実行する。状態管理部１３３は、ステートがグループに含まれ、かつ、グループ内の全てのステートが同じ命令を実行済みでない場合には、ステート完了チェック処理を実行する。
【００６１】
状態管理部１３３は、ステートマージ処理として、まず、グループ内のステートが全て同じ評価結果か否かを判定する。状態管理部１３３は、グループ内のステートが全て同じ評価結果である場合には、ステートマージ処理を終了する。状態管理部１３３は、グループ内のステートが全て同じ評価結果でない場合には、グループ内のステートｓについて、マージを行う。状態管理部１３３は、グループ内で同じ評価結果となる他のステートがあるか否かを判定する。状態管理部１３３は、グループ内で同じ評価結果となる他のステートがある場合には、同じ評価結果となるステートにステートｓのミューテーション記述子を加え、ステートｓを削除する。状態管理部１３３は、グループ内で同じ評価結果となる他のステートがない場合には、次のステートについてマージを行う。状態管理部１３３は、グループ内のステートｓについて、マージが完了すると、ステートマージ処理を終了し、次にステート完了チェック処理を実行する。
【００６２】
状態管理部１３３は、ステート完了チェック処理として、まず、プログラムの終端か否かを判定する。状態管理部１３３は、プログラムの終端である場合には、実行状態集合記憶部１２３を参照して、テスト結果をテスト結果記憶部１２４に格納し、実行状態集合記憶部１２３のステートを削除してステート完了チェック処理を終了する。すなわち、状態管理部１３３は、選択中のテストケースにかかるステートの情報が記憶されている実行状態集合記憶部１２３をクリアする。
【００６３】
状態管理部１３３は、プログラムの終端でない場合には、ユーザ指定の終了条件を超えているか否かを判定する。状態管理部１３３は、ユーザ指定の終了条件を超えている場合には、実行状態集合記憶部１２３を参照して、テスト結果をテスト結果記憶部１２４に格納し、実行状態集合記憶部１２３のステートを削除してステート完了チェック処理を終了する。状態管理部１３３は、ユーザ指定の終了条件を超えていない場合には、メモリ不正アクセスなどの異常があるか否かを判定する。
【００６４】
状態管理部１３３は、異常がある場合には、実行状態集合記憶部１２３を参照して、テスト結果をテスト結果記憶部１２４に格納し、実行状態集合記憶部１２３のステートを削除してステート完了チェック処理を終了する。状態管理部１３３は、異常がない場合には、ステート完了チェック処理を終了する。
【００６５】
状態管理部１３３は、ステート完了チェック処理を終了すると、全てのステートが完了したか否かを判定する。状態管理部１３３は、全てのステートが完了していない場合には、ステート選択処理を実行する。状態管理部１３３は、全てのステートが完了した場合には、全てのテストケースが実行済みか否かを判定する。状態管理部１３３は、全てのテストケースが実行済みでない場合には、次のテストケースを選択し、選択したテストケースを用いて処理を繰り返す。状態管理部１３３は、全てのテストケースが実行済みである場合には、出力指示を出力部１３５に出力する。
【００６６】
上述の通り、状態管理部１３３は、ソースコード内の要素をミュータントに変化させるメタ関数に置換してコンパイルした中間コードを実行する際に、メタ関数に対応するミューテーション演算について、ミュータントの変化を示すミューテーション記述子の集合を管理する管理部の一例である。また、状態管理部１３３は、ミューテーション記述子の集合のうち、命令の評価結果が同じとなる１つ以上のミューテーション記述子を選択する選択部の一例である。また、状態管理部１３３は、グループ内における命令の評価結果に基づく第３のステートのうち、該評価結果が同じとなる第３のステートをマージするマージ部の一例である。また、状態管理部１３３は、副作用がない命令が続く間、グループ内で第３のステートをマージするマージ部の一例である。また、状態管理部１３３は、マージを行うことで、第１のステートまたは第２のステートに戻る場合には、マージを行わないマージ部の一例である。
【００６７】
命令評価部１３４は、状態管理部１３３からステートＩＤが入力されると、命令記憶部１２１および実行状態集合記憶部１２３を参照し、命令を読み込む。命令評価部１３４は、命令を読み込むと、ステートＩＤで示されるステートがグループに含まれ、かつ、副作用のない命令以外か否かを判定する。なお、副作用のない命令とは、指定されたメタ関数（increment/decrementを除く関数）、二項演算（ADD,OR等）、比較演算（ICMP,FCMP）、変換演算（Trunc,ZEXT等）、読み込み命令（load）およびgetelementptr命令等のメモリの内容が変わらない命令である。これに対し、副作用がある可能性を有する命令は、例えば、分岐命令、関数呼出、復帰命令（return）および変数への代入等が挙げられる。また、副作用がある可能性を有する命令は、例えば、グローバル変数の値を変更してしまう命令である。
【００６８】
命令評価部１３４は、ステートがグループに含まれ、かつ、副作用のない命令以外である場合には、状態管理部１３３にグループ解除指示を出力する。命令評価部１３４は、ステートがグループに含まれ、かつ、副作用のない命令以外でない場合、または、状態管理部１３３から解除完了情報が入力された場合には、命令がメタ関数の呼出か否かを判定する。命令評価部１３４は、命令がメタ関数の呼出でない場合には、当該命令を実行し、状態管理部１３３に命令実行情報を出力する。
【００６９】
命令評価部１３４は、命令がメタ関数の呼出である場合には、メタ関数がミューテーションオペレータリストに含まれているか否かを判定する。命令評価部１３４は、メタ関数がミューテーションオペレータリストに含まれていない場合には、当該命令を実行し、状態管理部１３３に命令実行情報を出力する。命令評価部１３４は、メタ関数がミューテーションオペレータリストに含まれている場合には、状態管理部１３３にステート分割指示を出力する。
【００７０】
命令評価部１３４は、状態管理部１３３から評価指示が入力されると、命令記憶部１２１および実行状態集合記憶部１２３を参照し、集合Ｍのミューテーション演算ｍについて先行評価を実行する。命令評価部１３４は、ミューテーション演算ｍの命令の評価結果を、評価結果記憶部１２２に記憶する。命令評価部１３４は、既に同じ評価結果となるステートがあるか否かを判定する。命令評価部１３４は、既に同じ評価結果となるステートがある場合には、元のステートをコピーし、評価結果をステートに記憶し、当該ステートを選択する。すなわち、命令評価部１３４は、実行状態集合記憶部１２３の当該ステートのステートＩＤに対応するレコードを更新する。
【００７１】
命令評価部１３４は、既に同じ評価結果となるステートがない場合には、同じ評価結果となるステートを生成して当該ステートを選択する。また、命令評価部１３４は、生成したステートを実行状態集合記憶部１２３に記憶する。すなわち、命令評価部１３４は、ステートを分割する。
【００７２】
命令評価部１３４は、選択したステートのミューテーション記述子に、ミューテーション演算ｍと元のステートのミューテーション記述子との直積を算出して加え、実行状態集合記憶部１２３を更新する。命令評価部１３４は、集合Ｍ内のミューテーション演算ｍについて、それぞれ、先行評価とステートの分割要否と直積の算出とを実行する。命令評価部１３４は、集合Ｍ内のミューテーション演算ｍについて、先行評価とステートの分割要否と直積の算出とが完了すると、グループ判定指示を状態管理部１３３に出力する。
【００７３】
上述の通り、命令評価部１３４は、ミューテーション記述子それぞれの命令を評価する第１評価部の一例である。また、命令評価部１３４は、選択されたミューテーション記述子と、ミューテーション演算、または、命令の評価前のミューテーション記述子の集合である第１のステートとの直積を算出して第２のステートを生成する生成部の一例である。なお、生成部の処理は、その一部を状態管理部１３３で行ってもよい。また、命令評価部１３４は、生成された第２のステートのミューテーション記述子それぞれの命令を評価する際に、第２のステートが複数ある場合には、当該複数の第２のステートを１つのグループとして、該グループ内の第２のステートそれぞれに対して並列に命令を評価する第２評価部の一例である。また、命令評価部１３４は、副作用がない命令以外の命令に到達すると、グループを解消して第２のステートの前記命令を評価する第２評価部の一例である。
【００７４】
出力部１３５は、状態管理部１３３から出力指示が入力されると、テスト結果記憶部１２４を参照し、テスト合否の項目について、「Ｐａｓｓ」であるミュータントを抽出する。また、出力部１３５は、テスト結果記憶部１２４のテスト合否の項目が「Ｆａｉｌ」であるミュータントの数を、ミュータントの総数で除算した値をミューテーションスコアとして算出する。出力部１３５は、算出したミューテーションスコアと、テスト合否の項目が「Ｐａｓｓ」であるミュータントとに基づいて、結果レポートを生成する。出力部１３５は、結果レポートを含む結果画面を生成し、生成した結果画面を表示部１１２に出力して表示させる。
【００７５】
次に、実施例の解析装置１００の動作について説明する。図１８は、実施例の解析処理の一例を示すフローチャートである。
【００７６】
置換部１３１は、入力部１１１からソースコードが入力されると、ソースコード内の要素について、要素をミュータントに変化させるメタ関数に置換し、ソースコード内に埋め込む（ステップＳ１）。置換部１３１は、置換後のソースコードをコンパイラ１３２に出力する。コンパイラ１３２は、置換部１３１から置換後のソースコードが入力されると、置換後のソースコードを中間コードにコンパイルする（ステップＳ２）。コンパイラ１３２は、コンパイルした中間コードを状態管理部１３３に出力する。
【００７７】
状態管理部１３３には、入力部１１１からテスト項目およびミューテーションオペレータリストが入力される。また、状態管理部１３３には、コンパイラ１３２から中間コードが入力される。状態管理部１３３は、中間コードが入力されると、テスト項目およびミューテーションオペレータリストに基づいて、テストケースを選択する（ステップＳ３）。状態管理部１３３は、テストケースを選択すると、初期実行ステートを生成する（ステップＳ４）。状態管理部１３３は、初期実行ステートを生成すると、ステート選択処理を実行する（ステップＳ５）。
【００７８】
ここで、図１９を用いて、ステート選択処理について説明する。図１９は、ステート選択処理の一例を示すフローチャートである。
【００７９】
状態管理部１３３は、ステート選択処理として、まず、実行状態集合記憶部１２３を参照し、実行状態集合の中にグループに含まれるステートが存在するか否かを判定する（ステップＳ５１）。状態管理部１３３は、グループに含まれるステートが存在しない場合には（ステップＳ５１：否定）、任意の方法でステートを選択し（ステップＳ５２）、元の処理に戻る。
【００８０】
状態管理部１３３は、グループに含まれるステートが存在する場合には（ステップＳ５１：肯定）、グループ内に評価中の命令が未実施のステートが存在するか否かを判定する（ステップＳ５３）。状態管理部１３３は、グループ内に評価中の命令が未実施のステートが存在する場合には（ステップＳ５３：肯定）、グループのうち評価中の命令が未実施のステートから任意の１ステートを選択し（ステップＳ５４）、元の処理に戻る。
【００８１】
状態管理部１３３は、グループ内に評価中の命令が未実施のステートが存在しない場合には（ステップＳ５３：否定）、次の命令を評価中として該命令が未実施のステートを選択し（ステップＳ５５）、元の処理に戻る。状態管理部１３３は、元の処理に戻ると、選択したステートのステートＩＤを命令評価部１３４に出力する。これにより、解析装置１００は、ステートを選択できる。
【００８２】
図１８の説明に戻って、命令評価部１３４は、状態管理部１３３からステートＩＤが入力されると、命令記憶部１２１および実行状態集合記憶部１２３を参照し、命令を読み込む（ステップＳ６）。命令評価部１３４は、命令を読み込むと、ステートＩＤで示されるステートがグループに含まれ、かつ、副作用のない命令以外か否かを判定する（ステップＳ７）。命令評価部１３４は、ステートがグループに含まれ、かつ、副作用のない命令以外である場合には（ステップＳ７：肯定）、状態管理部１３３にグループ解除指示を出力する。
【００８３】
状態管理部１３３は、命令評価部１３４からグループ解除指示が入力されると、実行状態集合記憶部１２３の同期実行グループ欄を消去してグループを解除する（ステップＳ８）。状態管理部１３３は、グループを解除すると、解除完了情報を命令評価部１３４に出力する。
【００８４】
命令評価部１３４は、ステートがグループに含まれ、かつ、副作用のない命令以外でない場合（ステップＳ７：否定）、または、状態管理部１３３から解除完了情報が入力された場合には、命令がメタ関数の呼出か否かを判定する（ステップＳ９）。命令評価部１３４は、命令がメタ関数の呼出でない場合には（ステップＳ９：否定）、当該命令を実行し（ステップＳ１１）、状態管理部１３３に命令実行情報を出力する。
【００８５】
命令評価部１３４は、命令がメタ関数の呼出である場合には（ステップＳ９：肯定）、メタ関数がミューテーションオペレータリストに含まれているか否かを判定する（ステップＳ１０）。命令評価部１３４は、メタ関数がミューテーションオペレータリストに含まれていない場合には（ステップＳ１０：否定）、当該命令を実行し（ステップＳ１１）、状態管理部１３３に命令実行情報を出力する。命令評価部１３４は、メタ関数がミューテーションオペレータリストに含まれている場合には（ステップＳ１０：肯定）、状態管理部１３３にステート分割指示を出力する。
【００８６】
状態管理部１３３は、命令評価部１３４からステート分割指示が入力されると、ステート分割処理を実行する（ステップＳ１２）。ここで、図２０を用いてステート分割処理について説明する。図２０は、ステート分割処理の一例を示すフローチャートである。状態管理部１３３は、ステート分割指示に対応するステートで実行済みのメタ関数か否かを判定する（ステップＳ１２１）。状態管理部１３３は、実行済みのメタ関数である場合には（ステップＳ１２１：肯定）、元のステートのミューテーション記述子のうち、当該メタ関数に対応するミューテーション演算を集めた集合Ｍを、ステートＩＤに対応付けて実行状態集合記憶部１２３に記憶する（ステップＳ１２２）。状態管理部１３３は、集合ＭをステートＩＤに対応付けて実行状態集合記憶部１２３に記憶すると、評価指示を命令評価部１３４に出力する。
【００８７】
状態管理部１３３は、実行済みのメタ関数でない場合には（ステップＳ１２１：否定）、当該メタ関数に対応するミューテーション演算の集合Ｍを、ステートＩＤに対応付けて実行状態集合記憶部１２３に記憶する（ステップＳ１２３）。状態管理部１３３は、集合ＭをステートＩＤに対応付けて実行状態集合記憶部１２３に記憶すると、評価指示を命令評価部１３４に出力する。
【００８８】
命令評価部１３４は、状態管理部１３３から評価指示が入力されると、集合Ｍ内のミューテーション演算ｍについて、それぞれ、先行評価とステートの分割要否と直積の算出とを実行するために、ステップＳ１２４ａからステップＳ１２４ｂ間を繰り返す。命令評価部１３４は、命令記憶部１２１および実行状態集合記憶部１２３を参照し、ミューテーション演算ｍの命令を先行評価する（ステップＳ１２５）。命令評価部１３４は、ミューテーション演算ｍの命令の評価結果を、評価結果記憶部１２２に記憶する。
【００８９】
命令評価部１３４は、既に同じ評価結果となるステートがあるか否かを判定する（ステップＳ１２６）。命令評価部１３４は、既に同じ評価結果となるステートがある場合には（ステップＳ１２６：肯定）、元のステートをコピーし、評価結果をステートに記憶し、当該ステートを選択する（ステップＳ１２７）。命令評価部１３４は、既に同じ評価結果となるステートがない場合には（ステップＳ１２６：否定）、同じ評価結果となるステートを生成して当該ステートを選択する（ステップＳ１２８）。
【００９０】
命令評価部１３４は、選択したステートのミューテーション記述子に、ミューテーション演算ｍと元のステートのミューテーション記述子との直積を算出して加え、実行状態集合記憶部１２３を更新する（ステップＳ１２９）。命令評価部１３４は、集合Ｍ内のミューテーション演算ｍについて、先行評価とステートの分割要否と直積の算出とが完了すると、グループ判定指示を状態管理部１３３に出力する。
【００９１】
状態管理部１３３は、命令評価部１３４からグループ判定指示が入力されると、実行状態集合記憶部１２３を参照し、分割前のステートがグループに属しているか否かを判定する（ステップＳ１３０）。状態管理部１３３は、分割前のステートがグループに属している場合には（ステップＳ１３０：肯定）、分割前のグループに分割後のステートも含めることとする（ステップＳ１３１）。状態管理部１３３は、分割前のステートがグループに属していない場合には（ステップＳ１３０：否定）、新たにグループを生成し、分割後のステートを生成したグループに含めることとする（ステップＳ１３２）。状態管理部１３３は、分割したステートをグループに分類すると、元の処理に戻る。これにより、解析装置１００は、ステートを分割できる。
【００９２】
図１８の説明に戻って、状態管理部１３３は、ステート分割処理が終了するか、命令評価部１３４から命令実行情報が入力されると、ステートがグループに含まれ、かつ、グループ内の全てのステートが同じ命令を実行済みか否かを判定する（ステップＳ１３）。状態管理部１３３は、ステートがグループに含まれ、かつ、グループ内の全てのステートが同じ命令を実行済みである場合には（ステップＳ１３：肯定）、ステートマージ処理を実行する（ステップＳ１４）。状態管理部１３３は、ステートがグループに含まれ、かつ、グループ内の全てのステートが同じ命令を実行済みでない場合には（ステップＳ１３：否定）、ステート完了チェック処理を実行する（ステップＳ１５）。
【００９３】
ここで、図２１を用いてステートマージ処理について説明する。図２１は、ステートマージ処理の一例を示すフローチャートである。状態管理部１３３は、グループ内のステートが全て同じ評価結果か否かを判定する（ステップＳ１４１）。状態管理部１３３は、グループ内のステートが全て同じ評価結果である場合には（ステップＳ１４１：肯定）、元の処理に戻る。状態管理部１３３は、グループ内のステートが全て同じ評価結果でない場合には（ステップＳ１４１：否定）、グループ内のステートｓについて、マージを行うために、ステップＳ１４２ａからステップＳ１４２ｂ間を繰り返す。
【００９４】
状態管理部１３３は、グループ内で同じ評価結果となる他のステートがあるか否かを判定する（ステップＳ１４３）。状態管理部１３３は、グループ内で同じ評価結果となる他のステートがある場合には（ステップＳ１４３：肯定）、同じ評価結果となるステートにステートｓのミューテーション記述子を加え、ステートｓを削除する（ステップＳ１４４）。状態管理部１３３は、グループ内で同じ評価結果となる他のステートがない場合には（ステップＳ１４３：否定）、次のステートについてマージを行う。状態管理部１３３は、グループ内のステートｓについてマージが完了すると、元の処理に戻る。これにより、解析装置１００は、ステートをマージすることができる。
【００９５】
図１８の説明に戻って、状態管理部１３３は、ステート完了チェック処理を実行する（ステップＳ１５）。ここで、図２２を用いてステート完了チェック処理について説明する。図２２は、ステート完了チェック処理の一例を示すフローチャートである。状態管理部１３３は、プログラムの終端か否かを判定する（ステップＳ１５１）。状態管理部１３３は、プログラムの終端である場合には（ステップＳ１５１：肯定）、実行状態集合記憶部１２３を参照して、テスト結果をテスト結果記憶部１２４に格納し、実行状態集合記憶部１２３のステートを削除して（ステップＳ１５４）、元の処理に戻る。
【００９６】
状態管理部１３３は、プログラムの終端でない場合には（ステップＳ１５１：否定）、ユーザ指定の終了条件を超えているか否かを判定する（ステップＳ１５２）。状態管理部１３３は、ユーザ指定の終了条件を超えている場合には（ステップＳ１５２：肯定）、ステップＳ１５４に進む。状態管理部１３３は、ユーザ指定の終了条件を超えていない場合には（ステップＳ１５２：否定）、メモリ不正アクセスなどの異常があるか否かを判定する（ステップＳ１５３）。状態管理部１３３は、異常がある場合には（ステップＳ１５３：肯定）、ステップＳ１５４に進む。状態管理部１３３は、異常がない場合には（ステップＳ１５３：否定）、元の処理に戻る。これにより、解析装置１００は、ステートの完了をチェックできる。
【００９７】
図１８の説明に戻って、状態管理部１３３は、全てのステートが完了したか否かを判定する（ステップＳ１６）。状態管理部１３３は、全てのステートが完了していない場合には（ステップＳ１６：否定）、ステップＳ５に戻る。状態管理部１３３は、全てのステートが完了した場合には（ステップＳ１６：肯定）、全てのテストケースが実行済みか否かを判定する（ステップＳ１７）。状態管理部１３３は、全てのテストケースが実行済みでない場合には（ステップＳ１７：否定）、ステップＳ３に戻る。状態管理部１３３は、全てのテストケースが実行済みである場合には（ステップＳ１７：肯定）、出力指示を出力部１３５に出力する。
【００９８】
出力部１３５は、状態管理部１３３から出力指示が入力されると、テスト結果記憶部１２４を参照し、ミューテーションスコアを算出する。また、出力部１３５は、算出したミューテーションスコアと、テスト合否の項目が「Ｐａｓｓ」であるミュータントとに基づいて、結果レポートを生成する。出力部１３５は、結果レポートを含む結果画面を生成し、生成した結果画面を表示部１１２に出力して表示させる（ステップＳ１８）。これにより、解析装置１００は、高次ミューテーションの状態数を削減できる。すなわち、解析装置１００は、ミューテーション解析の計算コストを低減することができる。
【００９９】
続いて、図２３から図４７を用いて、解析処理の具体例について説明する。なお、以下の説明では、各ステートに着目して説明する。また、ステートＩＤは、例えば「Ｓｔａｔｅ１」、「Ｓｔａｔｅ２」というように「Ｓｔａｔｅ」＋番号といった形式とするが、同一のステートＩＤの更新前後は異なる符号としている。また、本具体例では、図１３に示すソースコード４５、図１４に示す置換後のソースコード４６、および、図１５に示す中間コード４７を用いる。なお、本具体例では、ステートの情報は、適宜実行状態集合記憶部１２３に記憶されるものとする。
【０１００】
図２３から図３０は、ｗｈｉｌｅループの１回目の一例を説明する図である。図２３から図３０では、ソースコード４５のｗｈｉｌｅループの１回目について説明する。ステートＩＤ「Ｓｔａｔｅ１」であるステート５０は、ソースコード４５の２行目に対応する。また、テストケースは、テストケース５１で示す値である。
【０１０１】
図２３では、命令を先に評価した後、ステートを分割する。ステート５０は、まず、命令５２について評価される。命令５２は、ソースコード４５の波線部分「ａ＋ｂ」に対応する。命令５２のレジスタ値「％１」は、表５３に示すように演算子「＋」のミュータントに対応した値となる。ここで、「ａ＋ｂ」と「ａ＊ｂ」とは、レジスタ値「％１」が「４」で結果が同じである。従って、図２３では、「％１＝４」について、ステートＩＤ「Ｓｔａｔｅ１」であるステート５５ａが生成される。同様に、「ａ−ｂ」と「ａ％ｂ」とは、レジスタ値「％１」が「０」で結果が同じである。従って、図２３では、「％１＝０」について、ステートＩＤ「Ｓｔａｔｅ２」であるステート５５ｂが生成される。「ａ／ｂ」は、レジスタ値「％１」が「１」となり、他に同じ結果となるミュータントがない。従って、図２３では、「％１＝１」について、ステートＩＤ「Ｓｔａｔｅ３」であるステート５５ｃが生成される。
【０１０２】
次に、図２３では、直積の算出５４で示すように、ステート５５ａに対応するミューテーション記述子として、ステート５０のミューテーション記述子「｛｝」と、「＋」を示すミューテーション記述子「｛｝」および「＊」を示すミューテーション記述子「｛１，＊｝」との直積が算出される。算出されたミューテーション記述子「｛｝，｛１，＊｝」は、ステート５５ａに対応するミューテーション記述子として実行状態集合記憶部１２３に記憶される。同様に、ステート５５ｂおよびステート５５ｃに対応するミューテーション記述子は、直積の算出５４で示すように算出されて、それぞれ実行状態集合記憶部１２３に記憶される。図２３では、ステート５５ａ、ステート５５ｂおよびステート５５ｃは、生成されたグループ５５に分類される。なお、グループ５５は、説明の便宜上「Ｇｒｏｕｐ１」と称する。グループ５５に属するステート５５ａ、ステート５５ｂおよびステート５５ｃは、並列して、つまり同時に評価される。
【０１０３】
図２４では、ステート５５ａは、まず、命令５２ａについて評価される。命令５２ａは、ソースコード４５の波線部分「ａ＋ｂ＞ｃ」に対応する。また、命令５２ａには、波線部分に示すように、レジスタ値「％１」が代入される。命令５２ａのレジスタ値「％２」は、表５６ａに示すように演算子「＞」のミュータントに対応した値となる。ここで、「％１＞ｃ」と「％１！＝ｃ」と「％１＞＝ｃ」とは、レジスタ値「％２」が「１」で結果が同じである。従って、図２４では、「％２＝１」について、ステートＩＤ「Ｓｔａｔｅ１」が更新されステート５８ａとなる。なお、ステート５８ａには、「％１＝４」の情報も保持される。同様に、「％２＝０」について、ステートＩＤ「Ｓｔａｔｅ４」であるステート５８ｂが生成される。
【０１０４】
次に、図２４では、図２３と同様に、直積の算出５７ａで示すように、直積が算出される。算出された直積は、それぞれ、ステート５８ａおよびステート５８ｂに対応するミューテーション記述子として実行状態集合記憶部１２３に記憶される。ステート５８ａおよびステート５８ｂは、命令５２ａが副作用のない命令であるので、グループ５５に分類される。
【０１０５】
図２５では、ステート５５ｂは、まず、命令５２ａについて評価される。命令５２ａは、ソースコード４５の波線部分「ａ＋ｂ＞ｃ」に対応する。また、命令５２ａには、波線部分に示すように、レジスタ値「％１」が代入される。命令５２ａのレジスタ値「％２」は、表５６ｂに示すように演算子「＞」のミュータントに対応した値となる。ここで、「％１＞ｃ」と「％１！＝ｃ」と「％１＜ｃ」とは、レジスタ値「％２」が「０」で結果が同じである。従って、図２５では、「％２＝０」について、ステートＩＤ「Ｓｔａｔｅ２」が更新されステート５９ａとなる。なお、ステート５９ａには、「％１＝０」の情報も保持される。同様に、「％２＝１」について、ステートＩＤ「Ｓｔａｔｅ５」であるステート５９ｂが生成される。
【０１０６】
次に、図２５では、図２３と同様に、直積の算出５７ｂで示すように、直積が算出される。算出された直積は、それぞれ、ステート５９ａおよびステート５９ｂに対応するミューテーション記述子として実行状態集合記憶部１２３に記憶される。ステート５９ａおよびステート５９ｂは、命令５２ａが副作用のない命令であるので、グループ５５に分類される。
【０１０７】
図２６では、ステート５５ｃは、まず、命令５２ａについて評価される。命令５２ａは、ソースコード４５の波線部分「ａ＋ｂ＞ｃ」に対応する。また、命令５２ａには、波線部分に示すように、レジスタ値「％１」が代入される。命令５２ａのレジスタ値「％２」は、表５６ｃに示すように演算子「＞」のミュータントに対応した値となる。ここで、「％１＞ｃ」と「％１！＝ｃ」と「％１＞＝ｃ」とは、レジスタ値「％２」が「１」で結果が同じである。従って、図２６では、「％２＝１」について、ステートＩＤ「Ｓｔａｔｅ３」であるステート６０ａが生成される。なお、ステート６０ａには、「％１＝１」の情報も保持される。同様に、「％２＝０」について、ステートＩＤ「Ｓｔａｔｅ６」であるステート６０ｂが生成される。
【０１０８】
次に、図２６では、図２３と同様に、直積の算出５７ｃで示すように、直積が算出される。算出された直積は、それぞれ、ステート６０ａおよびステート６０ｂに対応するミューテーション記述子として実行状態集合記憶部１２３に記憶される。ステート６０ａおよびステート６０ｂは、命令５２ａが副作用のない命令であるので、グループ５５に分類される。
【０１０９】
図２７では、グループ５５について、レジスタ値「％２」が同じ計算結果となるステートがマージされる。図２７では、ステート５８ａ、ステート５９ｂおよびステート６０ａがマージされ、ステートＩＤ「Ｓｔａｔｅ１」が更新されステート６１ａとなる。同様に、図２７では、ステート５８ｂ、ステート５９ａおよびステート６０ｂがマージされ、ステートＩＤ「Ｓｔａｔｅ２」が更新されステート６１ｂとなる。
【０１１０】
図２８に示すように、計算結果が異なるステートは、マージしない。図２８では、グループ５５に属するステート６１ａおよびステート６１ｂは、それぞれ命令６２について評価される。命令６２は、「％２」と「０」とを比較する命令である。ステート６１ａは、「％２＝１」であるので、命令６２の結果である「％３」は、ｆａｌｓｅを示す「０」となり、ステートＩＤ「Ｓｔａｔｅ１」が更新されステート６３ａとなる。これに対し、ステート６１ｂは、「％２＝０」であるので、命令６２の結果である「％３」は、ｔｒｕｅを示す「１」となり、ステートＩＤ「Ｓｔａｔｅ２」が更新されステート６３ｂとなる。従って、ステート６３ａおよびステート６３ｂは、計算結果が異なるのでマージしない。
【０１１１】
図２９に示すように、副作用がない命令以外に到達すると、グループ５５が解除される。図２９では、グループ５５に属するステート６３ａおよびステート６３ｂは、それぞれ命令６４について評価される。命令６４は、分岐命令であり副作用がある可能性を有する。従って、グループ５５は、解除される。ステート６３ａは、「％４」に分岐され、ステートＩＤ「Ｓｔａｔｅ１」が更新されステート６５ａとなる。これに対し、ステート６３ｂは、「％６」に分岐され、ステートＩＤ「Ｓｔａｔｅ２」が更新されステート６５ｂとなる。ステート６５ａは、グループ５５が解除されたので、優先して実行される。また、ステート６５ｂは、ｗｈｉｌｅ文を抜けて「０」を返して終了される。
【０１１２】
図３０に示すように、ステート６５ａは、ソースコード４５の３行目に到達する。図３０では、ステート６５ａは、命令６６について評価される。命令６６は、ソースコード４５の波線部分「＋＋ｃ」に対応する。命令６６のレジスタ値「％５」は、表６７に示すように演算子「＋＋」のミュータントに対応した値となる。なお、命令の結果を以降で使用しない場合には、「ｃ＋＋」および「ｃ−−」へのミューテーションは「＋＋ｃ」および「−−ｃ」に統合する。図３０では、「％５＝１」について、ステートＩＤ「Ｓｔａｔｅ１」が更新されステート６８ａとなる。同様に、「％５＝−１」について、ステートＩＤ「Ｓｔａｔｅ７」であるステート６８ｂが生成される。
【０１１３】
図３１から図３７は、ｗｈｉｌｅループの２回目の一例を説明する図である。図３１から図３７では、ソースコード４５のｗｈｉｌｅループの２回目について説明する。また、テストケースは、テストケース５１ａで示す値である。
【０１１４】
図３１のステート６８ａは、ｗｈｉｌｅループの１回目のステートＩＤ「Ｓｔａｔｅ１」に対応する。ステート６８ａは、まず、命令５２について評価される。命令５２のレジスタ値「％１」は、表５３ａに示すように演算子「＋」のミュータントに対応した値となる。ここで、「ａ＋ｂ」と「ａ＊ｂ」とは、レジスタ値「％１」が「４」で結果が同じである。従って、図３１では、「％１＝４」について、ステートＩＤ「Ｓｔａｔｅ１」が更新されステート６９ａとなる。このとき、命令５２では、ステート６８ａのミューテーション記述子のうち、ミューテーション記述子「｛｝」、および、ミューテーションＩＤが「１」であるミューテーション記述子について評価される。すなわち、ミューテーションＩＤが「１」でないミューテーション記述子は、ミューテーション記述子「｛｝」が評価される。同様に、「ａ−ｂ」と「ａ％ｂ」とは、レジスタ値「％１」が「０」で結果が同じである。従って、図３１では、「％１＝０」について、ステートＩＤ「Ｓｔａｔｅ８」であるステート６９ｂが生成される。「ａ／ｂ」は、レジスタ値「％１」が「１」となり、他に同じ結果となるミュータントがない。従って、図３１では、「％１＝１」について、ステートＩＤ「Ｓｔａｔｅ９」であるステート６９ｃが生成される。また、図３１では、ステート６９ａ、ステート６９ｂおよびステート６９ｃは、生成されたグループ６９に分類される。なお、グループ６９は、説明の便宜上「Ｇｒｏｕｐ２」と称する。グループ６９に属するステート６９ａ、ステート６９ｂおよびステート６９ｃは、並列して、つまり同時に評価される。
【０１１５】
図３２では、ステート６９ａは、命令５２ａについて評価される。命令５２ａのレジスタ値「％２」は、表５６ｄに示すように演算子「＞」のミュータントに対応した値となる。このとき、命令５２ａでは、ステート６９ａのミューテーション記述子のうち、ミューテーション記述子「｛｝」、および、ミューテーションＩＤが「２」であるミューテーション記述子について評価される。ここで、「％１＞ｃ」と「％１！＝ｃ」と「％１＞＝ｃ」とは、レジスタ値「％２」が「１」で結果が同じである。従って、図３２では、「％２＝１」について、ステートＩＤ「Ｓｔａｔｅ１」が更新されステート７０となる。なお、ステート７０には、「％１＝４」の情報も保持される。
【０１１６】
図３３では、ステート６９ｂは、命令５２ａについて評価される。命令５２ａのレジスタ値「％２」は、表５６ｅに示すように演算子「＞」のミュータントに対応した値となる。このとき、命令５２ａでは、ステート６９ｂのミューテーション記述子のうち、ミューテーションＩＤが「２」であるミューテーション記述子について評価される。ここで、「％１＝＝ｃ」と「％１＞＝ｃ」とは、レジスタ値「％２」が「０」で結果が同じである。従って、図３３では、「％２＝０」について、ステートＩＤ「Ｓｔａｔｅ８」が更新されステート７１ａとなる。なお、ステート７１ａには、「％１＝０」の情報も保持される。同様に、「％２＝１」について、ステートＩＤ「Ｓｔａｔｅ１０」であるステート７１ｂが生成される。ステート７１ａおよびステート７１ｂは、命令５２ａが副作用のない命令であるので、グループ６９に分類される。
【０１１７】
図３４では、ステート６９ｃは、命令５２ａについて評価される。命令５２ａのレジスタ値「％２」は、表５６ｆに示すように演算子「＞」のミュータントに対応した値となる。このとき、命令５２ａでは、ステート６９ｃのミューテーション記述子のうち、ミューテーションＩＤが「２」であるミューテーション記述子について評価される。ここで、「％１＞ｃ」と「％１！＝ｃ」とは、レジスタ値「％２」が「０」で結果が同じである。従って、図３４では、「％２＝０」について、ステートＩＤ「Ｓｔａｔｅ９」が更新されステート７２ａとなる。なお、ステート７２ａには、「％１＝１」の情報も保持される。同様に、「％２＝１」について、ステートＩＤ「Ｓｔａｔｅ１１」であるステート７２ｂが生成される。ステート７２ａおよびステート７２ｂは、命令５２ａが副作用のない命令であるので、グループ６９に分類される。
【０１１８】
図３５では、グループ６９について、レジスタ値「％２」が同じ計算結果となるステートがマージされる。図３５では、ステート７０、ステート７１ｂおよびステート７２ｂがマージされ、ステートＩＤ「Ｓｔａｔｅ１」が更新されステート７３ａとなる。同様に、図３５では、ステート７１ａおよびステート７２ａがマージされ、ステートＩＤ「Ｓｔａｔｅ８」が更新されステート７３ｂとなる。
【０１１９】
図３６に示すように、計算結果が異なるステートは、マージしない。また、副作用がない命令以外に到達すると、グループ６９が解除される。図３６では、グループ６９に属するステート７３ａおよびステート７３ｂは、それぞれ命令７４について評価される。命令７４は、図２８の命令６２と図２９の命令６４とを纏めて記載したものである。ステート７３ａおよびステート７３ｂは、マージされない。また、グループ６９は、解除される。ステート７３ａは、「％４」に分岐され、ステートＩＤ「Ｓｔａｔｅ１」が更新されステート７５ａとなる。これに対し、ステート７３ｂは、「％６」に分岐され、ステートＩＤ「Ｓｔａｔｅ８」が更新されステート７５ｂとなる。ステート７５ａは、グループ６９が解除されたので、優先して実行される。また、ステート７５ｂは、ｗｈｉｌｅ文を抜けて「１」を返して終了される。
【０１２０】
図３７では、ステート７５ａは、命令６６について評価される。命令６６のレジスタ値「％５」は、表６７ａに示すように演算子「＋＋」のミュータントに対応した値となる。このとき、命令６６では、ステート７５ａのミューテーション記述子のうち、ミューテーション記述子「｛｝」、および、ミューテーションＩＤが「３」であるミューテーション記述子について評価される。ところが、ステート７５ａには、ミューテーションＩＤが「３」であるミューテーション記述子はないので、ミューテーション記述子「｛｝」が評価される。図３７では、「％５＝２」について、ステートＩＤ「Ｓｔａｔｅ１」が更新されステート７６となる。
【０１２１】
図３８および図３９は、ｗｈｉｌｅループの３回目の一例を説明する図である。図３８および図３９では、ソースコード４５のｗｈｉｌｅループの３回目について説明する。
【０１２２】
図３８のステート７６は、ｗｈｉｌｅループの２回目のステートＩＤ「Ｓｔａｔｅ１」に対応する。ステート７６は、まず、命令５２について評価される。命令５２のレジスタ値「％１」は、表５３ｂに示すように演算子「＋」のミュータントに対応した値となる。ここで、「ａ＋ｂ」と「ａ＊ｂ」とは、レジスタ値「％１」が「４」で結果が同じである。従って、図３８では、「％１＝４」について、ステートＩＤ「Ｓｔａｔｅ１」が更新されステート７７ａとなる。このとき、命令５２では、ステート７６のミューテーション記述子のうち、ミューテーション記述子「｛｝」、および、ミューテーションＩＤが「１」であるミューテーション記述子について評価される。同様に、「ａ−ｂ」と「ａ％ｂ」とは、レジスタ値「％１」が「０」で結果が同じである。従って、図３８では、「％１＝０」について、ステートＩＤ「Ｓｔａｔｅ１２」であるステート７７ｂが生成される。「ａ／ｂ」は、レジスタ値「％１」が「１」となり、他に同じ結果となるミュータントがない。従って、図３８では、「％１＝１」について、ステートＩＤ「Ｓｔａｔｅ１３」であるステート７７ｃが生成される。また、図３８では、ステート７７ａ、ステート７７ｂおよびステート７７ｃは、生成されたグループ７７に分類される。なお、グループ７７は、説明の便宜上「Ｇｒｏｕｐ３」と称する。グループ７７に属するステート７７ａ、ステート７７ｂおよびステート７７ｃは、並列して、つまり同時に評価される。
【０１２３】
続いて、ステート７７ａは、命令５２ａについて評価される。命令５２ａのレジスタ値「％２」は、表５６ｇに示すように演算子「＞」のミュータントに対応した値となる。このとき、命令５２ａでは、ステート７７ａのミューテーション記述子のうち、ミューテーション記述子「｛｝」、および、ミューテーションＩＤが「２」であるミューテーション記述子について評価される。ここで、「％１＞ｃ」と「％１！＝ｃ」と「％１＞＝ｃ」とは、レジスタ値「％２」が「１」で結果が同じである。従って、図３８では、「％２＝１」について、ステートＩＤ「Ｓｔａｔｅ１」が更新されステート７８ａとなる。
【０１２４】
ステート７７ｂは、命令５２ａについて評価される。命令５２ａのレジスタ値「％２」は、表５６ｈに示すように演算子「＞」のミュータントに対応した値となる。このとき、命令５２ａでは、ステート７７ｂのミューテーション記述子のうち、ミューテーションＩＤが「２」であるミューテーション記述子について評価される。ここで、「％１＜＝ｃ」は、レジスタ値「％２」が「１」となり、他に同じ結果となるミュータントがない。従って、図３８では、「％２＝１」について、ステートＩＤ「Ｓｔａｔｅ１２」が更新されステート７８ｂとなる。
【０１２５】
ステート７７ｃは、命令５２ａについて評価される。命令５２ａのレジスタ値「％２」は、表５６ｉに示すように演算子「＞」のミュータントに対応した値となる。このとき、命令５２ａでは、ステート７７ｃのミューテーション記述子のうち、ミューテーションＩＤが「２」であるミューテーション記述子について評価される。ここで、「％１＞＝ｃ」は、レジスタ値「％２」が「０」となり、他に同じ結果となるミュータントがない。従って、図３８では、「％２＝０」について、ステートＩＤ「Ｓｔａｔｅ１３」が更新されステート７８ｃとなる。ステート７８ａ、ステート７８ｂおよびステート７８ｃは、命令５２ａが副作用のない命令であるので、グループ７７に分類される。
【０１２６】
図３９では、グループ７７について、レジスタ値「％２」が同じ計算結果となるステートがマージされる。図３９では、ステート７８ａおよびステート７８ｂがマージされ、ステートＩＤ「Ｓｔａｔｅ１」が更新されステート７９ａとなる。ステート７８ｃは、マージする相手がいないので、そのままステートＩＤ「Ｓｔａｔｅ１３」が更新されステート７９ｂとなる。また、グループ７７は解除される。さらに、ステート７９ｂは、ｗｈｉｌｅ文を抜けて「２」を返して終了される。ステート７９ａは、以後、ｗｈｉｌｅループの３回目が終わるまで、ｗｈｉｌｅループの２回目と同様の処理が行われる。
【０１２７】
図４０および図４１は、ｗｈｉｌｅループの４回目の一例を説明する図である。図４０および図４１では、ソースコード４５のｗｈｉｌｅループの４回目について説明する。
【０１２８】
図４０のステート７９ａは、ｗｈｉｌｅループの３回目のステートＩＤ「Ｓｔａｔｅ１」に対応する。ステート７９ａは、まず、命令５２について評価される。命令５２のレジスタ値「％１」は、表５３ｃに示すように演算子「＋」のミュータントに対応した値となる。ここで、「ａ＋ｂ」と「ａ＊ｂ」とは、レジスタ値「％１」が「４」で結果が同じである。従って、図４０では、「％１＝４」について、ステートＩＤ「Ｓｔａｔｅ１」が更新されステート８０ａとなる。このとき、命令５２では、ステート７９ａのミューテーション記述子のうち、ミューテーション記述子「｛｝」、および、ミューテーションＩＤが「１」であるミューテーション記述子について評価される。同様に、「ａ−ｂ」と「ａ％ｂ」とは、レジスタ値「％１」が「０」で結果が同じである。従って、図４０では、「％１＝０」について、ステートＩＤ「Ｓｔａｔｅ１４」であるステート８０ｂが生成される。また、図４０では、ステート８０ａおよびステート８０ｂは、生成されたグループ８０に分類される。なお、グループ８０は、説明の便宜上「Ｇｒｏｕｐ４」と称する。グループ８０に属するステート８０ａおよびステート８０ｂは、並列して、つまり同時に評価される。
【０１２９】
続いて、ステート８０ａは、命令５２ａについて評価される。命令５２ａのレジスタ値「％２」は、表５６ｊに示すように演算子「＞」のミュータントに対応した値となる。このとき、命令５２ａでは、ステート８０ａのミューテーション記述子のうち、ミューテーション記述子「｛｝」、および、ミューテーションＩＤが「２」であるミューテーション記述子について評価される。ここで、「％１＞ｃ」と「％１！＝ｃ」と「％１＞＝ｃ」とは、レジスタ値「％２」が「１」で結果が同じである。従って、図４０では、「％２＝１」について、ステートＩＤ「Ｓｔａｔｅ１」が更新されステート８１ａとなる。
【０１３０】
ステート８０ｂは、命令５２ａについて評価される。命令５２ａのレジスタ値「％２」は、表５６ｋに示すように演算子「＞」のミュータントに対応した値となる。このとき、命令５２ａでは、ステート８０ｂのミューテーション記述子のうち、ミューテーションＩＤが「２」であるミューテーション記述子について評価される。ここで、「％１＜＝ｃ」は、レジスタ値「％２」が「１」となり、他に同じ結果となるミュータントがない。従って、図４０では、「％２＝１」について、ステートＩＤ「Ｓｔａｔｅ１４」が更新されステート８１ｂとなる。ステート８１ａおよびステート８１ｂは、命令５２ａが副作用のない命令であるので、グループ８０に分類される。
【０１３１】
図４１では、グループ８０について、レジスタ値「％２」が同じ計算結果となるステートをマージすると、ステート８１ａおよびステート８１ｂは、１つのステートに戻ってしまう。この様な場合には、ステートの分割とマージを繰り返す可能性があるためマージを行わない。また、グループ８０は解除される。さらに、ステート８１ｂは、最終的に無限ループとなってタイムアウトとなる。ステート８１ａは、以後、ｗｈｉｌｅループの４回目が終わるまで、ｗｈｉｌｅループの３回目と同様の処理が行われる。
【０１３２】
図４２は、ｗｈｉｌｅループの５回目の一例を説明する図である。図４２では、ソースコード４５のｗｈｉｌｅループの５回目について説明する。
【０１３３】
図４２のステート８１ａは、ｗｈｉｌｅループの４回目のステートＩＤ「Ｓｔａｔｅ１」に対応する。ステート８１ａは、まず、命令５２について評価される。命令５２のレジスタ値「％１」は、表５３ｄに示すように演算子「＋」のミュータントに対応した値となる。ここで、「ａ＋ｂ」と「ａ＊ｂ」とは、レジスタ値「％１」が「４」で結果が同じである。従って、図４２では、「％１＝４」について、ステートＩＤ「Ｓｔａｔｅ１」が更新されステート８２ａとなる。このとき、命令５２では、ステート８１ａのミューテーション記述子のうち、ミューテーション記述子「｛｝」、および、ミューテーションＩＤが「１」であるミューテーション記述子について評価される。ステート８２ａは、生成されたグループ８２に分類される。なお、グループ８２は、説明の便宜上「Ｇｒｏｕｐ５」と称する。
【０１３４】
続いて、ステート８２ａは、命令５２ａについて評価される。命令５２ａのレジスタ値「％２」は、表５６ｌに示すように演算子「＞」のミュータントに対応した値となる。このとき、命令５２ａでは、ステート８２ａのミューテーション記述子のうち、ミューテーション記述子「｛｝」、および、ミューテーションＩＤが「２」であるミューテーション記述子について評価される。ここで、「％１＞ｃ」と「％１！＝ｃ」とは、レジスタ値「％２」が「０」で結果が同じである。従って、図４２では、「％２＝０」について、ステートＩＤ「Ｓｔａｔｅ１」が更新されステート８３ａとなる。同様に、「％１＞＝ｃ」は、レジスタ値「％２」が「１」となり、他に同じ結果となるミュータントがない。従って、図４２では、「％２＝１」について、ステートＩＤ「Ｓｔａｔｅ１５」であるステート８３ｂが生成される。また、図４２では、ステート８３ａおよびステート８３ｂは、命令５２ａが副作用のない命令であるので、グループ８２に分類される。グループ８２に属するステート８３ａおよびステート８３ｂは、並列して、つまり同時に評価される。
【０１３５】
グループ８２は、レジスタ値「％２」が同じ計算結果となるステートがないため、マージを行わない。また、グループ８２は解除される。さらに、ステート８３ａは、ｗｈｉｌｅ文を抜けて「４」を返して終了される。また、ステート８３ｂは、もう一度ｗｈｉｌｅループを行った後、「５」を返して終了される。
【０１３６】
図４３から図４６は、ｗｈｉｌｅループの２回目の一例を説明する図である。図４３から図４６では、ソースコード４５のｗｈｉｌｅループの２回目について、ステートＩＤ「Ｓｔａｔｅ７」で示されるステート６８ｂ側を説明する。
【０１３７】
図４３のステート６８ｂは、ｗｈｉｌｅループの１回目のステートＩＤ「Ｓｔａｔｅ７」に対応する。ステート６８ｂは、まず、命令５２について評価される。命令５２のレジスタ値「％１」は、表５３ｅに示すように演算子「＋」のミュータントに対応した値となる。ここで、「ａ＋ｂ」と「ａ＊ｂ」とは、レジスタ値「％１」が「４」で結果が同じである。従って、図４３では、「％１＝４」について、ステートＩＤ「Ｓｔａｔｅ７」が更新されステート８４ａとなる。このとき、命令５２では、ステート６８ｂのミューテーション記述子のうち、ミューテーションＩＤが「１」であるミューテーション記述子について評価される。同様に、「ａ−ｂ」と「ａ％ｂ」とは、レジスタ値「％１」が「０」で結果が同じである。従って、図４３では、「％１＝０」について、ステートＩＤ「Ｓｔａｔｅ１６」であるステート８４ｂが生成される。「ａ／ｂ」は、レジスタ値「％１」が「１」となり、他に同じ結果となるミュータントがない。従って、図４３では、「％１＝１」について、ステートＩＤ「Ｓｔａｔｅ１７」であるステート８４ｃが生成される。また、図４３では、ステート８４ａ、ステート８４ｂおよびステート８４ｃは、生成されたグループ８４に分類される。なお、グループ８４は、説明の便宜上「Ｇｒｏｕｐ６」と称する。グループ８４に属するステート８４ａ、ステート８４ｂおよびステート８４ｃは、並列して、つまり同時に評価される。
【０１３８】
図４４では、ステート８４ａは、命令５２ａについて評価される。命令５２ａのレジスタ値「％２」は、表５６ｍに示すように演算子「＞」のミュータントに対応した値となる。このとき、命令５２ａでは、ステート８４ａのミューテーション記述子のうち、ミューテーションＩＤが「２」であるミューテーション記述子について評価される。ここで、「％１＞ｃ」と「％１！＝ｃ」と「％１＞＝ｃ」とは、レジスタ値「％２」が「１」で結果が同じである。従って、図４４では、「％２＝１」について、ステートＩＤ「Ｓｔａｔｅ７」が更新されステート８５ａとなる。
【０１３９】
ステート８４ｃは、命令５２ａについて評価される。命令５２ａのレジスタ値「％２」は、表５６ｎに示すように演算子「＞」のミュータントに対応した値となる。このとき、命令５２ａでは、ステート８４ｃのミューテーション記述子のうち、ミューテーションＩＤが「２」であるミューテーション記述子について評価される。ここで、「％１＞ｃ」と「％１！＝ｃ」と「％１＞＝ｃ」とは、レジスタ値「％２」が「１」で結果が同じである。従って、図４４では、「％２＝１」について、ステートＩＤ「Ｓｔａｔｅ１７」が更新されステート８５ｂとなる。ステート８５ａおよびステート８５ｂは、命令５２ａが副作用のない命令であるので、グループ８４に分類される。
【０１４０】
図４５では、ステート８４ｂは、命令５２ａについて評価される。命令５２ａのレジスタ値「％２」は、表５６ｏに示すように演算子「＞」のミュータントに対応した値となる。このとき、命令５２ａでは、ステート８４ｂのミューテーション記述子のうち、ミューテーションＩＤが「２」であるミューテーション記述子について評価される。ここで、「％１＝＝ｃ」と「％１＜＝ｃ」とは、レジスタ値「％２」が「０」で結果が同じである。従って、図４５では、「％２＝０」について、ステートＩＤ「Ｓｔａｔｅ１６」が更新されステート８６ａとなる。同様に、「％２＝１」について、ステートＩＤ「Ｓｔａｔｅ１８」であるステート８６ｂが生成される。ステート８６ａおよびステート８６ｂは、命令５２ａが副作用のない命令であるので、グループ８４に分類される。
【０１４１】
図４６では、グループ８４について、レジスタ値「％２」が同じ計算結果となるステートがマージされる。図４６では、ステート８５ａ、ステート８５ｂおよびステート８６ｂがマージされ、ステートＩＤ「Ｓｔａｔｅ７」が更新されステート８７ａとなる。同様に、図４６では、ステート８６ａは、マージされる相手がいないので、そのままステートＩＤ「Ｓｔａｔｅ１６」が更新されステート８７ｂとなる。ステート８７ａは、最終的に無限ループとなってタイムアウトとなる。また、ステート８７ｂは、ｗｈｉｌｅ文を抜けて「−１」を返して終了される。
【０１４２】
図４７は、各ステートの割り振りの一例を説明する図である。図４７に示すように、本具体例では、ミュータントをｋｉｌｌできなかったことを示すグループ８８に、ステートＩＤ「Ｓｔａｔｅ１」のステート８３ａを割り振る。すなわち、グループ８８は、テスト合否が「Ｐａｓｓ」となるステートである。また、本具体例では、ミュータントをｋｉｌｌできたことを示すグループ８９に、「Ｓｔａｔｅ２」のステート６５ｂ、「Ｓｔａｔｅ８」のステート７５ｂ、「Ｓｔａｔｅ１３」のステート７９ｂ、「Ｓｔａｔｅ１５」のステート８３ｂおよび「Ｓｔａｔｅ１６」のステート８７ｂを割り振る。すなわち、グループ８９は、テスト合否が「Ｆａｉｌ」となるステートである。また、本具体例では、無限ループでタイムアウトとなるグループ９０に、「Ｓｔａｔｅ７」のステート８７ａおよび「Ｓｔａｔｅ１４」のステート８１ｂを割り振る。なお、グループ９０のステートは、テスト合否について、「Ｐａｓｓ」および「Ｆａｉｌ」のどちらとしてもよいが、本具体例では、例えば、「Ｆａｉｌ」とする。本具体例に示すように、解析装置１００は、高次ミューテーションについても状態数を減らしながら実行することができる。また、解析装置１００は、従来と比較して、状態分割の回数を低減することができる。
【０１４３】
このように、解析装置１００は、ソースコード内の要素をミュータントに変化させるメタ関数に置換してコンパイルした中間コードを実行する際に、メタ関数に対応するミューテーション演算について、ミュータントの変化を示すミューテーション記述子の集合を保持する。解析装置１００は、ミューテーション記述子それぞれの命令を評価する。解析装置１００は、ミューテーション記述子の集合のうち、命令の評価結果が同じとなる１つ以上のミューテーション記述子を選択する。解析装置１００は、選択されたミューテーション記述子と、ミューテーション演算、または、命令の評価前のミューテーション記述子の集合である第１のステートとの直積を算出して第２のステートを生成する。解析装置１００は、生成された第２のステートのミューテーション記述子それぞれの命令を評価する際に、第２のステートが複数ある場合には、当該複数の第２のステートを１つのグループとして、該グループ内の第２のステートそれぞれに対して並列に命令を評価する。解析装置１００は、グループ内における命令の評価結果に基づく第３のステートのうち、該評価結果が同じとなる第３のステートをマージする。その結果、高次ミューテーションの状態数を削減できる。
【０１４４】
また、解析装置１００は、副作用がない命令が続く間、グループ内で第３のステートをマージする。その結果、ステート、つまり状態数を削減できる。
【０１４５】
また、解析装置１００は、副作用がない命令以外の命令に到達すると、グループを解消して第２のステートの命令を評価する。その結果、無駄な状態分割を抑制できる。
【０１４６】
また、解析装置１００は、マージを行うことで、第１のステートまたは第２のステートに戻る場合には、マージを行わない。その結果、分割とマージを繰り返すことを抑止できる。
【０１４７】
なお、上記実施例では、中間コードの一例としてＬＬＶＭビットコードを用いたが、これに限定されない。例えば、Ｊａｖａ（登録商標）ＶＭで実行可能なＪａｖａバイトコード等を用いてもよい。
【０１４８】
また、図示した各部の各構成要素は、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各部の分散・統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況等に応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。例えば、コンパイラ１３２と、状態管理部１３３と、命令評価部１３４とは統合されてもよい。また、図示した各処理は、上記の順番に限定されるものではなく、処理内容を矛盾させない範囲において、同時に実施してもよく、順序を入れ替えて実施してもよい。
【０１４９】
さらに、各装置で行われる各種処理機能は、ＣＰＵ（またはＭＰＵ、ＭＣＵ（Micro  Controller  Unit）等のマイクロ・コンピュータ）上で、その全部または任意の一部を実行するようにしてもよい。また、各種処理機能は、ＣＰＵ（またはＭＰＵ、ＭＣＵ等のマイクロ・コンピュータ）で解析実行されるプログラム上、またはワイヤードロジックによるハードウェア上で、その全部または任意の一部を実行するようにしてもよいことは言うまでもない。
【０１５０】
ところで、上記の実施例で説明した各種の処理は、予め用意されたプログラムをコンピュータで実行することで実現できる。そこで、以下では、上記の実施例と同様の機能を有するプログラムを実行するコンピュータの一例を説明する。図４８は、解析プログラムを実行するコンピュータの一例を示す図である。
【０１５１】
図４８に示すように、コンピュータ２００は、各種演算処理を実行するＣＰＵ２０１と、データ入力を受け付ける入力装置２０２と、モニタ２０３とを有する。また、コンピュータ２００は、記憶媒体からプログラム等を読み取る媒体読取装置２０４と、各種装置と接続するためのインタフェース装置２０５と、他の情報処理装置等と有線または無線により接続するための通信装置２０６とを有する。また、コンピュータ２００は、各種情報を一時記憶するＲＡＭ２０７と、ハードディスク装置２０８とを有する。また、各装置２０１〜２０８は、バス２０９に接続される。
【０１５２】
ハードディスク装置２０８には、図１に示した置換部１３１、コンパイラ１３２、状態管理部１３３、命令評価部１３４および出力部１３５の各処理部と同様の機能を有する解析プログラムが記憶される。また、ハードディスク装置２０８には、命令記憶部１２１、評価結果記憶部１２２、実行状態集合記憶部１２３、テスト結果記憶部１２４、および、解析プログラムを実現するための各種データが記憶される。入力装置２０２は、例えば、コンピュータ２００のユーザから操作情報、管理情報等の各種情報の入力を受け付ける。モニタ２０３は、例えば、コンピュータ２００の管理者に対して結果画面、管理情報の画面および各種画面を表示する。媒体読取装置２０４は、記憶媒体からソースコード、テスト項目およびミューテーションオペレータリストを読み取る。インタフェース装置２０５は、例えば印刷装置等が接続される。通信装置２０６は、例えば、図１に示した通信部１１０と同様の機能を有し図示しないネットワークと接続され、他の情報処理装置と各種情報をやりとりする。
【０１５３】
ＣＰＵ２０１は、ハードディスク装置２０８に記憶された各プログラムを読み出して、ＲＡＭ２０７に展開して実行することで、各種の処理を行う。また、これらのプログラムは、コンピュータ２００を図１に示した置換部１３１、コンパイラ１３２、状態管理部１３３、命令評価部１３４および出力部１３５として機能させることができる。
【０１５４】
なお、上記の解析プログラムは、必ずしもハードディスク装置２０８に記憶されている必要はない。例えば、コンピュータ２００が読み取り可能な記憶媒体に記憶されたプログラムを、コンピュータ２００が読み出して実行するようにしてもよい。コンピュータ２００が読み取り可能な記憶媒体は、例えば、ＣＤ−ＲＯＭやＤＶＤディスク、ＵＳＢメモリ等の可搬型記録媒体、フラッシュメモリ等の半導体メモリ、ハードディスクドライブ等が対応する。また、公衆回線、インターネット、ＬＡＮ等に接続された装置にこの解析プログラムを記憶させておき、コンピュータ２００がこれらから解析プログラムを読み出して実行するようにしてもよい。
【符号の説明】
【０１５５】
１００  解析装置
１１０  通信部
１１１  入力部
１１２  表示部
１１３  操作部
１２０  記憶部
１２１  命令記憶部
１２２  評価結果記憶部
１２３  実行状態集合記憶部
１２４  テスト結果記憶部
１３０  制御部
１３１  置換部
１３２  コンパイラ
１３３  状態管理部
１３４  命令評価部
１３５  出力部
【図１】
0006720823.tif 000002
【図２】
0006720823.tif 000003
【図３】
0006720823.tif 000004
【図４】
0006720823.tif 000005
【図５】
0006720823.tif 000006
【図６】
0006720823.tif 000007
【図７】
0006720823.tif 000008
【図８】
0006720823.tif 000009
【図９】
0006720823.tif 000010
【図１０】
0006720823.tif 000011
【図１１】
0006720823.tif 000012
【図１２】
0006720823.tif 000013
【図１３】
0006720823.tif 000014
【図１４】
0006720823.tif 000015
【図１５】
0006720823.tif 000016
【図１６】
0006720823.tif 000017
【図１７】
0006720823.tif 000018
【図１８】
0006720823.tif 000019
【図１９】
0006720823.tif 000020
【図２０】
0006720823.tif 000021
【図２１】
0006720823.tif 000022
【図２２】
0006720823.tif 000023
【図２３】
0006720823.tif 000024
【図２４】
0006720823.tif 000025
【図２５】
0006720823.tif 000026
【図２６】
0006720823.tif 000027
【図２７】
0006720823.tif 000028
【図２８】
0006720823.tif 000029
【図２９】
0006720823.tif 000030
【図３０】
0006720823.tif 000031
【図３１】
0006720823.tif 000032
【図３２】
0006720823.tif 000033
【図３３】
0006720823.tif 000034
【図３４】
0006720823.tif 000035
【図３５】
0006720823.tif 000036
【図３６】
0006720823.tif 000037
【図３７】
0006720823.tif 000038
【図３８】
0006720823.tif 000039
【図３９】
0006720823.tif 000040
【図４０】
0006720823.tif 000041
【図４１】
0006720823.tif 000042
【図４２】
0006720823.tif 000043
【図４３】
0006720823.tif 000044
【図４４】
0006720823.tif 000045
【図４５】
0006720823.tif 000046
【図４６】
0006720823.tif 000047
【図４７】
0006720823.tif 000048
【図４８】
0006720823.tif 000049