(57)【要約】      （修正有）【課題】ミューテーション解析を高速化する解析装置を提供する。【解決手段】解析装置１は、記憶部１ａおよび演算部１ｂを有する。記憶部は、ソースコードＰ１において、バグを埋め込む変更箇所（ミューテーション箇所）を、ミューテーションを行う所定のメタミューテーション関数で置換したソースコードＰ２を記憶する。演算部は、記憶部を参照して、変更箇所の第１の組合せに対して変更内容を適用してテストを実行しながら、実行された変更箇所を終端ノード以外のノード、変更箇所の変更内容（変更しない場合（ｎｏｐの場合）を含む）をエッジ、実行結果を終端ノードとした決定木の情報をテストケース毎に生成する。演算部は、生成された複数の決定木（すなわち、決定木Ｔ１，Ｔ２，Ｔ３）に基づいて、テスト結果を未取得である変更箇所の第２の組合せに対して変更内容を適用した場合のテスト結果を決定する。【選択図】図１
2018049492.tif 000002
【特許請求の範囲】
【請求項１】
プログラムの入力に対する出力を確認する複数のテストケースを含むテストを行う際の前記プログラムの複数の変更箇所および前記複数の変更箇所それぞれの変更内容の情報を記憶する記憶部と、
変更箇所の第１の組合せに対して前記変更内容を適用して前記テストを実行し、実行された前記変更箇所を終端ノード以外のノード、前記変更箇所の前記変更内容をエッジ、実行結果を前記終端ノードとした決定木の情報をテストケース毎に生成し、生成された複数の決定木に基づいて、テスト結果を未取得である前記変更箇所の第２の組合せに対して前記変更内容を適用した場合の前記テスト結果を決定する、演算部と、
を有する解析装置。
【請求項２】
前記演算部は、前記複数の決定木を統合することで統合後の決定木を生成し、前記第２の組合せに対して前記統合後の決定木を辿ることで前記第２の組合せに対する前記テスト結果を決定する、請求項１記載の解析装置。
【請求項３】
前記第２の組合せは、前記複数のテストケースのうちの一部のテストケースにより試行される前記変更箇所の組合せのうち、前記一部のテストケースの前記実行結果からは前記テスト結果を取得できない組合せを含む、請求項１または２記載の解析装置。
【請求項４】
前記第２の組合せは、前記複数のテストケースでは試行されない前記変更箇所の組合せを含む、請求項１乃至３の何れか１項に記載の解析装置。
【請求項５】
前記演算部は、前記テストの実行により取得された第１のテスト結果および前記複数の決定木に基づいて決定された第２のテスト結果に応じて、前記変更箇所の組合せのうち、前記複数のテストケースにより検出可能な組合せに関する情報、および、前記複数のテストケースにより検出不可能な組合せに関する情報の少なくとも一方を出力する、請求項１乃至４の何れか１項に記載の解析装置。
【請求項６】
プログラムの入力に対する出力を確認する複数のテストケースを含むテストを行う際の前記プログラムの複数の変更箇所および前記複数の変更箇所それぞれの変更内容の情報を参照して、変更箇所の第１の組合せに対して前記変更内容を適用して前記テストを実行し、実行された前記変更箇所を終端ノード以外のノード、前記変更箇所の前記変更内容をエッジ、実行結果を前記終端ノードとした決定木の情報をテストケース毎に生成し、
生成された複数の決定木に基づいて、テスト結果を未取得である前記変更箇所の第２の組合せに対して前記変更内容を適用した場合の前記テスト結果を決定する、
処理をコンピュータに実行させる解析プログラム。
【請求項７】
コンピュータが、
プログラムの入力に対する出力を確認する複数のテストケースを含むテストを行う際の前記プログラムの複数の変更箇所および前記複数の変更箇所それぞれの変更内容の情報を参照して、変更箇所の第１の組合せに対して前記変更内容を適用して前記テストを実行し、実行された前記変更箇所を終端ノード以外のノード、前記変更箇所の前記変更内容をエッジ、実行結果を前記終端ノードとした決定木の情報をテストケース毎に生成し、
生成された複数の決定木に基づいて、テスト結果を未取得である前記変更箇所の第２の組合せに対して前記変更内容を適用した場合の前記テスト結果を決定する、
解析方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は解析装置、解析プログラムおよび解析方法に関する。
【背景技術】
【０００２】
ソフトウェア開発の現場では、ソフトウェアの品質向上を図るため、ソフトウェアのプログラムに対するテストが行われることがある。また、テスト自体の有効性が評価されることもある。例えば、テストの評価指標としてカバレッジ（網羅率）が挙げられる。カバレッジは、プログラム内の所定の箇所（行、分岐または条件など）がテストにより実行された割合である。カバレッジを向上させることで、テスト未実行のコードを減らせる。
【０００３】
例えば、カバレッジを向上させるために入力データを自動生成する検証支援装置の提案がある。この提案では、検証支援装置がソースコードを構文解析してデータ処理ノードおよび分岐処理ノードを含むグラフ構造を生成し、グラフ構造に基づいてプログラムの実行経路を抽出し、当該実行経路をプログラムに実行させるための入力データを生成する。
【０００４】
また、ソースコードが提供されずにバイナリデータしか手元にないソフトウェアに対しても、デバッガなどの装置を用いずに網羅試験を可能にする網羅試験装置の提案もある。
ところで、テストの他の評価手法として、ミューテーション解析と呼ばれる手法が用いられることがある。ミューテーション解析は、プログラムの１以上の要素を意図的に変化させることでプログラムにバグを埋め込み、テストが該当のバグをどの程度検出できるかを調べる手法である。ミューテーション解析では、例えば、プログラムにバグを埋め込んだ状態で所定の入力を与えたときの出力を確認し、テストがバグを検出できるかを確認することがある。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１６−１８３９０号公報
【特許文献２】特開２０１６−１４６０３２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
ミューテーション解析を行うために、ソースコードの変更箇所に対して変更内容を適用した変更後のソースコードをコンパイルし、コンパイル後のプログラムによりテストを実行することが考えられる。しかし、変更箇所（ミューテーション箇所）の組合せ毎に変更内容（ミューテーション内容）を適用したソースコードのコンパイルおよびテスト実行を個別に行っていると、解析に時間がかかるという問題がある。
【０００７】
１つの側面では、本発明は、解析を高速化することを目的とする。
【課題を解決するための手段】
【０００８】
１つの態様では、解析装置が提供される。解析装置は、記憶部と演算部とを有する。記憶部は、プログラムの入力に対する出力を確認する複数のテストケースを含むテストを行う際のプログラムの複数の変更箇所および複数の変更箇所それぞれの変更内容の情報を記憶する。演算部は、変更箇所の第１の組合せに対して変更内容を適用してテストを実行し、実行された変更箇所を終端ノード以外のノード、変更箇所の変更内容をエッジ、実行結果を終端ノードとした決定木の情報をテストケース毎に生成し、生成された複数の決定木に基づいて、テスト結果を未取得である変更箇所の第２の組合せに対して変更内容を適用した場合のテスト結果を決定する。
【発明の効果】
【０００９】
１つの側面では、解析を高速化できる。
【図面の簡単な説明】
【００１０】
【図１】第１の実施の形態の解析装置を示す図である。
【図２】第２の実施の形態の解析装置のハードウェア例を示す図である。
【図３】ミューテーション解析の例を示す図である。
【図４】解析装置の機能例を示す図である。
【図５】ソースコードの例を示す図である。
【図６】置換後ソースコードの例を示す図である。
【図７】テストプログラムの例を示す図である。
【図８】ミューテーションオペレータリストの例を示す図である。
【図９】メタミューテーション情報の例を示す図である。
【図１０】中間コードの例を示す図である。
【図１１】実行状態集合の例を示す図である。
【図１２】ミュータント一覧の例を示す図である。
【図１３】テスト結果テーブルの例を示す図である。
【図１４】決定木の例を示す図である。
【図１５】各決定木のマージ結果の例を示す図である。
【図１６】ノード・エッジのコード例を示す図である。
【図１７】決定木のデータ例を示す図である。
【図１８】結果レポートの出力例を示す図である。
【図１９】解析装置の処理例を示すフローチャートである。
【図２０】決定木作成処理例を示すフローチャートである。
【図２１】初期化処理例を示すフローチャートである。
【図２２】決定木内部ノード追加処理例を示すフローチャートである。
【図２３】決定木葉ノード追加処理例を示すフローチャートである。
【図２４】決定木の現在位置特定処理例を示すフローチャートである。
【図２５】決定木マージ処理例を示すフローチャートである。
【図２６】結果レポート出力処理例を示すフローチャートである。
【図２７】決定木の作成例（その１）を示す図である。
【図２８】決定木の作成例（その２）を示す図である。
【図２９】決定木の作成例（その３）を示す図である。
【図３０】決定木の作成例（その４）を示す図である。
【図３１】決定木の作成例（その５）を示す図である。
【図３２】決定木の作成例（その６）を示す図である。
【図３３】決定木の作成例（その７）を示す図である。
【図３４】決定木の作成例（その８）を示す図である。
【図３５】決定木の作成例（その９）を示す図である。
【図３６】決定木の作成例（その１０）を示す図である。
【図３７】決定木のマージ例（その１）を示す図である。
【図３８】決定木のマージ例（その２）を示す図である。
【図３９】決定木のマージ例（その３）を示す図である。
【図４０】決定木のマージ例（その４）を示す図である。
【図４１】決定木を辿る例（その１）を示す図である。
【図４２】決定木を辿る例（その２）を示す図である。
【図４３】テスト結果の取得例を示す図である。
【図４４】ＳＳＥでは実行されないミュータントの例を示す図である。
【図４５】テスト結果取得の比較例を示す図である。
【発明を実施するための形態】
【００１１】
以下、本実施の形態について図面を参照して説明する。
［第１の実施の形態］
図１は、第１の実施の形態の解析装置を示す図である。解析装置１は、ソフトウェアのプログラムに対するテストを行う。解析装置１は、テストを行うとともに、ミューテーション解析の手法によりテスト自体の評価も行う。解析装置１は、テストの評価結果をユーザ（ソフトウェアの開発者）に提供し、ユーザによるテストの改善を支援する。
【００１２】
解析装置１は、記憶部１ａおよび演算部１ｂを有する。
記憶部１ａは、ＲＡＭ（Random Access Memory）などの揮発性記憶装置でもよいし、ＨＤＤ（Hard Disk Drive）やフラッシュメモリなどの不揮発性記憶装置でもよい。演算部１ｂは、ＣＰＵ（Central Processing Unit）、ＤＳＰ（Digital Signal Processor）、ＡＳＩＣ（Application Specific Integrated Circuit）、ＦＰＧＡ（Field Programmable Gate Array）などを含み得る。演算部１ｂはプログラムを実行するプロセッサでもよい。プロセッサは、複数のプロセッサの集合（マルチプロセッサ）を含み得る。解析装置１は、「コンピュータ」と呼ばれてもよい。
【００１３】
記憶部１ａは、ソースコードＰ１を記憶する。ソースコードＰ１は、テスト対象となるソフトウェアのプログラムの一例である。ソースコードＰ１は、例えば、整数型の関数ｆｕｎｃを含む。関数ｆｕｎｃには、整数型の値（ｘ）が入力される。
【００１４】
記憶部１ａは、ソースコードＰ１において、バグを埋め込む変更箇所（ミューテーション箇所）を、ミューテーションを行う所定のメタミューテーション関数（以下、単にメタ関数と称することがある）で置換したソースコードＰ２を記憶する。このように変更箇所をメタ関数に置換し、事後的にミューテーション情報を与える手法は、ＭＳＧ（Mutant Schema Generation）と呼ばれることもある。図１の例では各メタ関数は、３つの引数をもつ。第１引数は変更箇所の識別子である。第２引数は入力値（この例では何れも“ｘ”）である。第３引数は演算に用いられる値である。例えば、ソースコードＰ２は、ソースコードＰ１に基づいて、演算部１ｂにより生成される。
【００１５】
具体的には、ソースコードＰ２では、ソースコードＰ１の２行目の“ｘ＜０”という記述が、“ｂｏｐ＿ｌｔ（１，ｘ，０）”というメタ関数の記述に置換されている。メタ関数ｂｏｐ＿ｌｔ（１，ｘ，０）の第１引数“１”は変更箇所の識別子である。同第２引数“ｘ”は入力値である。同第３引数“０”は入力値に対する比較演算に用いられる値である。例えば、メタ関数ｂｏｐ＿ｌｔは、関係演算子（比較演算子と呼ばれてもよい）“＜”を“＞＝”に変更する。変更箇所“１”の変更内容は“＜”を“＞＝”とすること、および、変更箇所“１”を変更しないこと（ここでは、“＜”を“＜”のままとすること）である。ここで、変更しないことを“ｎｏｐ”（Non-OPeration）と表記する。
【００１６】
また、ソースコードＰ２では、ソースコードＰ１の３行目の“ｘ＋１”という記述が、“ｂｏｐ＿ａｄｄ（２，ｘ，１）”というメタ関数の記述に置換されている。メタ関数ｂｏｐ＿ａｄｄは、算術演算子“＋”（加算）を“−”（減算）に変更する。すなわち、変更箇所“２”の変更内容は“＋”を“−”にすること、および、“ｎｏｐ”である。
【００１７】
また、ソースコードＰ２では、ソースコードＰ１の４行目の“ｘ＞０”という記述が、“ｂｏｐ＿ｇｔ（３，ｘ，０）”というメタ関数の記述に置換されている。メタ関数ｂｏｐ＿ｇｔは、関係演算子“＞”を“＜＝”に変更する。すなわち、変更箇所“３”の変更内容は“＞”を“＜＝”に変更すること、および、“ｎｏｐ”である。
【００１８】
更に、ソースコードＰ２では、ソースコードＰ１の５行目の“ｘ＊２”という記述が、“ｂｏｐ＿ｍｕｌ（４，ｘ，２）”というメタ関数の記述に置換されている。メタ関数ｂｏｐ＿ｍｕｌは、算術演算子“＊”（乗算）を“／”（除算）または“％”（剰余演算）に変更する。すなわち、変更箇所“４”の変更内容は、“＊”を“／”や“％”に変更すること、および、“ｎｏｐ”である。ここで、関数ｆｕｎｃのｒｅｔｕｒｎ命令による返り値は、整数に丸められることに注意されたい（例えば、演算“−１／２”の結果は整数“０”に丸められる）。
【００１９】
上記のように、記憶部１ａは、プログラムのテストを行う際のプログラムの複数の変更箇所および複数の変更箇所それぞれの変更内容の情報を記憶する。演算部１ｂは、ソースコードＰ２を用いてテストを実行することで、ソースコードＰ２のうち、実行経路に応じた変更箇所に変更内容が適用される。このため、実行経路に沿った変更箇所の組合せ（１以上の変更箇所を要素とする）に対して変更内容が適用されることになる。演算部１ｂは、ソースコードＰ２をコンパイルして生成された中間コードによりテストを実行してもよい（当該手法はBitcode Mutationと呼ばれることもある）。また、中間コードによるプログラムの実行状態に動的にミューテーション情報を与える手法は、Online Adaptation Techniqueと呼ばれることもある。更に、実行箇所で実行状態を分割し、当該実行箇所までの実行を共通化することで実行コストを減らす手法は、ＳＳＥ（Split-Stream Execution）と呼ばれることもある。
【００２０】
記憶部１ａは、テストの内容を記述したテストプログラム（図１では図示を省略している）も記憶する。テストは、プログラムの入力に対する出力を確認する複数のテストケースを含む。図１では、テストは一例として３つのテストケースを含む。
【００２１】
第１のテストケース（ｔｅｓｔｃａｓｅ１）は、ｆｕｎｃ（０）＝＝０である。すなわち、第１のテストケースは、関数ｆｕｎｃにｘ＝０を入力したとき、出力が確認値０になるか否かの確認である。
【００２２】
第２のテストケース（ｔｅｓｔｃａｓｅ２）は、ｆｕｎｃ（１）＝＝２である。すなわち、第２のテストケースは、関数ｆｕｎｃにｘ＝１を入力したとき、出力が確認値２になるか否かの確認である。
【００２３】
第３のテストケース（ｔｅｓｔｃａｓｅ３）は、ｆｕｎｃ（−１）＝＝０である。すなわち、第３のテストケースは、関数ｆｕｎｃにｘ＝−１を入力したとき、出力が確認値０になるか否かの確認である。
【００２４】
演算部１ｂは、ソースコードＰ２を用いてテストを実行し、ミューテーション解析によりテストの評価を行う。
例えば、ある変更箇所の組合せに対して変更内容を適用したとき、３つのテストケースの少なくとも１つで確認値と異なる出力（Ｆａｉｌ）となれば、当該テストにより、該当の変更箇所の組合せに対してバグを適切に検出できることになる。また、ある変更箇所の組合せに対して変更内容を適用したとき、３つのテストケースの何れも確認値と同じ出力（Ｐａｓｓ）となれば、当該テストでは、該当の変更箇所の組合せに対してバグを適切に検出できないことになる。なお、バグを検出できることを示すテスト結果を“Ｋｉｌｌｅｄ”、バグを検出できないことを示すテスト結果を“Ｕｎｋｉｌｌｅｄ”と表記する。
【００２５】
演算部１ｂは、記憶部１ａを参照して、変更箇所の第１の組合せに対して変更内容を適用してテストを実行する。演算部１ｂは、テストを実行しながら、実行された変更箇所を終端ノード以外のノード、変更箇所の変更内容（変更しない場合（ｎｏｐの場合）を含む）をエッジ、実行結果を終端ノードとした決定木の情報をテストケース毎に生成する。すなわち、演算部１ｂは、各テストケースの実行中に、プログラム中の経由した変更箇所で変更内容毎（変更しなかった場合はｎｏｐ）に枝分かれし、終端ノードに実行結果が格納される決定木を生成する。実行結果は、確認値と同じこと（すなわち、Ｐａｓｓ）、または、確認値と異なること（すなわち、Ｆａｉｌ）の何れかを示す。決定木は、有向グラフで表される。
【００２６】
前述の例によれば、演算部１ｂは、第１のテストケースに対して、決定木Ｔ１の情報を生成する。演算部１ｂは、第２のテストケースに対して、決定木Ｔ２の情報を生成する。演算部１ｂは、第３のテストケースに対して、決定木Ｔ３の情報を生成する。例えば、識別情報“１”の変更箇所に対応するノードをノードｍ１とする。識別情報“２”の変更箇所に対応するノードをノードｍ２とする。識別情報“３”の変更箇所に対応するノードをノードｍ３とする。識別情報“４”の変更箇所に対応するノードをノードｍ４とする。以下、決定木Ｔ１の構造を具体的に説明する。
【００２７】
ノードｍ１は、“ｎｏｐ”に対応するエッジ、および、“＞＝”に対応するエッジを有する。決定木Ｔ１において、ノードｍ１の“ｎｏｐ”に対応するエッジの先は、ノードｍ３である。ノードｍ１の“＞＝”に対応するエッジの先はノードｍ２である。
【００２８】
ノードｍ２は、“ｎｏｐ”に対応するエッジ、および、“−”に対応するエッジを有する。決定木Ｔ１において、ノードｍ２の“ｎｏｐ”に対応するエッジの先、および、“−”に対応するエッジの先は、“Ｆａｉｌ”に対応する終端ノードである。
【００２９】
ノードｍ３は、“ｎｏｐ”に対応するエッジ、および、“＜＝”に対応するエッジを有する。決定木Ｔ１において、ノードｍ３の“ｎｏｐ”に対応するエッジの先は、“Ｐａｓｓ”に対応する終端ノードである。ノードｍ３の“＜＝”に対応するエッジの先は、ノードｍ４である。
【００３０】
ノードｍ４は、“ｎｏｐ”に対応するエッジ、“／”に対応するエッジ、および、“％”に対応するエッジを有する。決定木Ｔ１において、ノードｍ４の“ｎｏｐ”に対応するエッジの先、“／”に対応するエッジの先、および、“％”に対応するエッジの先は、何れも“Ｐａｓｓ”に対応する終端ノードである。
【００３１】
決定木Ｔ２，Ｔ３も、第２，第３のテストケースによる実行経路に応じた構造をもつ。
なお、上記のテスト実行により、演算部１ｂは、変更箇所の幾つかの組合せに対しては、“Ｋｉｌｌｅｄ”または“Ｕｎｋｉｌｌｅｄ”を示すテスト結果を得られる。ただし、何れかのテストケースまたは全てのテストケースで実行されない経路に対する変更箇所の組合せも存在する。あるテストケースで実行されない経路に対する変更箇所の組合せがある場合、別のテストケースの実行結果が何れも“Ｐａｓｓ”であると、該当の組合せに対するテスト結果が“Ｋｉｌｌｅｄ”なのか“Ｕｎｋｉｌｌｅｄ”なのか不明になる。また、全てのテストケースで実行されない経路に対する変更箇所の組合せがある場合、該当の組合せに対するテスト結果が“Ｋｉｌｌｅｄ”なのか“Ｕｎｋｉｌｌｅｄ”なのか不明になる。
【００３２】
図１の例において、演算部１ｂは、上記のテスト実行では、例えば識別情報“１”，“２”の変更箇所を“ｎｏｐ”、識別情報“３”の変更箇所を“＜＝”、識別情報“４”の変更箇所を“／”とする組合せ（組合せＡとする）に対するテスト結果を得られない。なぜなら、第１のテストケースでは、ソースコードＰ１（または、ソースコードＰ２）に組合せＡの変更内容を適用した場合に実行結果が“Ｐａｓｓ”となり、第２，第３のテストケースでは、組合せＡの変更内容が同時に適用されることはないからである。
【００３３】
また、演算部１ｂは、例えば識別情報“１”の変更箇所を“＞＝”、識別情報“２”の変更箇所を“ｎｏｐ”、識別情報“３”の変更箇所を“＜＝”、識別情報“４”の変更箇所を“／”とする組合せ（組合せＢとする）に対するテスト結果を得られない。なぜなら、第１，第２のテストケースでは、組合せＢの変更内容が同時に適用されることはなく、第３のテストケースではソースコードＰ１（または、ソースコードＰ２）に組合せＢの変更内容を適用した場合に実行結果が“Ｐａｓｓ”となるからである。
【００３４】
演算部１ｂは、生成された複数の決定木（すなわち、決定木Ｔ１，Ｔ２，Ｔ３）に基づいて、テスト結果を未取得である変更箇所の第２の組合せに対して変更内容を適用した場合のテスト結果を決定する。具体的には、演算部１ｂは、Ｆａｉｌを“０”、Ｐａｓｓを“１”として扱い、決定木Ｔ１，Ｔ２，Ｔ３を論理積で統合（マージ）することで、統合後（マージ後）の決定木Ｔ４を生成する。演算部１ｂは、決定木Ｔ１，Ｔ２，Ｔ３のマージ処理に、二分決定図（ＯＢＤＤ：Ordered Binary Decision Diagram）のマージアルゴリズムを活用できる。例えば、演算部１ｂは、まず、決定木Ｔ２，Ｔ３をマージしてマージ後の決定木を生成し、更に作成したマージ後の決定木と決定木Ｔ１とをマージすることで、決定木Ｔ４を生成する。
【００３５】
決定木Ｔ４は、決定木Ｔ１，Ｔ２，Ｔ３と同様に、ノードｍ１，ｍ２，ｍ３，ｍ４と、“Ｐａｓｓ”や“Ｆａｉｌ”に対応するノードとを有する。ただし、図１中、決定木Ｔ４において、識別情報“２”の変更箇所に対応するノード（ノードｍ２）は２つ存在する（以下ではノードｍ２（１）、ノードｍ２（２）と表記して区別する）。決定木Ｔ４において、ノードｍ１の“ｎｏｐ”に対応するエッジの先は、ノードｍ２（１）である。ノードｍ１の“＞＝”に対応するエッジの先は、ノードｍ２（２）である。
【００３６】
決定木Ｔ４において、ノードｍ２（１）の“ｎｏｐ”に対応するエッジの先は、ノードｍ３である。ノードｍ２（１）の“−”に対応するエッジの先は“Ｆａｉｌ”に対応する終端ノードである。また、ノードｍ２（２）の“ｎｏｐ”に対応するエッジの先、および、ノードｍ２（２）の“−”に対応するエッジの先は何れも“Ｆａｉｌ”に対応する終端ノードである。
【００３７】
決定木Ｔ４において、ノードｍ３の“ｎｏｐ”に対応するエッジの先は、ノードｍ４である。ノードｍ３の“＜＝”に対応するエッジの先は、“Ｆａｉｌ”に対応する終端ノードである。
【００３８】
決定木Ｔ４において、ノードｍ４の“ｎｏｐ”に対応するエッジの先は、“Ｐａｓｓ”に対応する終端ノードである。ノードｍ４の“／”に対応するエッジの先、および、“％”に対応するエッジの先は、何れも“Ｆａｉｌ”に対応する終端ノードである。
【００３９】
そして、演算部１ｂは、決定木Ｔ４を辿ることで、テスト結果が未取得である第２の組合せ（例えば、前述の組合せＡ，Ｂ）に対するテスト結果を決定する。
１つの例として、前述の組合せＡを考える。演算部１ｂは、決定木Ｔ４において、ノードｍ１の“ｎｏｐ”に対応するエッジ、ノードｍ２（１）の“ｎｏｐ”に対応するエッジ、ノードｍ３の“＜＝”に対応するエッジを順に辿ることで、“Ｆａｉｌ”に対応する終端ノードに達する。よって、演算部１ｂは、組合せＡに対するテスト結果を“Ｋｉｌｌｅｄ”と決定する。
【００４０】
また、別の例として、前述の組合せＢを考える。演算部１ｂは、決定木Ｔ４において、ノードｍ１の“＞＝”に対応するエッジ、ノードｍ２（２）の“ｎｏｐ”に対応するエッジを順に辿ることで、“Ｆａｉｌ”に対応する終端ノードに達する。よって、演算部１ｂは、組合せＢに対するテスト結果を“Ｋｉｌｌｅｄ”と決定する。
【００４１】
演算部１ｂは、決定したテスト結果を、記憶部１ａに出力（格納）する。演算部１ｂは、決定したテスト結果を、解析装置１に接続された表示装置（図１では図示を省略している）により表示させてもよい。また、演算部１ｂは、決定木Ｔ４により決定したテスト結果を考慮して、テスト対象とする変更箇所の複数の組合せのうち、テスト結果が“Ｋｉｌｌｅｄ”となる組合せの割合などをテストの評価指標として算出し、出力してもよい。
【００４２】
例えば、上記のようにＳＳＥの手法により、実行経路に応じたミューテーションを行うことも考えられる。この手法では、実行コストを削減できる半面、幾つかの変更箇所の組合せに対する変更が試行されないことがある。このため、ある変更箇所の組合せ（例えば、前述の組合せＡ，Ｂなど）に対してテスト結果を得られないことがある。
【００４３】
この場合、解析装置１は、各テストケースに対して試行されていない変更箇所の組合せについて、個別に変更内容を適用したソースコードを用意し、コンパイルして、テスト実行することで該当の組合せに対するテスト結果を補完することが考えられる。しかし、このようにバグを埋め込んだソースコードを個別にコンパイル（ミュータント生成）し、テスト実行していると、解析に時間がかかるという問題がある。
【００４４】
そこで、解析装置１は、テストの実行時に決定木Ｔ１，Ｔ２，Ｔ３を生成し、決定木Ｔ１，Ｔ２，Ｔ３に基づいて、決定木Ｔ４を生成し、決定木Ｔ４を辿ることで、テスト結果を未取得である変更箇所の組合せに対するテスト結果を決定する。ここで、解析装置１の処理では、決定木Ｔ１，Ｔ２，Ｔ３の生成、および、マージといった処理コストが生じる。しかし、ミュータントを個別に生成して実行する処理コストと比べると、決定木Ｔ１，Ｔ２，Ｔ３の生成、および、マージの処理コストは十分に小さいと考えられる。
【００４５】
こうして、解析装置１は、決定木Ｔ１，Ｔ２，Ｔ３に基づいて、テスト結果を未取得である変更箇所の組合せに対するテスト結果を決定することで、ミュータントを個別に生成して実行せずに済み、その分の実行時間を削減できる。これにより、解析装置１は、解析を高速化できる。以下では、より具体的な例を示し、解析装置１の機能を更に詳細に説明する。
【００４６】
［第２の実施の形態］
図２は、第２の実施の形態の解析装置のハードウェア例を示す図である。解析装置１００は、プロセッサ１０１、ＲＡＭ１０２、ＨＤＤ１０３、画像信号処理部１０４、入力信号処理部１０５、媒体リーダ１０６および通信インタフェース１０７を有する。各ユニットは解析装置１００のバスに接続されている。
【００４７】
プロセッサ１０１は、解析装置１００の情報処理を制御する。プロセッサ１０１は、マルチプロセッサであってもよい。プロセッサ１０１は、例えばＣＰＵ、ＤＳＰ、ＡＳＩＣまたはＦＰＧＡなどである。プロセッサ１０１は、ＣＰＵ、ＤＳＰ、ＡＳＩＣ、ＦＰＧＡなどのうちの２以上の要素の組合せであってもよい。
【００４８】
ＲＡＭ１０２は、解析装置１００の主記憶装置である。ＲＡＭ１０２は、プロセッサ１０１に実行させるＯＳ（Operating System）のプログラムやアプリケーションプログラムの少なくとも一部を一時的に記憶する。また、ＲＡＭ１０２は、プロセッサ１０１による処理に用いる各種データを記憶する。
【００４９】
ＨＤＤ１０３は、解析装置１００の補助記憶装置である。ＨＤＤ１０３は、内蔵した磁気ディスクに対して、磁気的にデータの書き込みおよび読み出しを行う。ＨＤＤ１０３は、ＯＳのプログラム、アプリケーションプログラム、および各種データを記憶する。解析装置１００は、フラッシュメモリやＳＳＤ（Solid State Drive）などの他の種類の補助記憶装置を備えてもよく、複数の補助記憶装置を備えてもよい。
【００５０】
画像信号処理部１０４は、プロセッサ１０１からの命令に従って、解析装置１００に接続されたディスプレイ１１に画像を出力する。ディスプレイ１１としては、ＣＲＴ（Cathode Ray Tube）ディスプレイや液晶ディスプレイなどを用いることができる。
【００５１】
入力信号処理部１０５は、解析装置１００に接続された入力デバイス１２から入力信号を取得し、プロセッサ１０１に出力する。入力デバイス１２としては、例えば、マウスやタッチパネルなどのポインティングデバイス、キーボードなどを用いることができる。
【００５２】
媒体リーダ１０６は、記録媒体１３に記録されたプログラムやデータを読み取る装置である。記録媒体１３として、例えば、フレキシブルディスク（ＦＤ：Flexible Disk）やＨＤＤなどの磁気ディスク、ＣＤ（Compact Disc）やＤＶＤ（Digital Versatile Disc）などの光ディスク、光磁気ディスク（ＭＯ：Magneto-Optical disk）を使用できる。また、記録媒体１３として、例えば、フラッシュメモリカードなどの不揮発性の半導体メモリを使用することもできる。媒体リーダ１０６は、例えば、プロセッサ１０１からの命令に従って、記録媒体１３から読み取ったプログラムやデータをＲＡＭ１０２またはＨＤＤ１０３に格納する。
【００５３】
通信インタフェース１０７は、ネットワーク１４を介して他の装置と通信を行う。通信インタフェース１０７は、有線通信インタフェースでもよいし、無線通信インタフェースでもよい。
【００５４】
図３は、ミューテーション解析の例を示す図である。ここでは、テスト対象のプログラムＰ１０を用いて、解析装置１００によるミューテーション解析を例示する。プログラムＰ１０は、関数ａｂｓの記述を含む。ここで、ミューテーション解析とは、プログラムの１要素を変化させることでバグを埋め込み、テストが埋め込んだバグをどれだけ検出できるかを調べる手法である。バグが埋め込まれたプログラムは「ミュータント」と呼ばれる。ミュータントは、例えば、（ミューテーション箇所，ミューテーション内容）の組（ミューテーション記述子）で表される。
【００５５】
具体的には、プログラムＰ１１は、プログラムＰ１０の２行目に含まれる“＜＝”の記述を、“＞”に変化させたミュータントである。プログラムＰ１１の識別名は“ｍｕｔａｎｔ１”である。
【００５６】
また、プログラムＰ１２は、プログラムＰ１０の２行目に含まれる“０”の記述を、“１”に変化させたミュータントである。プログラムＰ１２の識別名は“ｍｕｔａｎｔ２”である。
【００５７】
更に、プログラムＰ１３は、プログラムＰ１０の３行目に含まれる“−”の記述を、“−−”に変化させたミュータントである。プログラムＰ１３の識別名は“ｍｕｔａｎｔ３”である。
【００５８】
図３の例では、２つのテストケースを考える。第１のテストケース（Ｔｅｓｔｃａｓｅ１）は、ａｂｓ（２）＝＝２である。すなわち、第１のテストケースは、関数ａｂｓにｘ＝２を入力したとき、出力が“２”になるか否かを確認する。ａｂｓ（２）＝＝２が成立すれば“Ｐａｓｓ”、成立しなければ“Ｆａｉｌ”である。
【００５９】
第２のテストケース（Ｔｅｓｔｃａｓｅ２）は、ａｂｓ（−２）＝＝２である。すなわち、第２のテストケースは、関数ａｂｓにｘ＝−２を入力したとき、出力が“２”になるか否かを確認する。ａｂｓ（−２）＝＝２が成立すれば“Ｐａｓｓ”、成立しなければ“Ｆａｉｌ”である。
【００６０】
プログラムＰ１１では、第１，第２のテストケースの何れも実行結果はＦａｉｌである。プログラムＰ１２では、第１のテストケースの実行結果はＰａｓｓ、第２のテストケースの実行結果はＰａｓｓである。プログラムＰ１３では、第１のテストケースの実行結果はＰａｓｓ、第２のテストケースの実行結果はＦａｉｌである。
【００６１】
この場合、第１のテストケースおよび第２のテストケースにより、プログラムＰ１１に埋め込まれたバグを検出できることになる。したがって、プログラムＰ１１に対するテスト結果はＫｉｌｌｅｄである。
【００６２】
また、第１のテストケースおよび第２のテストケースでは、プログラムＰ１２に埋め込まれたバグを検出できないことになる。したがって、プログラムＰ１２に対するテスト結果はＵｎｋｉｌｌｅｄである。
【００６３】
更に、第２のテストケースにより、プログラムＰ１３に埋め込まれたバグを検出できることになる。したがって、プログラムＰ１３に対するテスト結果はＫｉｌｌｅｄである。
例えば、解析装置１００は、検出されたバグの割合（ミューテーションスコア（mutation score））を算出し出力する。この場合、ミューテーションスコアは、２／３＝０．６６７である。ソフトウェアの開発者は、ミューテーションスコアを向上させるようにテストケースを改善することで、テストの信頼性を向上させることができる。
【００６４】
なお、図３の例では、１つの変更（ミューテーション）が適用されたプログラムＰ１１，Ｐ１２，Ｐ１３を例示した。このようなプログラムは、１次ミュータント（ＦＯＭ：First Order Mutant）と呼ばれる。また、ＦＯＭを組み合わせることで、２つ以上のミューテーションが適用されたプログラムを考えることもできる。２つ以上のミューテーションが適用されたプログラムは、高次ミュータント（ＨＯＭ：High Order Mutant）と呼ばれる。
【００６５】
ミュータント解析では、ミュータントを網羅的に生成し、テスト実行していると、テストに時間がかかる。例えば、コンパイルやテスト実行に要する時間を考慮すると、複数のミュータントに対するテストの合計時間は次の式で表される。
【００６６】
合計時間＝（ミュータント数）＊（ミューテーション時間＋コンパイル時間）＋（ミュータント数）＊（テストケース数）＊（テストケース１つ当たりの平均実行時間）
そこで、通常のミューテーションの代わりに、プログラムのミューテーション箇所を、ミューテーションを行うメタ関数に置き換え、ミューテーション用のパラメータを事後的に与えることで、コンパイルのコストを抑える手法（ＭＳＧ）がある。ＭＳＧでは、メタ関数に置換後のプログラムを１回コンパイルすればよい。ＭＳＧについては、文献“Mutation Analysis Using Mutant Schemata, Untch, Offutt, and Harrold, ISSTA, 1993”が参考になる。
【００６７】
また、ソースコードからコンパイルされたビットコードに対してミューテーションを行うことでコンパイル回数を減らす手法（Bitcode Mutation）もある。Bitcode Mutationについては、文献“Mujava: An Automated Class Mutation System, Mar, Offutt, and Kwon, STVR, 2005”が参考になる。
【００６８】
更に、Online Adaptation Techniqueと呼ばれる手法により、実行状態に動的にミューテーション情報を与えることで、冗長なミュータントの実行を回避し、実行時間を短縮することもある。特に、ＳＳＥでは、プログラムの実行箇所で実行状態を分割し、当該実行箇所までの実行を共通化することで実行コストを減らせる。ＳＳＥでは、ＨＯＭ生成を考慮すると、実行状態は多段に分割されることになる。
【００６９】
ただし、Online AdaptationおよびＳＳＥを用いることで、実行コストを減らせる半面、冗長なＨＯＭが実行されず、当該ＨＯＭに対するＫｉｌｌｅｄ／Ｕｎｋｉｌｌｅｄのテスト結果が不明になることがある。なお、ＳＳＥで実行されないミュータントを図４４で例示する。ただし、省略されたＨＯＭもｋｉｌｌされる可能性はある。そこで、解析装置１００は、テスト結果を得られていないＨＯＭに対して効率的にテスト結果を取得する機能を提供する。
【００７０】
図４は、解析装置の機能例を示す図である。解析装置１００は、記憶部１１０、メタ関数置換部１２０、コンパイラ１３０、決定木作成部１４０、決定木マージ部１５０および結果出力部１６０を有する。
【００７１】
記憶部１１０は、ＲＡＭ１０２またはＨＤＤ１０３の所定の記憶領域により実現される。メタ関数置換部１２０、コンパイラ１３０、決定木作成部１４０、決定木マージ部１５０および結果出力部１６０は、ＲＡＭ１０２に記憶されたプログラムをプロセッサ１０１により実行することで実現される。
【００７２】
記憶部１１０は、ソースコードおよび置換後ソースコードを記憶する。置換後ソースコードは、ソースコード内のミューテーション箇所の記述をメタ関数に置換したものである。また、記憶部１１０は、置換後ソースコードをコンパイルして生成されたプログラムを記憶する。当該プログラムは、例えば、ＬＬＶＭ（Low Level Virtual Machine）ビットコードである。更に、記憶部１１０は、テスト内容を記述したテストプログラム、および、ミューテーション内容を示すミューテーションオペレータリストを記憶する。なお、ソースコード、置換後ソースコード、ＬＬＶＭビットコード、テストプログラムおよびミューテーションオペレータリストは、解析装置１００の外部の記憶装置に記憶されてもよい。
【００７３】
記憶部１１０は、メタミューテーション情報、ミュータント一覧、実行状態集合、決定木およびテスト結果テーブルを記憶する。メタミューテーション情報は、メタ関数に置換されたソースコードの位置を管理するための情報である。ミュータント一覧は、ミュータントの一覧の情報である。実行状態集合は、プログラム実行に伴う実行状態の記録に用いられる情報である。決定木は、テストによるプログラムの実行結果を、実行により辿ったミュータント箇所とともに記録した情報である。テスト結果テーブルは、各ミュータントに対するテスト結果を記録するための情報である。
【００７４】
メタ関数置換部１２０は、ソースコードの所定の演算に関する記述を、メタ関数に置換することで、置換後ソースコードを生成し、記憶部１１０に格納する。また、メタ関数置換部１２０は、当該置換に応じて、メタミューテーション情報およびミュータント一覧を生成し、記憶部１１０に格納する。
【００７５】
コンパイラ１３０は、記憶部１１０に記憶された置換後ソースコードをコンパイルして、中間コードのプログラム（ＬＬＶＭビットコード）を生成し、記憶部１１０に格納する。
【００７６】
決定木作成部１４０は、記憶部１１０に記憶された中間コードのプログラムに対して、テストプログラムに基づくテストを実行する。決定木作成部１４０は、ＳＳＥの手法を用いてテストを実行する。このとき、決定木作成部１４０は、記憶部１１０に記憶されたミューテーションオペレータリストに従って、ミューテーション箇所に対するミューテーションを行いながら、決定木の作成およびプログラムの実行状態の記録を行う。決定木作成部１４０は、テストケース毎に、決定木の作成を行う。決定木作成部１４０は、作成した決定木の情報を記憶部１１０に格納する。
【００７７】
決定木マージ部１５０は、記憶部１１０に記憶されたテストケース毎の決定木をマージする。決定木マージ部１５０は、決定木のマージに、ＯＢＤＤのマージアルゴリズムを用いる。当該マージアルゴリズムについて、文献“Merging Ordered Binary Decision Diagrams， ｈｔｔｐ：／／ｗｗｗ．ｃｓ．ｅｎｇｒ．ｕｋｙ．ｅｄｕ／〜ｌｅｗｉｓ／ｐａｐｅｒｓ／ｍｅｒｇｅ‐ａｌｇ．ｐｄｆ， ２０１６年９月７日検索”が参考になる。決定木マージ部１５０は、“Ｆａｉｌ”を“０”、“Ｐａｓｓ”を“１”として扱い、決定木ｆ（ｍ１，ｍ２，・・・ｍｎ）（ｎは正の整数）と決定木ｇ（ｍ１，ｍ２，・・・，ｍｎ）とマージして決定木ｈ（ｍ１，ｍ２，・・・，ｍｎ）を作成する（ｍｎはノードを示す）。より具体的には、決定木マージ部１５０は、決定木ｆ，ｇ内のノードを深さ優先で選択してミューテーションオペレータを割当て、その順に決定木ｈのノードとエッジとを作成する。決定木マージ部１５０は、決定木ｆまたは決定木ｇの少なくとも何れかがＦａｉｌになったら、決定木ｈのその時点のノードからＦａｉｌのノードへのエッジを作成する（詳細は後述される）。決定木マージ部１５０は、マージにより得られた決定木の情報を、記憶部１１０に格納する。
【００７８】
結果出力部１６０は、記憶部１１０に記憶されたミュータント一覧を参照して、記憶部１１０に記憶されたマージ後の決定木を辿ることで、各ミュータントに対するテスト結果を決定し、ミューテーションスコアの計算を行う。結果出力部１６０は、ミューテーションスコアの計算結果を含む結果レポートを、ディスプレイ１１に表示させる。結果出力部１６０は、テストで検出できなかった（ｋｉｌｌできなかった）ミュータントをディスプレイ１１によりリスト表示させる。結果出力部１６０は、リスト表示されたミュータントのうちの何れかがユーザにより選択されると、記憶部１１０に記憶されたメタミュータント情報を参照して、選択されたミュータントに対応するソースコードの該当箇所をユーザに提示する。
【００７９】
図５は、ソースコードの例を示す図である。ソースコード１１１は、ユーザにより解析装置１００に入力され、記憶部１１０に格納される。ソースコード１１１は、Ｃ言語による整数型の関数ｆｕｎｃの記述を含む。関数ｆｕｎｃは、整数型の入力値（ｘ）に対する演算を行う関数である。
【００８０】
図６は、置換後ソースコードの例を示す図である。置換後ソースコード１１２は、ソースコード１１１に基づいて、メタ関数置換部１２０により生成され、記憶部１１０に格納される。置換後ソースコード１１２は、メタ関数を含む。本例では、メタ関数は、３つの引数をもつ。第１引数は変更箇所の識別子（ＭＭＩＤ：Meta Mutation IDentifier）である。第２引数は入力値（この例では何れも“ｘ”）である。第３引数は演算に用いられる値である。
【００８１】
具体的には、置換後ソースコード１１２では、ソースコード１１１の２行目の“ｘ  ＜  ０”という記述が、“ｂｏｐ＿ｌｔ（１，ｘ，０）”というメタ関数の記述に置換されている。メタ関数ｂｏｐ＿ｌｔ（１，ｘ，０）の第１引数“１”はＭＭＩＤである。同第２引数“ｘ”は入力値である。同第３引数“０”は入力値に対する比較演算に用いられる値である。メタ関数ｂｏｐ＿ｌｔは、関係演算子“＜”を“＞＝”へ変更するミューテーションを行う。
【００８２】
また、置換後ソースコード１１２では、ソースコード１１１の３行目の“ｘ  ＋  １”という記述が、“ｂｏｐ＿ａｄｄ（２，ｘ，１）”というメタ関数の記述に置換されている。メタ関数ｂｏｐ＿ａｄｄは、算術演算子“＋”を“−”へ変更するミューテーションを行う。
【００８３】
また、置換後ソースコード１１２では、ソースコード１１１の４行目の“ｘ  ＞  ０”という記述が、“ｂｏｐ＿ｇｔ（３，ｘ，０）”というメタ関数の記述に置換されている。メタ関数ｂｏｐ＿ｇｔは、関係演算子“＞”を“＜＝”へ変更するミューテーションを行う。
【００８４】
更に、ソースコード１１２では、ソースコード１１１の５行目の“ｘ  ＊  ２”という記述が、“ｂｏｐ＿ｍｕｌ（４，ｘ，２）”というメタ関数の記述に置換されている。メタ関数ｂｏｐ＿ｍｕｌは、算術演算子“＊”を“／”および“％”へ変更するミューテーションを行う。
【００８５】
ここで、関数ｆｕｎｃのｒｅｔｕｒｎ命令による返り値は、整数に丸められることに注意されたい（例えば、演算“−１／２”の結果は０に丸められる）。
図７は、テストプログラムの例を示す図である。テストプログラム１１３は、ユーザにより解析装置１００に入力され、記憶部１１０に格納される。テストプログラム１１３は、３つのテストケースを含む。第１のテストケース（ｔｅｓｔｃａｓｅ１）は、ｆｕｎｃ（０）＝＝０が成立するか否か（関数ｆｕｎｃに０を入力したときの関数ｆｕｎｃの出力が確認値０に一致するか否か）を確認することを示す。第２のテストケース（ｔｅｓｔｃａｓｅ２）は、ｆｕｎｃ（１）＝＝２が成立するか否かを確認することを示す。第３のテストケース（ｔｅｓｔｃａｓｅ３）は、ｆｕｎｃ（−１）＝＝０が成立するか否かを確認することを示す。
【００８６】
図８は、ミューテーションオペレータリストの例を示す図である。ミューテーションオペレータリスト１１４は、ユーザにより解析装置１００に入力され、記憶部１１０に格納される。ミューテーションオペレータリスト１１４は、テスト時に適用するミューテーションオペレータのリストである。
【００８７】
ＯＳＳＮは、Shift operator mutationであり、シフト演算子のミューテーション（例えば、左シフト演算“＜＜＝”を右シフト演算“＞＞＝”に変更するミューテーション）を行うことを示す。
【００８８】
ＯＲＲＮは、Relational operator mutationであり、関係演算子のミューテーション（例えば、“＞”を“＜＝”に変更するミューテーション）を行うことを示す。
ＯＩＤＯは、Increment/Decrement Replacementであり、加算と減算とを変更するミューテーション（例えば、“＋＋”や“＋１”を、“−−”や“−１”に変更するミューテーション）を行うことを示す。
【００８９】
ＯＡＡＮは、Arithmetic operator mutationであり、乗算を除算や剰余を取得する演算に変更するミューテーション（例えば、“＊”を、“／”や“％”に変更するミューテーション）を行うことを示す。
【００９０】
ミューテーションオペレータリスト１１４は、テスト時におけるミューテーションの内容を指定するための情報と考えてもよい。
図９は、メタミューテーション情報の例を示す図である。メタミューテーション情報１１５は、置換後ソースコード１１２の生成時にメタ関数置換部１２０により生成され、記憶部１１０に格納される。メタミューテーション情報１１５は、ＭＭＩＤおよびソースコード位置情報の項目を含む。
【００９１】
ＭＭＩＤの項目には、ＭＭＩＤが登録される。ソースコード位置情報の項目には、ソースコード１１１のファイル名、および、ソースコード１１１においてメタ関数に置換された位置の情報が登録される。ここで、ソースコード１１１のファイル名は、“ａ．ｃ”である。
【００９２】
例えば、メタミューテーション情報１１５には、ＭＭＩＤが“１”、ソースコード位置情報が“ａ．ｃ：２行６桁−２行１１桁”という情報が含まれる。これは、ソースコード１１１における２行６桁−２行１１桁に対応する“ｘ  ＜  ０”の記述がＭＭＩＤ“１”に対応するメタ関数に置換されたことを示す。
【００９３】
メタミューテーション情報１１５には、他のミューテーション箇所についても同様に、ＭＭＩＤとソースコード位置情報とが対応付けて登録される。
図１０は、中間コードの例を示す図である。中間コード１１６は、置換後ソースコード１１２がコンパイラ１３０によりコンパイルされることで生成され、記憶部１１０に格納される。中間コード１１６の１つの行は１つの命令に対応する。中間コード１１６の命令は、命令ＩＤ（IDentifier）によって識別される。中間コード１１６における“％１”や“％２”などの“％”記号と数値との結合で表される変数はレジスタを示し、各命令の実行結果が格納される。
【００９４】
例えば、命令ＩＤ“３”の命令は、置換後ソースコード１１２の２行目のメタ関数ｂｏｐ＿ｌｔ（１，ｘ，０）に対応する。“％２”には、ミューテーション内容に応じた演算結果が設定される。“％２”の設定値は、演算結果が真なら“１”、偽なら“０”である。
【００９５】
命令ＩＤ“４”の命令は、“％２”の設定値が０に等しくないとき“％３”に“１”を設定し、“％２”の設定値が０に等しいとき“％３”に“０”を設定する。
命令ＩＤ“５”の命令は、“％３”の設定値が“１”なら命令ＩＤ“６”にジャンプし、また、“％３”の設定値が“０”なら命令ＩＤ“１０”にジャンプすることを示す。
【００９６】
同様に、中間コード１１６は、置換後ソースコード１１２の３行目に対応する命令群（命令ＩＤ“６”〜“９”）を含む。中間コード１１６は、置換後ソースコード１１２の４行目に対応する命令群（命令ＩＤ“１０”〜“１３”）を含む。中間コード１１６は、置換後ソースコード１１２の５行目に対応する命令群（命令ＩＤ“１４”〜“１７”）を含む。ただし、置換後ソースコード１１２における“ｒｅｔｕｒｎ”に対応する命令は、命令ＩＤ“２１”〜“２３”で共通化している。すなわち、実行結果は“％１３”のレジスタに格納された値と、テストケースの確認値との比較によって定まる（両値が一致ならＰａｓｓであり、不一致ならＦａｉｌである）。
【００９７】
図１１は、実行状態集合の例を示す図である。実行状態集合１１７は、決定木作成部１４０により生成され、記憶部１１０に格納される。実行状態集合１１７は、実行状態ＩＤ、命令ＩＤ、ミューテーション記述子およびメモリの項目を含む。
【００９８】
実行状態ＩＤの項目には、実行状態の識別情報（実行状態ＩＤ）が登録される。実行状態は、レジスタの設定値の組合せによって表される。命令ＩＤは、中間コード１１６のうち、ミューテーションによる状態分岐が発生している命令の命令ＩＤが登録される。ミューテーション記述子の項目には、該当の命令ＩＤに対応する命令において適用するミューテーションの内容を示すミューテーション記述子が登録される。メモリの項目には、プログラム（中間コード１１６）の実行状態を表すレジスタの設定値の組合せが登録される。
【００９９】
例えば、実行状態集合１１７には、実行状態ＩＤが“２”、命令ＩＤが“３”、ミューテーション記述子が“１，＞＝”、メモリが“％１＝０”という情報が登録される。これは、実行状態ＩＤ“２”で示される実行状態では、命令ＩＤ“３”の命令においてミューテーションによる状態分岐が発生していることを示す。また、実行状態ＩＤ“２”で示される実行状態は、レジスタの設定値の組が“％１＝０”であること、当該箇所におけるミューテーション記述子が（１，＞＝）であることを示す。ここで、ミューテーション記述子の左側の数値はＭＭＩＤである。ミューテーション記述子の右側の演算子はミューテーション内容を示す。
【０１００】
実行状態集合１１７では、テスト実行に伴って現在生じている複数の状態分岐が記録され得る。図１１の例では、実行状態ＩＤ“２”の他にも、実行状態ＩＤ“３”、“４”、“５”に対応する実行状態が記録されている（後述する図３１の実行状態に相当する）。
【０１０１】
図１２は、ミュータント一覧の例を示す図である。ミュータント一覧１１８は、メタ関数置換部１２０により生成され、記憶部１１０に格納される。ミュータント一覧１１８は、ミュータントＩＤおよびミューテーション記述子の項目を含む。
【０１０２】
ミュータントＩＤの項目には、ミュータントの識別情報（ミュータントＩＤ）が登録される。ミューテーション記述子の項目には、ミューテーション記述子が登録される。ミュータントは、ミューテーション記述子の組合せで表される。テスト対象とするミュータントの最高次数は、ユーザにより指定される。一例として、ミュータントの最高次数“３”が指定されているものとする（３次以下のミュータントを作成することを示す）。
【０１０３】
本例では、５種類のＦＯＭが存在する。ミュータントＩＤは、文字“Ｍ”とＦＯＭを識別する数値の組合せ（１以上の数値を要素とする）を示す添え字との結合によって表される。ミュータントＩＤ“Ｍ1”のミュータントは、ミューテーション記述子（１，＞＝）に対応する。ここで、以下では、ミュータントＩＤ“Ｍ1”のミュータントを、「ミュータントＭ1」のように表記することがある。
【０１０４】
ミュータントＭ2は、ミューテーション記述子（２，−）に対応する。ミュータントＭ3は、ミューテーション記述子（３，＜＝）に対応する。ミュータントＭ4は、ミューテーション記述子（４，／）に対応する。ミュータントＭ5は、ミューテーション記述子（４，％）に対応する。ミュータントＭ1，Ｍ2，Ｍ3，Ｍ4，Ｍ5は、ＦＯＭである。
【０１０５】
ＨＯＭは、ＦＯＭのミューテーション記述子の組合せで表される。例えば、ミュータントＭ1,2は、ミューテーション記述子｛（１，＞＝），（２，−）｝に対応する。また、例えば、ミュータントＭ1,2,3は、ミューテーション記述子｛（１，＞＝），（２，−），（３，＜＝）｝に対応する。ミュータント一覧１１８では、他のミュータントも同様にして、ミューテーション記述子に対応付けられている。この例では、ミュータントの合計数は２１である。
【０１０６】
例えば、メタ関数置換部１２０は、ユーザにより入力されたＦＯＭの一覧（ミュータントＭ1，Ｍ2，Ｍ3，Ｍ4，Ｍ5のミュータントＩＤとミューテーション記述子との対応を示すリスト）および指定次数に基づいて、ミュータント一覧１１８を作成してもよい。
【０１０７】
図１３は、テスト結果テーブルの例を示す図である。テスト結果テーブル１１９は、記憶部１１０に格納され、決定木作成部１４０および結果出力部１６０により更新される。テスト結果テーブル１１９は、ミュータントＩＤ、Ｔｅｓｔ１、Ｔｅｓｔ２、Ｔｅｓｔ３およびミュータント生存結果の項目を含む。
【０１０８】
ミュータントＩＤの項目には、ミュータントＩＤが登録される。Ｔｅｓｔ１の項目には、第１のテストケース（ｔｅｓｔｃａｓｅ１）の実行結果が登録される。Ｔｅｓｔ２の項目には、第２のテストケース（ｔｅｓｔｃａｓｅ２）の実行結果が登録される。Ｔｅｓｔ３の項目には、第３のテストケース（ｔｅｓｔｃａｓｅ３）の実行結果が登録される。ミュータント生存結果の項目には、テストプログラム１１３によりミュータントがｋｉｌｌされたか否かを示す情報（テスト結果）が登録される。前述のように、少なくとも１つのテストケースの実行結果が“Ｆａｉｌｅｄ”であれば、ミュータント生存結果は“Ｋｉｌｌｅｄ”となる。また、何れのテストケースの実行結果も“Ｐａｓｓｅｄ”であれば、ミュータント生存結果は“Ｕｎｋｉｌｌｅｄ”となる。
【０１０９】
ここで、テスト結果テーブル１１９では、通常のＳＳＥによるミュータント解析の結果が登録された状態を示している。
例えば、テスト結果テーブル１１９には、ミュータントＩＤが“Ｍ1”、Ｔｅｓｔ１が“Ｆａｉｌｅｄ”、Ｔｅｓｔ２が“Ｐａｓｓｅｄ”、Ｔｅｓｔ３が“Ｐａｓｓｅｄ”、ミュータント生存結果が“Ｋｉｌｌｅｄ”という情報が登録される。これは、ミュータントＭ1がテストプログラム１１３によって検出されることを示す。
【０１１０】
テスト結果テーブル１１９には、他のミュータントＩＤに対しても、同様に各テストケースの実行結果およびミュータント生存結果が登録される。ただし、設定なし“−”（ハイフン記号）となっている箇所は、通常のＳＳＥでは試行されず、該当のテストケースに対する実行結果や、ミュータント生存結果が未取得であることを示す。ミュータント生存結果が未取得の箇所は、後述の手順によって補完されることになる。
【０１１１】
図１４は、決定木の例を示す図である。図１４（Ａ）は、第１のテストケース（ｔｅｓｔｃａｓｅ１）に対する決定木Ｔ１０を示す。図１４（Ｂ）は、第２のテストケース（ｔｅｓｔｃａｓｅ２）に対する決定木Ｔ２０を示す。図１４（Ｃ）は、第３のテストケース（ｔｅｓｔｃａｓｅ３）に対する決定木Ｔ３０を示す。決定木Ｔ１０，Ｔ２０，Ｔ３０は、有向グラフにより表される。
【０１１２】
ここで、決定木Ｔ１０を、Ｔｅｓｔ１（ｍ１，ｍ２，ｍ３，ｍ４）と表す。ｍ１，ｍ２，ｍ３，ｍ４は、ノードの識別子である。例えば、識別子ｍ１のノードを「ノードｍ１」のように表す。ノードの識別子に付された数値は、ＭＭＩＤに対応する。各ノードを起点とするエッジは、該当のノードのＭＭＩＤで示されるミューテーション箇所におけるミューテーション内容を表す。ミューテーションを行っていない場合は“ｎｏｐ”のエッジに対応する。
【０１１３】
図１５は、各決定木のマージ結果の例を示す図である。決定木Ｔ４０は、決定木Ｔ１０，Ｔ２０，Ｔ３０を、論理積（Ｔｅｓｔ１（ｍ１，ｍ２，ｍ３，ｍ４）∧Ｔｅｓｔ２（ｍ１，ｍ２，ｍ３，ｍ４）∧Ｔｅｓｔ３（ｍ１，ｍ２，ｍ３，ｍ４））でマージした結果である。決定木マージ部１５０は、前述のＯＢＤＤのマージアルゴリズムを用いて、決定木Ｔ４０を生成する（決定木のマージ処理の手順の詳細は後述される）。
【０１１４】
図１６は、ノード・エッジのコード例を示す図である。コードＣ１は、決定木Ｔ１０，Ｔ２０，Ｔ３０，Ｔ４０それぞれに属するノードおよびエッジを管理するためのコードである。例えば、ノードは、ＭＭＩＤ（図１６中のｍｍｉｄに相当）をもち、ミューテーションオペレータ（コードＣ１の１０行目で定義される“ｎｏｐ”、“ｌｔ”、“ｌｅ”など）に応じた次ノードへのポインタ（エッジに相当）をもつ。終端ノード（葉ノードと称する）は、ブーリアン型の変数“ｉｓＰａｓｓｅｄ”により、ｔｒｕｅ（“Ｐａｓｓ”に相当）またはｆａｌｓｅ（“Ｆａｉｌ”に相当）の何れかをもつ。
【０１１５】
図１７は、決定木のデータ例を示す図である。データＤ１は、決定木Ｔ１０に等価な情報を示している。具体的には、ノードｍ１では、ミューテーションオペレータ［ｎｏｐ］に対してノードｍ３へのポインタが設定される。ノードｍ１では、ミューテーションオペレータ［ｇｅ］（演算子“＞＝”に相当）に対してノードｍ２へのポインタが設定される。
【０１１６】
ノードｍ２では、ミューテーションオペレータ［ｎｏｐ］に対して、Ｆａｉｌの葉ノードへのポインタが設定される。ノードｍ２では、ミューテーションオペレータ［ｓｕｂ］（演算子“−”に相当）に対して、Ｆａｉｌの葉ノードへのポインタが設定される。
【０１１７】
ノードｍ３では、ミューテーションオペレータ［ｎｏｐ］に対して、Ｐａｓｓの葉ノードへのポインタが設定される。ノードｍ３では、ミューテーションオペレータ［ｌｅ］（＜＝）に対して、ノードｍ４へのポインタが設定される。
【０１１８】
ノードｍ４では、ミューテーションオペレータ［ｎｏｐ］に対して、Ｐａｓｓの葉ノードへのポインタが設定される。ノードｍ４では、ミューテーションオペレータ［ｄｉｖ］（演算子“／”に相当）に対して、Ｐａｓｓの葉ノードへのポインタが設定される。ノードｍ４では、ミューテーションオペレータ［ｒｅｍ］（演算子“％”に相当）に対して、Ｐａｓｓの葉ノードへのポインタが設定される。
【０１１９】
決定木Ｔ２０，Ｔ３０，Ｔ４０の情報についても、決定木Ｔ１０と同様のデータ構造により管理される。
図１８は、結果レポートの出力例を示す図である。結果レポートＲ１は、結果出力部１６０により出力される結果レポートの例である。結果レポートＲ１は、一例として、関数ｆｕｎｃ１に対するミュータント解析の結果を表す。結果レポートＲ１は、ミューテーションスコア（Mutation Score）の計算結果（例えば、“７５％”（９／１２）の表示）や検出されなかったミュータント（Unkilled mutants）のリストを含む。リストの１要素は、ソースコードの位置、オリジナルのコード、および、ミュータントのコードを含む。該当の位置において複数のミュータントを生成した場合は、該当の位置に対する複数のミュータントが表示され得る。ユーザは、リストから任意のミュータントを選択可能である。結果出力部１６０は、ユーザにより選択されたミュータントに対応するソースコードの該当箇所を結果レポートＲ１内に表示させる。例えば、結果出力部１６０は、該当箇所を強調するようハイライト表示したり、該当箇所に下線を付したりすることで、ユーザによる問題箇所の認識を支援する。ユーザは、結果レポートＲ１を確認して、ミューテーションスコアを向上させるようテスト内容の見直しを行える。
【０１２０】
次に、解析装置１００によるミューテーション解析の処理手順を説明する。
図１９は、解析装置の処理例を示すフローチャートである。以下、図１９に示す処理をステップ番号に沿って説明する。
【０１２１】
（Ｓ１）メタ関数置換部１２０は、ソースコード１１１の入力を受け付ける。すると、メタ関数置換部１２０は、ソースコード１１１へのメタ関数の埋め込みを行う。具体的には、メタ関数置換部１２０は、予め定められた所定の演算子を用いた演算に対応するコードを当該演算に対応するメタ関数のコードに置換する。その結果、メタ関数置換部１２０は、置換後ソースコード１１２を生成し、記憶部１１０に格納する。メタ関数置換部１２０は、埋め込んだメタ関数に応じて、ミュータント一覧１１８を生成し、記憶部１１０に格納する。また、メタ関数置換部１２０は、メタミューテーション情報１１５を生成し、記憶部１１０に格納する。このとき、メタ関数置換部１２０は、ミューテーションオペレータリスト１１４やＦＯＭ一覧およびミューテーションの次数のユーザによる入力を受け付けて、各ミュータントのミューテーション記述子を特定してもよい。
【０１２２】
（Ｓ２）コンパイラ１３０は、置換後ソースコード１１２を中間コード１１６へコンパイルする。コンパイラ１３０は、コンパイルによって生成した中間コード１１６を記憶部１１０に格納する。
【０１２３】
（Ｓ３）決定木作成部１４０は、決定木作成処理を行う。具体的には、決定木作成部１４０は、中間コード１１６を用いて、テストプログラム１１３によるテストを実行し、決定木Ｔ１０，Ｔ２０，Ｔ３０の情報を生成する。決定木作成部１４０は、決定木Ｔ１０，Ｔ２０，Ｔ３０の情報を記憶部１１０に格納する。決定木作成部１４０は、テスト実行にＳＳＥの手法を用いる。決定木作成部１４０は、テスト実行に伴って、記憶部１１０に記憶されたテスト結果テーブル１１９を更新する。また、決定木作成部１４０は、テスト時に機能させるミューテーションの内容を示すミューテーションオペレータリスト１１４のユーザによる入力を予め受け付け、記憶部１１０に格納している。本例では、ミューテーションオペレータリスト１１４により、少なくともＯＲＲＮ、ＯＩＤＯ、ＯＡＡＮが指定されているものとする。決定木作成処理の詳細は、後述される。
【０１２４】
（Ｓ４）決定木マージ部１５０は、決定木マージ処理を行う。具体的には、決定木マージ部１５０は、決定木Ｔ１０，Ｔ２０，Ｔ３０をマージし、決定木Ｔ４０の情報を生成する。決定木マージ部１５０は、決定木Ｔ４０の情報を記憶部１１０に格納する。決定木マージ処理の詳細は、後述される。
【０１２５】
（Ｓ５）結果出力部１６０は、結果レポート出力処理を行う。具体的には、結果出力部１６０は、記憶部１１０に記憶された決定木Ｔ４０の情報を参照して、テスト結果テーブル１１９の登録内容を補完する。結果出力部１６０は、テスト結果テーブル１１９に基づいて、結果レポートを生成し、ディスプレイ１１に表示させる。
【０１２６】
図２０は、決定木作成処理例を示すフローチャートである。以下、図２０に示す処理をステップ番号に沿って説明する。以下に示す処理は、図１９のステップＳ３に相当する。
（Ｓ１１）決定木作成部１４０は、初期化処理を行う。具体的には、決定木作成部１４０は、新たなテストケースによる決定木を新規に作成する準備を行う。初期化処理の詳細は、後述される。
【０１２７】
（Ｓ１２）決定木作成部１４０は、記憶部１１０に記憶された実行状態集合１１７を参照して、実行状態を選択する。あるテストケースに対して、ステップＳ１２を最初に実行する場合、前述の初期化処理で用意される初期実行状態を選択する。初期実行状態は、実行状態ＩＤ“１”であり、当初の命令ＩＤ、ミューテーション記述子およびメモリ（レジスタの組）に対する設定はなしである。なお、決定木作成部１４０は、着目する実行状態ＩＤに対する命令ＩＤおよびメモリに対する記録内容を中間コード１１６の実行に伴い更新する。
【０１２８】
（Ｓ１３）決定木作成部１４０は、記憶部１１０に記憶された中間コード１１６から次の命令を取り出す。前述のように、命令は、命令ＩＤによって識別される。
（Ｓ１４）決定木作成部１４０は、取り出した命令がメタ関数の呼び出しであるか否かを判定する。メタ関数の呼び出しである場合、処理をステップＳ１６に進める。メタ関数の呼び出しでない場合、処理をステップＳ１５に進める。
【０１２９】
（Ｓ１５）決定木作成部１４０は、ステップＳ１３で取り出した元の命令を実行する。そして、決定木作成部１４０は、処理をステップＳ１９に進める。
（Ｓ１６）決定木作成部１４０は、メタ関数に含まれるＭＭＩＤが現在の実行状態に未記録のＭＭＩＤであるか否かを判定する。現在の実行状態に未記録のＭＭＩＤである場合、処理をステップＳ１７に進める。現在の実行状態に未記録のＭＭＩＤでない場合（すなわち、現在の実行状態に記録済のＭＭＩＤである場合）、処理をステップＳ１８に進める。
【０１３０】
（Ｓ１７）決定木作成部１４０は、決定木内部ノード追加処理を行う。決定木内部ノード追加処理の詳細は、後述される。
（Ｓ１８）決定木作成部１４０は、取り出した命令に対応するミューテーション記述子（“ｎｏｐ”の場合もある）の命令を実行する。すなわち、決定木作成部１４０は、ミューテーション記述子で示されるミューテーション内容を、取り出した命令に適用して該当の命令を実行する。“ｎｏｐ”が適用される場合、該当の命令（ステップＳ１３で取り出した元の命令）についてミューテーションを行わずに当該命令が実行されることになる。
【０１３１】
（Ｓ１９）決定木作成部１４０は、中間コード１１６を参照して、次の命令が空であるか否かを判定する。空である（すなわち、命令ＩＤ“２４”に達した）場合、処理をステップＳ２０に進める。空でない（すなわち、命令ＩＤ“２４”に達していない）場合、処理をステップＳ１３に進める。
【０１３２】
（Ｓ２０）決定木作成部１４０は、決定木葉ノード追加処理を行う。決定木葉ノード追加処理の詳細は、後述される。
（Ｓ２１）決定木作成部１４０は、実行状態集合１１７が空であるか否かを判定する。空である場合、処理をステップＳ２２に進める。空でない場合、処理をステップＳ１２に進める。
【０１３３】
（Ｓ２２）決定木作成部１４０は、次のテストが空であるか否かを判定する。次のテストが空である（すなわち、全てのテストケースを実行した）場合、処理を終了する。次のテストが空でない（すなわち、未実行のテストケースがある）場合、処理をステップＳ１１に進める。
【０１３４】
図２１は、初期化処理例を示すフローチャートである。以下、図２１に示す処理をステップ番号に沿って説明する。以下に示す処理は、図２０のステップＳ１１に相当する。
（Ｓ３１）決定木作成部１４０は、次のテストを中間コード１１６へ入力する。次のテストとは、テストプログラム１１３に含まれる３つのテストケースのうち、次に実行するテストケースを示す。例えば、決定木作成部１４０は、第１のテストケース（ｔｅｓｔｃａｓｅ１）、第２のテストケース（ｔｅｓｔｃａｓｅ２）、第３のテストケース（ｔｅｓｔｃａｓｅ３）の順に、次のテストを選択する。
【０１３５】
（Ｓ３２）決定木作成部１４０は、初期実行状態を用意する。前述のように、初期実行状態は、実行状態ＩＤ“１”であり、当初は、命令ＩＤ、ミューテーション記述子およびメモリ（レジスタの組）に対する設定をもたない。決定木作成部１４０は、初期実行状態を実行状態集合１１７に登録する。
【０１３６】
（Ｓ３３）決定木作成部１４０は、新たに空の決定木を用意する。用意された決定木は、ステップＳ３３の段階では、ノードやエッジをもたない。
図２２は、決定木内部ノード追加処理例を示すフローチャートである。以下、図２２に示す処理をステップ番号に沿って説明する。以下に示す処理は、図２０のステップＳ１７に相当する。
【０１３７】
（Ｓ４１）決定木作成部１４０は、メタ関数に対応するミューテーションオペレータの数だけ元の実行状態をコピーし、新しい実行状態を生成して、実行状態集合１１７に登録する。決定木作成部１４０は、記憶部１１０に格納されたミューテーションオペレータリスト１１４からミューテーションオペレータおよびミューテーションオペレータの数（ここでは“ｎｏｐ”を含まなくてよい）を特定できる。
【０１３８】
（Ｓ４２）決定木作成部１４０は、新しい実行状態のミューテーション記述子に、ＭＭＩＤと、メタ関数に対応するミューテーションオペレータとを記録する。
（Ｓ４３）決定木作成部１４０は、現在の実行状態のミューテーション記述子をＭとして、決定木の現在位置特定処理（Ｍ）を実行する。決定木の現在位置特定処理の詳細は、後述される。ただし、今回のテストケースにおいて決定木が空の場合、現在位置は決定木の起点を示す。
【０１３９】
（Ｓ４４）決定木作成部１４０は、決定木の現在位置にＭＭＩＤをノードとして加え、対応するミューテーションオペレータをそのノードからのエッジとして追加する。なお、決定木が空のとき、現在位置は決定木の起点となる。その場合、ステップＳ４４において、今回のテストケースに対して最初に（決定木の起点に）追加されたノードが根ノードとなる。それ以降は、決定木の現在位置（エッジの先）に順次内部ノードが追加されることになる。
【０１４０】
図２３は、決定木葉ノード追加処理例を示すフローチャートである。以下、図２３に示す処理をステップ番号に沿って説明する。以下に示す処理は、図２０のステップＳ２０に相当する。
【０１４１】
（Ｓ５１）決定木作成部１４０は、テスト結果テーブル１１９に実行結果を記録する。テスト結果テーブル１１９で例示したように、実行結果は、ミュータントＩＤ、テストＩＤ（テストケースのＩＤ）、テスト合否（ＰａｓｓまたはＦａｉｌ）の組合せにより表される。ただし、決定木作成部１４０は、今回の葉ノード追加に対して何れのミューテーションも行われていない場合（ミュータントではなく元のプログラムの実行の場合）にはテスト合否をテスト結果テーブル１１９に記録しなくてもよい。
【０１４２】
（Ｓ５２）決定木作成部１４０は、現在の実行状態のミューテーション記述子をＭとして、決定木の現在位置特定処理（Ｍ）を実行する。決定木の現在位置特定処理の詳細は、後述される。
【０１４３】
（Ｓ５３）決定木作成部１４０は、テスト合否（ＰａｓｓまたはＦａｉｌ）を表す葉ノードを決定木の現在位置に追加する。
（Ｓ５４）決定木作成部１４０は、実行状態集合１１７から現在の実行状態を削除する。
【０１４４】
図２４は、決定木の現在位置特定処理例を示すフローチャートである。以下、図２４に示す処理をステップ番号に沿って説明する。以下に示す処理は、図２２のステップＳ４３および図２３のステップＳ５２に相当する（ただし、後述の結果レポート出力時にも用いられる）。
【０１４５】
（Ｓ６１）決定木作成部１４０は、現在のテストケースに対応する決定木（着目する決定木）の根ノードを選択する。
（Ｓ６２）決定木作成部１４０は、現在選択されているノードのＭＭＩＤが入力のミューテーション記述子Ｍに含まれているか否かを判定する。含まれている場合、処理をステップＳ６３に進める。含まれていない場合、処理をステップＳ６５に進める。
【０１４６】
（Ｓ６３）決定木作成部１４０は、ミューテーション記述子Ｍから、現在選択されているノードのＭＭＩＤに対応するミューテーションオペレータを取得する。
（Ｓ６４）決定木作成部１４０は、取得したミューテーションオペレータに対応するエッジを選択する。そして、決定木作成部１４０は、処理をステップＳ６６に進める。
【０１４７】
（Ｓ６５）決定木作成部１４０は、“ｎｏｐ”に対応するエッジを選択する。
（Ｓ６６）決定木作成部１４０は、ステップＳ６４またはステップＳ６５で選択したエッジについて、当該エッジの先にノードが存在しない、または、当該エッジの先のノードが葉ノードであるか否かを判定する。該当のエッジの先にノードが存在しない、または、該当のエッジの先のノードが葉ノードである場合、処理をステップＳ６８に進める。該当のエッジの先に葉ノード以外のノードが存在する場合、処理をステップＳ６７に進める。
【０１４８】
（Ｓ６７）決定木作成部１４０は、該当のエッジの先のノードを選択する。そして、決定木作成部１４０は、処理をステップＳ６２に進める。
（Ｓ６８）決定木作成部１４０は、該当のエッジの先を現在位置とする。
【０１４９】
こうして、決定木作成部１４０は、各テストケースに対する決定木Ｔ１０，Ｔ２０，Ｔ３０を作成する。
図２５は、決定木マージ処理例を示すフローチャートである。以下、図２５に示す処理をステップ番号に沿って説明する。以下に示す処理は、図１９のステップＳ４に相当する。ここで、決定木マージ処理の入力は、（Ｔ1，Ｔ2，ｎ）である。Ｔ1は、１つ目の決定木（あるいは決定木内の部分木）を表す。Ｔ2は、２つ目の決定木（あるいは決定木内の部分木）を表す。部分木が葉ノードのみをもつ場合、Ｔ1，Ｔ2が葉ノードを表すこともある。ｎは、ＭＭＩＤである。本例ではｎの初期値は１である。本決定木マージ処理は、以下に示すステップＳ７９，Ｓ８４において再帰的に呼び出されて実行される。
【０１５０】
（Ｓ７１）決定木マージ部１５０は、出力する決定木Ｔｏｕｔを用意する。決定木Ｔｏｕｔの初期値は空である。
（Ｓ７２）決定木マージ部１５０は、Ｔ1またはＴ2がＦａｉｌの葉ノードであるか否かを判定する。Ｔ1またはＴ2がＦａｉｌの葉ノードである場合、処理をステップＳ７３に進める。Ｔ1およびＴ2の何れもＦａｉｌの葉ノードでない場合、処理をステップＳ７４に進める。
【０１５１】
（Ｓ７３）決定木マージ部１５０は、ＴｏｕｔをＦａｉｌの葉ノードとする。そして、決定木マージ部１５０は、処理をステップＳ８６に進める。
（Ｓ７４）決定木マージ部１５０は、Ｔ1がＰａｓｓの葉ノードであるか否かを判定する。Ｔ1がＰａｓｓの葉ノードである場合、処理をステップＳ７５に進める。Ｔ1がＰａｓｓの葉ノードでない場合、処理をステップＳ７６に進める。
【０１５２】
（Ｓ７５）決定木マージ部１５０は、Ｔｏｕｔ＝Ｔ2とする。そして、決定木マージ部１５０は、処理をステップＳ８６に進める。
（Ｓ７６）決定木マージ部１５０は、Ｔ2がＰａｓｓの葉ノードであるか否かを判定する。Ｔ2がＰａｓｓの葉ノードである場合、処理をステップＳ７７に進める。Ｔ2がＰａｓｓの葉ノードでない場合、処理をステップＳ７８に進める。
【０１５３】
（Ｓ７７）決定木マージ部１５０は、Ｔｏｕｔ＝Ｔ1とする。そして、決定木マージ部１５０は、処理をステップＳ８６に進める。
（Ｓ７８）決定木マージ部１５０は、Ｔ1，Ｔ2ともにＮｎが存在しないか否かを判定する。ここで、Ｎｎは、ＭＭＩＤがｎのノードを示す（ノードＮｎと表記することもある）。Ｔ1，Ｔ2ともにＮｎが存在しない場合、処理をステップＳ７９に進める。Ｔ1，Ｔ2の両方または何れか一方にＮｎが存在する場合、処理をステップＳ８０に進める。
【０１５４】
（Ｓ７９）決定木マージ部１５０は、Ｔｏｕｔ＝決定木マージ処理（Ｔ1，Ｔ2，ｎ＋１）とする。すなわち、決定木マージ部１５０は、ｎに１を加算して、決定木マージ処理を実行し、その結果をＴｏｕｔとする。そして、決定木マージ部１５０は、処理をステップＳ８６に進める。
【０１５５】
（Ｓ８０）決定木マージ部１５０は、ＴｏｕｔにノードＮｎを追加する。
（Ｓ８１）決定木マージ部１５０は、ＭＭＩＤがｎのときのミューテーションオペレータ（ｎｏｐを含む）をｍとし、各ｍについてステップＳ８５までの処理を繰り返し実行する。
【０１５６】
（Ｓ８２）決定木マージ部１５０は、Ｔ1｜[n,m]を取得する。Ｔ1｜[n,m]は、Ｔ1内のＮｎ（を根とした部分木）をＴ1内のｅn,mの先の部分木に置き換えた木である。ここで、ｅn,mは、ノードＮｎから出ているミューテーションオペレータｍのエッジを示す。なお、Ｔ1内にＮｎがない場合、Ｔ1｜[n,m]＝Ｔ1とする。
【０１５７】
（Ｓ８３）決定木マージ部１５０は、Ｔ2｜[n,m]を取得する。Ｔ2｜[n,m]は、Ｔ2内のＮｎ（を根とした部分木）をＴ2内のｅn,mの先の部分木に置き換えた木である。なお、Ｔ2内にＮｎがない場合、Ｔ2｜[n,m]＝Ｔ2とする。
【０１５８】
（Ｓ８４）決定木マージ部１５０は、Ｔｏｕｔ内のｅn,mの先に対し決定木マージ処理（Ｔ1｜[n,m]，Ｔ2｜[n,m]，ｎ＋１）の出力を加える。
（Ｓ８５）決定木マージ部１５０は、ＭＭＩＤ＝ｎに対する全てのｍについてステップＳ８１以降の処理を終えると、処理をステップＳ８６に進める。
【０１５９】
（Ｓ８６）決定木マージ部１５０は、Ｔｏｕｔを出力する。
このように、決定木マージ部１５０は、決定木マージ処理を再帰的に実行することで、２つの決定木をマージする。３つの決定木Ｔ１０，Ｔ２０，Ｔ３０をマージする場合、決定木マージ部１５０は、まず、決定木マージ処理の手順により、２つの決定木（例えば、決定木Ｔ２０，Ｔ３０）をマージする。次に、決定木マージ部１５０は、当該マージ結果として得られた決定木と、残りの１つの決定木（例えば、決定木Ｔ１０）とを、上記の決定木マージ処理の手順によりマージする。こうして、決定木マージ部１５０は、３つの決定木Ｔ１０，Ｔ２０，Ｔ３０のマージ結果である決定木Ｔ４０を得る。４以上の決定木をマージする場合も同様である。例えば、４つの決定木をマージする場合、３つの決定木のマージ結果である決定木Ｔ４０および残りの１つの決定木に対して決定木マージ処理を行えばよい。
【０１６０】
図２６は、結果レポート出力処理例を示すフローチャートである。以下、図２６に示す処理をステップ番号に沿って説明する。以下に示す処理は、図１９のステップＳ５に相当する。
【０１６１】
（Ｓ９１）結果出力部１６０は、テスト結果テーブル１１９において、何れかのテストケースによる実行結果がＦａｉｌを含むミュータントのミュータント生存結果をＫｉｌｌｅｄとする。
【０１６２】
（Ｓ９２）結果出力部１６０は、ミュータント生存結果が未確定のミュータントのミューテーション記述子をＭとして、ステップＳ９７までの処理を繰り返し実行する。
（Ｓ９３）結果出力部１６０は、決定木Ｔ４０に対する決定木の現在位置特定処理（Ｍ）により葉ノードを特定する。具体的には、結果出力部１６０は、決定木Ｔ４０に対する決定木の現在位置特定処理（Ｍ）を、決定木作成部１４０により実行させ、その結果を得る（当該処理により葉ノードが特定されることになる）。決定木の現在位置特定処理の手順は、図２４で例示した手順と同様である。なお、結果出力部１６０が、決定木の現在位置特定処理を行ってもよい。
【０１６３】
（Ｓ９４）結果出力部１６０は、決定木Ｔ４０の現在位置の先の葉ノードがＦａｉｌの葉ノードであるか否かを判定する。Ｆａｉｌの葉ノードである場合、処理をステップＳ９５に進める。Ｆａｉｌの葉ノードでない場合（すなわち、Ｐａｓｓの葉ノードである場合）、処理をステップＳ９６に進める。
【０１６４】
（Ｓ９５）結果出力部１６０は、ミューテーション記述子Ｍに対応するミュータントのミュータント生存結果をＫｉｌｌｅｄと決定し、テスト結果テーブル１１９の該当箇所にＫｉｌｌｅｄを記録する。決定木Ｔ４０でＦａｉｌに辿り着いたということは、ミューテーション記述子Ｍに対応するミュータントに対し、３つのテストケースのうちの少なくとも１つでＦａｉｌになることを示すからである。そして、処理をステップＳ９７に進める。
【０１６５】
（Ｓ９６）結果出力部１６０は、ミューテーション記述子Ｍに対応するミュータントのミュータント生存結果をＵｎｋｉｌｌｅｄと決定し、テスト結果テーブル１１９の該当箇所にＵｎｋｉｌｌｅｄを記録する。決定木Ｔ４０でＰａｓｓに辿り着いたということは、ミューテーション記述子Ｍに対応するミュータントに対し、３つのテストケースの全てでＰａｓｓになることを示すからである。
【０１６６】
（Ｓ９７）結果出力部１６０は、全てのＭについてステップＳ９２以降の処理を終えると、処理をステップＳ９８に進める。
（Ｓ９８）結果出力部１６０は、テスト結果テーブル１１９におけるミュータント生存結果に基づいて、ミューテーションスコア（ＭＳ）を算出する。ミューテーションスコアは、全ミュータント数に対するＫｉｌｌｅｄの数の割合である。
【０１６７】
（Ｓ９９）結果出力部１６０は、記憶部１１０に記憶されたメタミューテーション情報１１５を用いて、ミュータントの位置情報を復元する。
（Ｓ１００）結果出力部１６０は、ミューテーションスコア（ＭＳ）とＵｎｋｉｌｌｅｄミュータントとを結果レポートとして出力する。例えば、結果出力部１６０は、ディスプレイ１１により、結果レポートを表示させる。また、ユーザによりＵｎｋｉｌｌｅｄミュータントが選択されると、当該ミュータントに対応するソースコードの該当箇所をディスプレイ１１により表示させる。
【０１６８】
このように、結果出力部１６０は、テストの実行により取得された第１のテスト結果および決定木Ｔ１０，Ｔ２０，Ｔ３０に基づいて決定された第２のテスト結果に応じて、結果レポートを出力する。前述のように、結果レポートは、複数のミュータント（ミューテーション箇所の複数の組合せ）のうち、複数のテストケースにより検出可能なミュータントに関する情報（例えば、ミューテーションスコア（ＭＳ））を含んでもよい。また、結果レポートは、複数のテストケースにより検出不可能なミュータントに関する情報（例えば、Ｕｎｋｉｌｌｅｄミュータントのリストやソースコードの該当箇所の情報）を含んでもよい。
【０１６９】
次に、解析装置１００の上記手順による処理の具体例を説明する。まず、図２０の手順による決定木Ｔ１０の作成方法を具体的に説明する。
図２７は、決定木の作成例（その１）を示す図である。以下では、テストＩＤ“Ｔｅｓｔ１”に対応する第１のテストケース（ｔｅｓｔｃａｓｅ１）を想定する。テストプログラム１１３によれば、第１のテストケースでは、ｆｕｎｃ（０）＝＝０を確認する。図２７以降の決定木の作成例では、中間コード１１６による処理内容が分かり易いようにソースコード１１１も図示する。中間コード１１６における参照中の命令、および、当該命令に対応するソースコード１１１の該当箇所を四角形で囲って示す。
【０１７０】
まず、決定木作成部１４０は、初期実行状態（実行状態ＩＤ“１”の実行状態）を選択した上で、中間コード１１６における命令ＩＤ“３”の命令に到達する。命令ＩＤ“３”の命令は、メタ関数ｂｏｐ＿ｌｔを含む。当該メタ関数ｂｏｐ＿ｌｔの第１引数で示されるＭＭＩＤ＝１は、実行状態ＩＤ“１”の実行状態に未記録のＭＭＩＤである。そこで、決定木作成部１４０は、この段階における実行状態ＩＤ“１”の実行状態を複製して、実行状態ＩＤ“２”の実行状態（この段階では命令ＩＤ＝３）を実行状態集合１１７に追加する。図中では、実行状態ＩＤ“Ｘ”の実行状態を“ＳｔａｔｅＸ”のように表す。なお、実行状態ＩＤ“１”の実行状態におけるミューテーション記述子は“ｎｏｐ”（変更しないことを示す）である。実行状態ＩＤ“２”の実行状態におけるミューテーション記述子は（１，＞＝）である。
【０１７１】
また、決定木作成部１４０は、根ノードとしてＭＭＩＤ＝１のノードｍ１を決定木Ｔ１０に追加する。決定木作成部１４０は、“ｎｏｐ”に対応するエッジおよび“＞＝”に対応するエッジをノードｍ１に追加する。
【０１７２】
決定木作成部１４０は、ノードｍ１の“ｎｏｐ”に対応するエッジを選択し、当該エッジの先を現在位置とする。この場合、決定木作成部１４０は、命令ＩＤ“３”の命令を元の演算“＜”のまま実行する。
【０１７３】
図２８は、決定木の作成例（その２）を示す図である。決定木作成部１４０は、中間コード１１６の実行を継続し、命令ＩＤ“１１”の命令に到達する。命令ＩＤ“１１”の命令は、メタ関数ｂｏｐ＿ｇｔを含む。当該メタ関数ｂｏｐ＿ｇｔの第１引数で示されるＭＭＩＤ＝３は、実行状態ＩＤ“１”の実行状態に未記録のＭＭＩＤである。そこで、決定木作成部１４０は、この段階における実行状態ＩＤ“１”の実行状態を複製して、実行状態ＩＤ“３”の実行状態（この段階では命令ＩＤ＝１１）を実行状態集合１１７に追加する。実行状態ＩＤ“３”の実行状態におけるミューテーション記述子は（３，＜＝）である。
【０１７４】
また、決定木作成部１４０は、ノードｍ１の“ｎｏｐ”に対応するエッジの先に、ＭＭＩＤ＝３のノードｍ３を追加する。決定木作成部１４０は、“ｎｏｐ”に対応するエッジおよび“＜＝”に対応するエッジをノードｍ３に追加する。
【０１７５】
決定木作成部１４０は、ノードｍ３の“ｎｏｐ”に対応するエッジを選択し、当該エッジの先を現在位置とする。この場合、決定木作成部１４０は、命令ＩＤ“１１”の命令を元の演算“＞”のまま実行する。
【０１７６】
図２９は、決定木の作成例（その３）を示す図である。決定木作成部１４０は、中間コード１１６の実行を継続し、実行状態ＩＤ“１”の実行状態において％１３＝０となり、ｆｕｎｃ（０）＝＝０が成立することを確認する。このため、決定木作成部１４０は、ノードｍ３の“ｎｏｐ”に対応するエッジの先にＰａｓｓの葉ノードを追加する。そして、決定木作成部１４０は、実行状態集合１１７から、実行状態ＩＤ“１”の実行状態を削除する。
【０１７７】
次に、決定木作成部１４０は、実行状態集合１１７に登録された実行状態のうち、実行状態ＩＤ“３”の実行状態を選択する。ここで、決定木作成部１４０は、ＳＳＥの手法を用いている。決定木作成部１４０による実行状態の選択順は、深さ優先探索のアルゴリズムに基づく（実行状態ＩＤを昇順に付与していくので、実行状態ＩＤの大きいものから選択する）。ただし、別のアルゴリズムを用いて、次の実行状態を選択してもよい。
【０１７８】
決定木作成部１４０は、実行状態ＩＤ“３”の情報を参照して、中間コード１１６における命令ＩＤ“１１”の命令に戻り、ミューテーション記述子（３，＜＝）に対応するエッジを選択し、当該エッジの先を現在位置とする。この場合、決定木作成部１４０は、命令ＩＤ“１１”の命令を“＜＝”の演算に変更して実行する。
【０１７９】
図３０は、決定木の作成例（その４）を示す図である。決定木作成部１４０は、中間コード１１６の実行を継続し、命令ＩＤ“１５”の命令に到達する。命令ＩＤ“１５”の命令は、メタ関数ｂｏｐ＿ｍｕｌを含む。当該メタ関数ｂｏｐ＿ｍｕｌの第１引数で示されるＭＭＩＤ＝４は、実行状態ＩＤ“３”の実行状態に未記録のＭＭＩＤである。
【０１８０】
そこで、決定木作成部１４０は、この段階における実行状態ＩＤ“３”の実行状態を複製して、実行状態ＩＤ“４”の実行状態（この段階では命令ＩＤ＝１５）を実行状態集合１１７に追加する。実行状態ＩＤ“４”の実行状態におけるミューテーション記述子は、｛（３，＜＝），（４，／）｝である。
【０１８１】
更に、決定木作成部１４０は、この段階における実行状態ＩＤ“３”の実行状態を複製して、実行状態ＩＤ“５”の実行状態（この段階では命令ＩＤ＝１５）を実行状態集合１１７に追加する。実行状態ＩＤ“５”の実行状態におけるミューテーション記述子は、｛（３，＜＝），（４，％）｝である。
【０１８２】
また、決定木作成部１４０は、ノードｍ３の“＜＝”に対応するエッジの先に、ＭＭＩＤ＝４のノードｍ４を追加する。決定木作成部１４０は、“ｎｏｐ”に対応するエッジ、“／”に対応するエッジ、および、“％”に対応するエッジをノードｍ４に追加する。
【０１８３】
決定木作成部１４０は、ノードｍ４の“ｎｏｐ”に対応するエッジを選択し、当該エッジの先を現在位置とする。この場合、決定木作成部１４０は、命令ＩＤ“１５”の命令を元の演算“＊”のまま実行する。
【０１８４】
図３１は、決定木の作成例（その５）を示す図である。決定木作成部１４０は、中間コード１１６の実行を継続し、実行状態ＩＤ“３”の実行状態において、％１３＝０となり、ｆｕｎｃ（０）＝＝０が成立することを確認する。決定木作成部１４０は、テスト結果テーブル１１９のミュータントＩＤ“Ｍ3”およびテストＩＤ“Ｔｅｓｔ１”に対して、“Ｐａｓｓｅｄ”を記録する。決定木作成部１４０は、ノードｍ４の“ｎｏｐ”に対応するエッジの先にＰａｓｓの葉ノードを追加する。そして、決定木作成部１４０は、実行状態集合１１７から、実行状態ＩＤ“３”の実行状態を削除する。
【０１８５】
次に、決定木作成部１４０は、実行状態集合１１７に登録された実行状態のうち、実行状態ＩＤ“５”の実行状態を選択する。
決定木作成部１４０は、実行状態ＩＤ“５”の情報を参照して、中間コード１１６における命令ＩＤ“１５”の命令に戻り、ミューテーション記述子（４，％）に対応するエッジを選択し、当該エッジの先を現在位置とする。この場合、決定木作成部１４０は、命令ＩＤ“１５”の命令を“％”の演算に変更して実行する。
【０１８６】
図３２は、決定木の作成例（その６）を示す図である。決定木作成部１４０は、中間コード１１６の実行を継続し、実行状態ＩＤ“５”の実行状態において、％１３＝０となり、ｆｕｎｃ（０）＝＝０が成立することを確認する。決定木作成部１４０は、テスト結果テーブル１１９のミュータントＩＤ“Ｍ3,5”およびテストＩＤ“Ｔｅｓｔ１”に対して、“Ｐａｓｓｅｄ”を記録する。決定木作成部１４０は、ノードｍ４の“％”に対応するエッジの先にＰａｓｓの葉ノードを追加する。そして、決定木作成部１４０は、実行状態集合１１７から実行状態ＩＤ“５”の実行状態を削除する。
【０１８７】
次に、決定木作成部１４０は、実行状態集合１１７に登録された実行状態のうち、実行状態ＩＤ“４”の実行状態を選択する。
決定木作成部１４０は、実行状態ＩＤ“４”の情報を参照して、中間コード１１６における命令ＩＤ“１５”の命令に戻り、ミューテーション記述子（４，／）に対応するエッジを選択し、当該エッジの先を現在位置とする。この場合、決定木作成部１４０は、命令ＩＤ“１５”の命令を“／”の演算に変更して実行する。
【０１８８】
図３３は、決定木の作成例（その７）を示す図である。決定木作成部１４０は、中間コード１１６の実行を継続し、実行状態ＩＤ“４”の実行状態において、％１３＝０となり、ｆｕｎｃ（０）＝＝０が成立することを確認する。決定木作成部１４０は、テスト結果テーブル１１９のミュータントＩＤ“Ｍ3,4”およびテストＩＤ“Ｔｅｓｔ１”に対して、“Ｐａｓｓｅｄ”を記録する。決定木作成部１４０は、ノードｍ４の“／”に対応するエッジの先にＰａｓｓの葉ノードを追加する。そして、決定木作成部１４０は、実行状態集合１１７から実行状態ＩＤ“４”の実行状態を削除する。
【０１８９】
次に、決定木作成部１４０は、実行状態集合１１７に登録された実行状態ＩＤ“２”の実行状態を選択する。
決定木作成部１４０は、実行状態ＩＤ“２”の情報を参照して、中間コード１１６における命令ＩＤ“３”の命令に戻り、ミューテーション記述子（１，＞＝）に対応するエッジを選択し、当該エッジの先を現在位置とする。この場合、決定木作成部１４０は、命令ＩＤ“３”の命令を“＞＝”の演算に変更して実行する。
【０１９０】
図３４は、決定木の作成例（その８）を示す図である。決定木作成部１４０は、中間コード１１６の実行を継続し、命令ＩＤ“７”の命令に到達する。命令ＩＤ“７”の命令は、メタ関数ｂｏｐ＿ａｄｄを含む。当該メタ関数ｂｏｐ＿ａｄｄの第１引数で示されるＭＭＩＤ＝２は、実行状態ＩＤ“２”の実行状態に未記録のＭＭＩＤである。そこで、決定木作成部１４０は、この段階における実行状態ＩＤ“２”の実行状態を複製して、実行状態ＩＤ“６”の実行状態（この段階では命令ＩＤ＝７）を実行状態集合１１７に追加する。実行状態ＩＤ“６”の実行状態におけるミューテーション記述子は、｛（１，＞＝），（２，−）｝である。
【０１９１】
また、決定木作成部１４０は、ノードｍ１の“＞＝”に対応するエッジの先に、ＭＭＩＤ＝２のノードｍ２を追加する。決定木作成部１４０は、“ｎｏｐ”に対応するエッジおよび“−”に対応するエッジをノードｍ２に追加する。
【０１９２】
決定木作成部１４０は、ノードｍ２の“ｎｏｐ”に対応するエッジを選択し、当該エッジの先を現在位置とする。この場合、決定木作成部１４０は、命令ＩＤ“７”の命令を元の演算“＋”のまま実行する。
【０１９３】
図３５は、決定木の作成例（その９）を示す図である。決定木作成部１４０は、中間コード１１６の実行を継続し、実行状態ＩＤ“２”の実行状態において、％１３＝１となり、ｆｕｎｃ（０）＝＝０が成立しないことを確認する。決定木作成部１４０は、テスト結果テーブル１１９のミュータントＩＤ“Ｍ1”およびテストＩＤ“Ｔｅｓｔ１”に対して、“Ｆａｉｌｅｄ”を記録する。決定木作成部１４０は、ノードｍ２の“ｎｏｐ”に対応するエッジの先にＦａｉｌの葉ノードを追加する。そして、決定木作成部１４０は、実行状態集合１１７から、実行状態ＩＤ“２”の実行状態を削除する。
【０１９４】
次に、決定木作成部１４０は、実行状態集合１１７に登録された実行状態ＩＤ“６”の実行状態を選択する。
決定木作成部１４０は、実行状態ＩＤ“６”の情報を参照して、中間コード１１６における命令ＩＤ“７”の命令に戻り、ミューテーション記述子（２，−）に対応するエッジを選択し、当該エッジの先を現在位置とする。この場合、決定木作成部１４０は、命令ＩＤ“７”の命令を“−”の演算に変更して実行する。
【０１９５】
図３６は、決定木の作成例（その１０）を示す図である。決定木作成部１４０は、中間コード１１６の実行を継続し、実行状態ＩＤ“６”の実行状態において、％１３＝−１となり、ｆｕｎｃ（０）＝＝０が成立しないことを確認する。決定木作成部１４０は、テスト結果テーブル１１９のミュータントＩＤ“Ｍ1,2”およびテストＩＤ“Ｔｅｓｔ１”に対して、“Ｆａｉｌｅｄ”を記録する。決定木作成部１４０は、ノードｍ２の“−”に対応するエッジの先にＦａｉｌの葉ノードを追加する。そして、決定木作成部１４０は、実行状態集合１１７から、実行状態ＩＤ“６”の実行状態を削除する。
【０１９６】
この段階で、実行状態集合１１７に登録された実行状態がなくなる。このため、決定木作成部１４０は、テストＩＤ“Ｔｅｓｔ１”のテストケースの実行を完了する。また、決定木作成部１４０は、決定木Ｔ１０の作成を完了する。決定木作成部１４０は、次のテストＩＤ“Ｔｅｓｔ２”のテストケースを選択する。決定木作成部１４０は、他のテストケースについても同様にして、決定木Ｔ２０，Ｔ３０を作成する。
【０１９７】
次に、２つの決定木のマージ例を説明する。以下では、決定木Ｔ２０，Ｔ３０をマージする場合を例示する。
図３７は、決定木のマージ例（その１）を示す図である。図３７（Ａ）は、決定木作成部１４０により作成された決定木Ｔ２０（Ｔｅｓｔ２（ｍ１，ｍ２，ｍ３，ｍ４））を示す。図３７（Ｂ）は、決定木作成部１４０により作成された決定木Ｔ３０（Ｔｅｓｔ３（ｍ１，ｍ２，ｍ３，ｍ４））を示す。決定木作成部１４０は、決定木Ｔｏｕｔ（１）を用意する。ここで、決定木マージ処理の再帰的な実行により登場するＴｏｕｔを、Ｔｏｕｔ（１）、Ｔｏｕｔ（２）、・・・のように表記して区別する。決定木Ｔｏｕｔ（１）は、この段階では空である。
【０１９８】
まず、決定木マージ処理の入力は、（Ｔ1，Ｔ2，ｎ）＝（Ｔｅｓｔ２（ｍ１，ｍ２，ｍ３，ｍ４），Ｔｅｓｔ３（ｍ１，ｍ２，ｍ３，ｍ４），１）である。Ｔ1＝Ｔｅｓｔ２（ｍ１，ｍ２，ｍ３，ｍ４）およびＴ2＝Ｔｅｓｔ３（ｍ１，ｍ２，ｍ３，ｍ４）は、何れも、Ｆａｉｌの葉ノードのみの木ではない（ステップＳ７２  Ｎｏ）。また、Ｔ1＝Ｔｅｓｔ２（ｍ１，ｍ２，ｍ３，ｍ４）およびＴ2＝Ｔｅｓｔ３（ｍ１，ｍ２，ｍ３，ｍ４）は、何れも、Ｐａｓｓの葉ノードのみの木ではない（ステップＳ７４  ＮｏかつステップＳ７６  Ｎｏ）。更に、Ｔ1＝Ｔｅｓｔ２（ｍ１，ｍ２，ｍ３，ｍ４）およびＴ2＝Ｔｅｓｔ３（ｍ１，ｍ２，ｍ３，ｍ４）には、Ｎ１に相当するノードｍ１が存在する（ステップＳ７８  Ｎｏ）。
【０１９９】
よって、決定木マージ部１５０は、Ｔｏｕｔ（１）にノードｍ１を追加する（ステップＳ８０）。
図３８は、決定木のマージ例（その２）を示す図である。ノードｍ１におけるミューテーションオペレータは、“＞＝”および“ｎｏｐ”である。そこで、決定木マージ部１５０は、これら２つのミューテーションオペレータに対して、ステップＳ８１〜Ｓ８５を実行する。まず、“＞＝”について考える。
【０２００】
この場合、Ｔ1｜[1,>=]＝Ｔｅｓｔ２｜[1,>=]（ｍ２，ｍ３，ｍ４）は、決定木Ｔ２０のノードｍ１の“＞＝”に対応するエッジの先の部分木Ｔ２１である（ステップＳ８２）。
【０２０１】
また、Ｔ2｜[1,>=]＝Ｔｅｓｔ３｜[1,>=]（ｍ２，ｍ３，ｍ４）は、決定木Ｔ３０のノードｍ１の“＞＝”に対応するエッジの先の部分木Ｔ３１である（ステップＳ８３）。
決定木マージ部１５０は、入力を（Ｔ1｜[1,>=]，Ｔ2｜[1,>=]，２）として、決定木マージ処理を実行する。決定木マージ部１５０は、決定木Ｔｏｕｔ（１）におけるノードｍ１の“＞＝”に対応するエッジ（ｅ1,>=）の先に、決定木マージ処理（Ｔ1｜[1,>=]，Ｔ2｜[1,>=]，２）の出力Ｔｏｕｔ（２）を追加する（ステップＳ８４）。
【０２０２】
次に、“ｎｏｐ”について考える。
この場合、Ｔ1｜[1,nop]＝Ｔｅｓｔ２｜[1,nop]（ｍ２，ｍ３，ｍ４）は、決定木Ｔ２０のノードｍ１の“ｎｏｐ”に対応するエッジの先の部分木Ｔ２２である（ステップＳ８２）。
【０２０３】
また、Ｔ2｜[1,nop]＝Ｔｅｓｔ３｜[1,nop]（ｍ２，ｍ３，ｍ４）は、決定木Ｔ３０のノードｍ１の“ｎｏｐ”に対応するエッジの先の部分木Ｔ３２である（ステップＳ８３）。
【０２０４】
決定木マージ部１５０は、入力を（Ｔ1｜[1,nop]，Ｔ2｜[1,nop]，２）として、決定木マージ処理を実行し、その出力を、決定木Ｔｏｕｔ（１）におけるノードｍ１の“ｎｏｐ”に対応するエッジ（ｅ1,nop）の先に追加する（ステップＳ８４）。
【０２０５】
次に、前述の部分木Ｔ２１，Ｔ３１のマージ例（決定木マージ処理（Ｔ1｜[1,>=]，Ｔ2｜[1,>=]，２））を説明する。
決定木作成部１４０は、決定木Ｔｏｕｔ（２）を用意する。決定木Ｔｏｕｔ（２）は、この段階では空である。
【０２０６】
Ｔ1｜[1,>=]およびＴ2｜[1,>=]は、何れも、Ｆａｉｌの葉ノードのみの木ではない（ステップＳ７２  Ｎｏ）。また、Ｔ1｜[1,>=]およびＴ2｜[1,>=]は、何れも、Ｐａｓｓの葉ノードのみの木ではない（ステップＳ７４  ＮｏかつステップＳ７６  Ｎｏ）。更に、Ｔ1｜[1,>=]には、Ｎ２に相当するノードｍ２が存在する（ステップＳ７８  Ｎｏ）。
【０２０７】
よって、決定木マージ部１５０は、決定木Ｔｏｕｔ（２）にノードｍ２を追加する（ステップＳ８０）。
図３９は、決定木のマージ例（その３）を示す図である。ノードｍ２におけるミューテーションオペレータは、“−”および“ｎｏｐ”である。そこで、決定木マージ部１５０は、これら２つのミューテーションオペレータに対して、ステップＳ８１〜Ｓ８５を実行する。まず、“−”について考える。
【０２０８】
この場合、Ｔ1｜[1,>=],[2,-]＝Ｔｅｓｔ２｜[1,>=],[2,-]（ｍ３，ｍ４）は、部分木Ｔ２１のノードｍ２の“−”に対応するエッジの先の部分木Ｔ２１ａである（ステップＳ８２）。部分木Ｔ２１ａは、Ｆａｉｌの葉ノードのみを要素にもつ。
【０２０９】
また、部分木Ｔ３１は、ノードｍ２をもたない。このため、Ｔ2｜[1,>=],[2,-]＝Ｔｅｓｔ３｜[1,>=],[2,-]（ｍ３，ｍ４）は、部分木Ｔ３１と同じ構造をもつ部分木Ｔ３１ａである（ステップＳ８３）。
【０２１０】
決定木マージ部１５０は、入力を（Ｔ1｜[1,>=],[2,-]，Ｔ2｜[1,>=],[2,-]，３）として、決定木マージ処理を実行する。決定木マージ部１５０は、決定木Ｔｏｕｔ（２）におけるノードｍ２の“−”に対応するエッジ（ｅ2,-）の先に、決定木マージ処理（Ｔ1｜[1,>=],[2,-]，Ｔ2｜[1,>=],[2,-]，３）の出力Ｔｏｕｔ（３）を追加する（ステップＳ８４）。
【０２１１】
この場合、Ｔ1｜[1,>=],[2,-]は、Ｆａｉｌの葉ノードのみをもつ部分木Ｔ２１ａを示すので、Ｔｏｕｔ（３）はＦａｉｌの葉ノードとなる（ステップＳ７２  Ｙｅｓ，Ｓ７３，Ｓ８６）。
【０２１２】
次に、“ｎｏｐ”について考える。
この場合、Ｔ1｜[1,>=],[2,nop]＝Ｔｅｓｔ２｜[1,>=],[2,nop]（ｍ３，ｍ４）は、部分木Ｔ２１のノードｍ２の“ｎｏｐ”に対応するエッジの先の部分木Ｔ２１ｂである（ステップＳ８２）。部分木Ｔ２１ｂは、Ｐａｓｓの葉ノードのみを要素にもつ。
【０２１３】
また、部分木Ｔ３１は、ノードｍ２をもたない。このため、Ｔ2｜[1,>=],[2,nop]＝Ｔｅｓｔ３｜[1,>=],[2,nop]（ｍ３，ｍ４）は、部分木Ｔ３１と同じ構造をもつ部分木Ｔ３１ｂである（ステップＳ８３）。
【０２１４】
決定木マージ部１５０は、入力を（Ｔ1｜[1,>=],[2,nop]，Ｔ2｜[1,>=],[2,nop]，３）として、決定木マージ処理を実行する。決定木マージ部１５０は、決定木Ｔｏｕｔ（２）におけるノードｍ２の“ｎｏｐ”に対応するエッジ（ｅ2,nop）の先に、決定木マージ処理（Ｔ1｜[1,>=],[2,nop]，Ｔ2｜[1,>=],[2,nop]，３）の出力Ｔｏｕｔ（４）を追加する（ステップＳ８４）。
【０２１５】
この場合、Ｔ1｜[1,>=],[2,nop]およびＴ2｜[1,>=],[2,nop]は、何れも、Ｆａｉｌの葉ノードのみの木ではない（ステップＳ７２  Ｎｏ）。
一方、Ｔ1｜[1,>=],[2,nop]は、Ｐａｓｓの葉ノードのみをもつ部分木Ｔ２１ｂを示すので、Ｔｏｕｔ（４）＝Ｔ2｜[1,>=],[2,nop]となる（ステップＳ７４  Ｙｅｓ，Ｓ７５，Ｓ８６）。
【０２１６】
図４０は、決定木のマージ例（その４）を示す図である。木Ｔ５１は、決定木Ｔ２０，Ｔ３０のマージ途中の木であり、図３９で例示したマージ処理の結果（決定木Ｔｏｕｔ（２））が決定木Ｔｏｕｔ（１）に追加された段階を示している。
【０２１７】
決定木マージ部１５０は、木Ｔ５１におけるノードｍ１の“ｎｏｐ”に対応するエッジの先も同様にしてマージ処理を実行し、決定木Ｔ２０，Ｔ３０をマージした決定木Ｔ５２を得る。決定木Ｔ５２は、Ｔｏｕｔ（１）の出力結果である。
【０２１８】
決定木マージ部１５０は、決定木Ｔ５２と決定木Ｔ１０とに対して決定木マージ処理を実行することで、決定木Ｔ４０を得る。
図４１は、決定木を辿る例（その１）を示す図である。結果出力部１６０は、テスト結果テーブル１１９に記録された各ミュータントに対するテストケースの実行結果（ＰａｓｓｅｄまたはＦａｉｌｅｄ）に基づいて、各ミュータントのミュータント生存結果を得る。ただし、結果出力部１６０は、テスト結果テーブル１１９において、実行結果“Ｆａｉｌｅｄ”が記録されていないミュータントについては、ミュータント生存結果を得ることができない。そこで、結果出力部１６０は、決定木Ｔ４０を辿ることで、ミュータント生存結果を得られていないミュータントに対するミュータント生存結果を決定する。
【０２１９】
例えば、図１３で例示したテスト結果テーブル１１９では、２次のミュータントＭ3,4について、テストＩＤ“Ｔｅｓｔ１”のテストケースに“Ｐａｓｓｅｄ”が記録されているのみであり、ミュータント生存結果が得られていない。
【０２２０】
そこで、結果出力部１６０は、ミュータントＭ3,4について、決定木Ｔ４０によりミュータント生存結果を決定する。コード１１１ａは、ミュータントＭ3,4に対応するコード例である。コード１１１ａでは、ソースコード１１１のＭＭＩＤ“３”に対応する箇所（４行目）の演算子“＞”が演算子“＜＝”に変更されている。コード１１１ａでは、ソースコード１１１のＭＭＩＤ“４”に対応する箇所（５行目）の演算子“＊”が演算子“／”に変更されている。
【０２２１】
まず、結果出力部１６０は、決定木Ｔ４０の根ノードであるノードｍ１を選択する。ミュータントＭ3,4は、ＭＭＩＤ“１”のミューテーションオペレータを含まない（すなわち、ＭＭＩＤ“１”に対するミューテーションオペレータは“ｎｏｐ”である）。このため、結果出力部１６０は、ノードｍ１の“ｎｏｐ”のエッジを辿り、ノードｍ２を選択する。
【０２２２】
ミュータントＭ3,4は、ＭＭＩＤ“２”のミューテーションオペレータを含まない（すなわち、ＭＭＩＤ“２”に対するミューテーションオペレータは“ｎｏｐ”である）。このため、結果出力部１６０は、ノードｍ２の“ｎｏｐ”のエッジを辿り、ノードｍ３を選択する。
【０２２３】
ミュータントＭ3,4のＭＭＩＤ“３”のミューテーションオペレータは、“＜＝”である。このため、結果出力部１６０は、ノードｍ３の“＜＝”のエッジを辿り、Ｆａｉｌの葉ノードに辿り着く。Ｆａｉｌの葉ノードに辿り着いたので、結果出力部１６０は、ミュータントＭ3,4がｋｉｌｌされると判断する。したがって、結果出力部１６０は、テスト結果テーブル１１９のミュータントＭ3,4に対して、ミュータント生存結果“Ｋｉｌｌｅｄ”を登録する。
【０２２４】
なお、テストＩＤ“Ｔｅｓｔ２”のテストケース（ｆｕｎｃ（１）＝＝２）に対し、コード１１１ａを実際に実行すると、ｆｕｎｃ（１）＝０なので、ミュータントＭ3,4に対する実行結果は“Ｆａｉｌ”である。また、テストＩＤ“Ｔｅｓｔ３”のテストケース（ｆｕｎｃ（−１）＝＝０）に対し、コード１１１ａを実際に実行すると、ｆｕｎｃ（−１）＝０なので、ミュータントＭ3,4に対する実行結果は“Ｐａｓｓ”である。テストＩＤ“Ｔｅｓｔ２”のテストケースで“Ｆａｉｌ”なので、決定木Ｔ４０を辿ることで得られたミュータント生存結果“Ｋｉｌｌｅｄ”は正しいテスト結果である。解析装置１００は、実際にテストＩＤ“Ｔｅｓｔ２”、“Ｔｅｓｔ３”のテストケースを実行せずに、ミュータントＭ3,4に対するテスト結果を得られたことになる。
【０２２５】
図４２は、決定木を辿る例（その２）を示す図である。次に、３次のミュータントＭ1,3,4を考える。図１３で例示したテスト結果テーブル１１９では、３次のミュータントＭ1,3,4について、テストＩＤ“Ｔｅｓｔ３”のテストケースに“Ｐａｓｓｅｄ”が記録されているのみであり、ミュータント生存結果が得られていない。
【０２２６】
そこで、結果出力部１６０は、ミュータントＭ1,3,4について、決定木Ｔ４０によりミュータント生存結果を決定する。コード１１１ｂは、ミュータントＭ1,3,4に対応するコード例である。コード１１１ｂでは、ソースコード１１１のＭＭＩＤ“１”に対応する箇所（２行目）の演算子“＜”が演算子“＞＝”に変更されている。また、コード１１１ｂでは、ソースコード１１１のＭＭＩＤ“３”に対応する箇所（４行目）の演算子“＞”が演算子“＜＝”に変更されている。更に、コード１１１ｂでは、ソースコード１１１のＭＭＩＤ“４”に対応する箇所（５行目）の演算子“＊”が演算子“／”に変更されている。
【０２２７】
まず、結果出力部１６０は、決定木Ｔ４０の根ノードであるノードｍ１を選択する。ミュータントＭ1,3,4のＭＭＩＤ“１”のミューテーションオペレータは、“＞＝”である。このため、結果出力部１６０は、ノードｍ２の“＞＝”のエッジを辿り、ノードｍ２を選択する。
【０２２８】
ミュータントＭ1,3,4は、ＭＭＩＤ“２”のミューテーションオペレータを含まない（すなわち、ＭＭＩＤ“２”に対してミューテーションオペレータは“ｎｏｐ”である）。このため、結果出力部１６０は、ノードｍ２の“ｎｏｐ”のエッジを辿り、Ｆａｉｌの葉ノードに辿り着く。Ｆａｉｌの葉ノードに辿り着いたので、結果出力部１６０は、テスト結果テーブル１１９のミュータントＭ1,3,4に対して、ミュータント生存結果“Ｋｉｌｌｅｄ”を登録する。
【０２２９】
なお、テストＩＤ“Ｔｅｓｔ１”のテストケース（ｆｕｎｃ（０）＝＝０）に対し、コード１１１ｂを実際に実行すると、ｆｕｎｃ（０）＝１なので、ミュータントＭ1,3,4に対する実行結果は“Ｆａｉｌ”である。また、テストＩＤ“Ｔｅｓｔ２”のテストケース（ｆｕｎｃ（１）＝＝２）に対し、コード１１１ｂを実際に実行すると、ｆｕｎｃ（１）＝２なので、ミュータントＭ1,3,4に対する実行結果は“Ｐａｓｓ”である。テストＩＤ“Ｔｅｓｔ１”のテストケースで“Ｆａｉｌ”なので、決定木Ｔ４０を辿ることで得られたミュータント生存結果“Ｋｉｌｌｅｄ”は正しいテスト結果である。解析装置１００は、実際にテストＩＤ“Ｔｅｓｔ１”、“Ｔｅｓｔ２”のテストケースを実行せずに、ミュータントＭ1,3,4に対するテスト結果を得られたことになる。
【０２３０】
図４３は、テスト結果の取得例を示す図である。結果出力部１６０は、こうして、決定木Ｔ４０を辿ることで、ミュータント生存結果を得られていないミュータントに対するミュータント生存結果を補完し、テスト結果テーブル１１９ａを得る。
【０２３１】
具体的には、ＳＳＥによるテスト実行では、図１３のテスト結果テーブル１１９で示したように、２１個のミュータントのうち、ミュータントＭ1，Ｍ2，Ｍ3，Ｍ4，Ｍ5，Ｍ1,2，Ｍ1,3，Ｍ1,3,5のミュータント生存結果を得られる。一方、残りの１３個のミュータントについては、ミュータント生存結果を得られない。
【０２３２】
そこで、結果出力部１６０は、各ミュータントについて決定木Ｔ４０を辿ることで、各ミュータントのミュータント生存結果を得る。これにより、結果出力部１６０は、前述のミュータントＭ3,4，Ｍ1,3,4を含むミュータント生存結果を得られていないミュータントに対し、ミュータント生存結果を得られる。このとき、結果出力部１６０は、全てのテストケースで試行されなかったミュータント（例えば、ミュータントＭ1,4，Ｍ1,2,3など）に対するミュータント生存結果も得ることができる。
【０２３３】
すなわち、解析装置１００は、一部のテストケースにより試行されるミュータント箇所（変更箇所）の組合せのうち、当該一部のテストケースの実行結果からはミュータント生存結果（テスト結果）を取得できない組合せに対して、効率的にテスト結果を得られる。また、解析装置１００は、現在用意されている複数のテストケースでは試行されないミュータント箇所の組合せに対しても、効率的にテスト結果を得られる。
【０２３４】
テスト結果テーブル１１９ａの例では、ユーザにより指定された３次以下のミュータントのミュータント生存結果が全て“Ｋｉｌｌｅｄ”である。このため、結果出力部１６０は、ミューテーションスコアＭＳ＝２１／２１＝１００％を出力する。したがって、現在のテストプログラム１１３により、３次以下のミュータントを全て検出できることが分かる。ミューテーションスコアＭＳが１００％未満であれば、ユーザは、例えば、ミュータントの検出率（ミューテーションスコア）を向上するように、テストプログラムの改善を図れる。
【０２３５】
図４４は、ＳＳＥでは実行されないミュータントの例を示す図である。ＳＳＥでは、前述のように、ソースコード１１１をコンパイルして得られた中間コード１１６に対して、命令の実行順に、実行状態を分岐させながらミューテーションを行う。このため、ユーザにより指定された次数のミュータントのうち、比較的高次のミュータントの実行が省略されることがある。
【０２３６】
ここで、図４４では、一例として、ミュータントＭ1に対応するコード１１１ｘ、ミュータントＭ3に対応するコード１１１ｙ、ミュータントＭ3,4に対応するコード１１１ａ、および、ミュータントＭ1,3,4に対応するコード１１１ｂを示す。コード１１１ｘは、ソースコード１１１のＭＭＩＤ“１”に対応する箇所（２行目）の演算子“＜”を演算子“＞＝”に変更したものである。コード１１１ｙは、ソースコード１１１のＭＭＩＤ“３”に対応する箇所（４行目）の演算子“＞”を演算子“＜＝”に変更したものである。
【０２３７】
この場合、テストＩＤ“Ｔｅｓｔ１”のテストケース（ｆｕｎｃ（０）＝＝０）に対し、ミュータントＭ1，Ｍ3，Ｍ3,4は実行されるが、ミュータントＭ1,3,4は実行されない。なぜなら、テストＩＤ“Ｔｅｓｔ１”のテストケースでは、ＭＭＩＤ＝１，３，４に対応する３つのミューテーション箇所に同時に到達しないからである。すなわち、ミュータントＭ1が実行される場合、ミュータントＭ3，Ｍ4に対応するミューテーション箇所が実行経路から外れるので、ミュータントＭ1に対して、ミュータントＭ3，Ｍ4に相当する変更内容が更に適用されることはない。また、ミュータントＭ3が実行される場合、ミュータントＭ1に対応するミューテーション箇所が実行経路から外れるので、ミュータントＭ3に対して、ミュータントＭ1に相当する変更内容が更に適用されることはない。このように、ＳＳＥでは実行されないミュータントが存在し得る。また、一部のテストケースで実行されるものの実行結果がＰａｓｓとなってミュータント生存結果を判断できないミュータントが存在し得る。
【０２３８】
ミュータントＭ3,4も、一部のテストケース（ここではテストＩＤ“Ｔｅｓｔ１”のテストケースのみ）では実行されるものの実行結果がＰａｓｓである。このため、解析装置１００は、現在のテストケースをＳＳＥで実行しただけではミュータントＭ3,4に対するミュータント生存結果を判断できない。
【０２３９】
図４５は、テスト結果取得の比較例を示す図である。テスト結果テーブル１１９の例では、計１３個のミュータントに対して、ミュータント生存結果を得られていない。これらのミュータントに対してミュータント生存結果を得るために、該当のミュータントに対して個別に、計１３回のコンパイルを行い、実行結果を得られていない各テストケースについて該当のミュータントのテスト実行を計３６回行うことも考えられる。しかし、このように、ミュータント毎にコンパイルおよびテスト実行を個別に行っていると、テストに時間がかかるという問題がある。
【０２４０】
そこで、解析装置１００は、テスト結果テーブル１１９を作成する過程で、決定木Ｔ１０，Ｔ２０，Ｔ３０を作成し、決定木Ｔ１０，Ｔ２０，Ｔ３０をマージした決定木Ｔ４０を作成する。解析装置１００は、決定木Ｔ４０を辿ることで、テスト結果テーブル１１９ではミュータント生存結果を得られていない１３個のミュータントに対するミュータント生存結果を決定する。これにより、解析装置１００は、マージ後の決定木Ｔ４０を計１３回辿ることで、ミュータント生存結果を得られることになる。
【０２４１】
解析装置１００の処理では決定木Ｔ１０，Ｔ２０，Ｔ３０の生成、および、マージといった処理コストが生じる。しかし、各ミュータントを個別にコンパイルして実行する処理コストと比べると、決定木Ｔ１０，Ｔ２０，Ｔ３０の生成、および、マージの処理コストは十分に小さいと考えられる。
【０２４２】
こうして、解析装置１００は、決定木Ｔ１０，Ｔ２０，Ｔ３０に基づいて作成した決定木Ｔ４０を辿るだけでテスト結果を判断できる。このため、各ミュータントを個別にコンパイルして実行せずに済み、その分の実行時間を削減できる。その結果、ミューテーション解析を高速化できる。更に、ミューテーション解析によるテストの評価結果の精度を向上でき、ユーザによるテスト自体の信頼性向上の作業を支援できる。テストの信頼性向上に寄与することで、ソフトウェアの品質向上に貢献できる。
【０２４３】
なお、第１の実施の形態の情報処理は、演算部１ｂにプログラムを実行させることで実現できる。また、第２の実施の形態の情報処理は、プロセッサ１０１にプログラムを実行させることで実現できる。プログラムは、コンピュータ読み取り可能な記録媒体１３に記録できる。
【０２４４】
例えば、プログラムを記録した記録媒体１３を配布することで、プログラムを流通させることができる。また、プログラムを他のコンピュータに格納しておき、ネットワーク経由でプログラムを配布してもよい。コンピュータは、例えば、記録媒体１３に記録されたプログラムまたは他のコンピュータから受信したプログラムを、ＲＡＭ１０２やＨＤＤ１０３などの記憶装置に格納し（インストールし）、当該記憶装置からプログラムを読み込んで実行してもよい。
【符号の説明】
【０２４５】
１  解析装置
１ａ  記憶部
１ｂ  演算部
Ｐ１，Ｐ２  ソースコード
Ｔ１，Ｔ２，Ｔ３，Ｔ４  決定木
【図１】
2018049492.tif 000003
【図２】
2018049492.tif 000004
【図３】
2018049492.tif 000005
【図４】
2018049492.tif 000006
【図５】
2018049492.tif 000007
【図６】
2018049492.tif 000008
【図７】
2018049492.tif 000009
【図８】
2018049492.tif 000010
【図９】
2018049492.tif 000011
【図１０】
2018049492.tif 000012
【図１１】
2018049492.tif 000013
【図１２】
2018049492.tif 000014
【図１３】
2018049492.tif 000015
【図１４】
2018049492.tif 000016
【図１５】
2018049492.tif 000017
【図１６】
2018049492.tif 000018
【図１７】
2018049492.tif 000019
【図１８】
2018049492.tif 000020
【図１９】
2018049492.tif 000021
【図２０】
2018049492.tif 000022
【図２１】
2018049492.tif 000023
【図２２】
2018049492.tif 000024
【図２３】
2018049492.tif 000025
【図２４】
2018049492.tif 000026
【図２５】
2018049492.tif 000027
【図２６】
2018049492.tif 000028
【図２７】
2018049492.tif 000029
【図２８】
2018049492.tif 000030
【図２９】
2018049492.tif 000031
【図３０】
2018049492.tif 000032
【図３１】
2018049492.tif 000033
【図３２】
2018049492.tif 000034
【図３３】
2018049492.tif 000035
【図３４】
2018049492.tif 000036
【図３５】
2018049492.tif 000037
【図３６】
2018049492.tif 000038
【図３７】
2018049492.tif 000039
【図３８】
2018049492.tif 000040
【図３９】
2018049492.tif 000041
【図４０】
2018049492.tif 000042
【図４１】
2018049492.tif 000043
【図４２】
2018049492.tif 000044
【図４３】
2018049492.tif 000045
【図４４】
2018049492.tif 000046
【図４５】
2018049492.tif 000047