(57)【特許請求の範囲】
【請求項１】
ソースコードから、該ソースコードに含まれる出力変数の入力条件に応じた値を示すデシジョンテーブルを生成するテーブル生成手段と、
前記入力条件に応じた前記出力変数の値を示す前記デシジョンテーブルから、前記入力条件の真偽の値の組み合わせを抽出して、前記組み合わせを規定する第１コードを生成する第１生成手段と、
前記デシジョンテーブルから、前記第１生成手段により抽出された前記組み合わせに対応する前記出力変数の値を抽出し、前記出力変数の値を規定する第２コードを生成する第２生成手段と、
前記第１コードを、前記ソースコードを実行するための実行コードの前段側に付加し、前記第２コードを、前記実行コードの後段側に付加することにより検証用コードを生成するコード生成手段と、
前記検証用コードを実行することにより、前記デシジョンテーブルと、前記ソースコードとの等価性を検証する検証手段と、
を備え、
前記テーブル生成手段は、
前記ソースコードから前記出力変数を特定する特定手段と、
前記ソースコードに含まれる式を等価な式に置き換える等価変換処理を実行して、前記特定手段により特定された前記出力変数についての方程式を導出する第１変換手段と、
前記方程式から前記入力条件を抽出し、該入力条件をノードとする原因結果グラフを作成する作成手段と、
前記原因結果グラフを、前記入力条件の真偽の値の組み合わせと、前記出力変数の値との対応関係を示す前記デシジョンテーブルに変換する第２変換手段と、
を有する検証装置。
【請求項２】
ソースコードとは別のソースコードから、前記別のソースコードに含まれる出力変数の入力条件に応じた値を示すデシジョンテーブルを生成するテーブル生成手段と、
前記デシジョンテーブルから、前記入力条件の真偽の値の組み合わせを抽出して、前記組み合わせを規定する第１コードを生成する第１生成手段と、
前記デシジョンテーブルから、前記第１生成手段により抽出された前記組み合わせに対応する前記出力変数の値を抽出し、前記出力変数の値を規定する第２コードを生成する第２生成手段と、
前記第１コードを、前記ソースコードを実行するための実行コードの前段側に付加し、前記第２コードを、前記実行コードの後段側に付加することにより検証用コードを生成するコード生成手段と、
前記検証用コードを実行することにより、前記デシジョンテーブルと、前記ソースコードとの等価性を検証する検証手段と、
を備え、
前記テーブル生成手段は、
前記ソースコードから前記出力変数を特定する特定手段と、
前記ソースコードに含まれる式を等価な式に置き換える等価変換処理を実行して、前記特定手段により特定された前記出力変数についての方程式を導出する第１変換手段と、
前記方程式から前記入力条件を抽出し、該入力条件をノードとする原因結果グラフを作成する作成手段と、
前記原因結果グラフを、前記入力条件の真偽の値の組み合わせと、前記出力変数の値との対応関係を示す前記デシジョンテーブルに変換する第２変換手段と、
を有する検証装置。
【請求項３】
入力条件に応じた出力変数の値を示すデシジョンテーブルから、前記入力条件の真偽の値の組み合わせを抽出して、前記組み合わせを規定する第１コードを生成する第１生成手段と、
前記デシジョンテーブルから、前記第１生成手段により抽出された前記組み合わせに対応する前記出力変数の値を抽出し、前記出力変数の値を規定する第２コードを生成する第２生成手段と、
前記第１コードを、ソースコードを実行するための実行コードの前段側に付加し、前記第２コードを、前記実行コードの後段側に付加することにより検証用コードを生成するコード生成手段と、
前記検証用コードを実行することにより、前記デシジョンテーブルと、前記ソースコードとの等価性を検証する検証手段と、
を備え、
前記第２生成手段は、
抽出した前記出力変数の値が不変値である場合、前記不変値を仮変数に格納する第３コードを生成し、前記検証用コードに含まれる前記実行コードの前段側に前記第３コードを付加し、
前記出力変数の値が前記仮変数の値であるか否かを規定する前記第２コードを生成する検証装置。
【請求項４】
前記第１変換手段は、前記等価変換処理として、定数伝播処理、入力変数伝播処理および枝刈り処理のループ処理を実行することによって前記ソースコードを縮約し、該ソースコードの縮約が収束した時点で前記ループ処理を終了する請求項１または２に記載の検証装置。
【請求項５】
前記第１変換手段は、縮約が収束した前記ソースコードに対して、条件式情報伝播処理を実行する請求項４に記載の検証装置。
【請求項６】
前記第１変換手段は、前記等価変換処理として、定数伝播処理、入力変数伝播処理、枝刈り処理および条件式情報伝播処理を実行する請求項１または２に記載の検証装置。
【請求項７】
前記検証手段は、前記ソースコードが実行された場合に、前記デシジョンテーブルで規定された前記入力条件に応じて、前記出力変数の値が出力されるか否かを判定することにより、前記等価性を検証する請求項１〜３のいずれか一項に記載の検証装置。
【請求項８】
前記デシジョンテーブルは、検証装置とは独立して作成された請求項１〜３のいずれか一項に記載の検証装置。
【請求項９】
前記第２生成手段は、
抽出した前記出力変数の値が不変値である場合、前記不変値を仮変数に格納する第３コードを生成し、前記検証用コードに含まれる前記実行コードの前段側に前記第３コードを付加し、
前記出力変数の値が前記仮変数の値であるか否かを規定する前記第２コードを生成する請求項１または２に記載の検証装置。
【請求項１０】
ソースコードから、前記ソースコードに含まれる出力変数の入力条件に応じた値を示すデシジョンテーブルを生成するテーブル生成手段と、
前記入力条件に応じた前記出力変数の値を示す前記デシジョンテーブルから、前記入力条件の真偽の値の組み合わせを抽出して、前記組み合わせを規定する第１コードを生成する第１生成手段と、
前記デシジョンテーブルから、前記第１生成手段により抽出された前記組み合わせに対応する前記出力変数の値を抽出し、前記出力変数の値を規定する第２コードを生成する第２生成手段と、
前記第１コードを、前記ソースコードを実行するための実行コードの前段側に付加し、前記第２コードを、前記実行コードの後段側に付加することにより検証用コードを生成するコード生成手段と、
前記検証用コードを実行することにより、前記デシジョンテーブルと、前記ソースコードとの等価性を検証する検証手段と、
を備え、
前記テーブル生成手段は、
ソースコードから出力変数を特定する特定手段と、
前記ソースコードに含まれる式を等価な式に置き換える等価変換処理を実行して、前記特定手段により特定された前記出力変数についての方程式を導出する第１変換手段と、
前記方程式から入力条件を抽出し、該入力条件をノードとする原因結果グラフを作成する作成手段と、
前記原因結果グラフを、前記入力条件の真偽の値の組み合わせと、前記出力変数の値との対応関係を示すデシジョンテーブルに変換する第２変換手段と、
を有する検証システム。
【請求項１１】
ソースコードから、該ソースコードに含まれる出力変数の入力条件に応じた値を示すデシジョンテーブルを生成するテーブル生成ステップと、
前記入力条件に応じた前記出力変数の値を示す前記デシジョンテーブルから、前記入力条件の真偽の値の組み合わせを抽出して、前記組み合わせを規定する第１コードを生成する第１生成ステップと、
前記デシジョンテーブルから、抽出した前記組み合わせに対応する前記出力変数の値を抽出し、前記出力変数の値を規定する第２コードを生成する第２生成ステップと、
前記第１コードを、ソースコードを実行するための実行コードの前段側に付加し、前記第２コードを、前記実行コードの後段側に付加することにより検証用コードを生成するコード生成ステップと、
前記検証用コードを実行することにより、前記デシジョンテーブルと、前記ソースコードとの等価性を検証する検証ステップと、
を有し、
前記テーブル生成ステップは、
前記ソースコードから前記出力変数を特定する特定ステップと、
前記ソースコードに含まれる式を等価な式に置き換える等価変換処理を実行して、特定した前記出力変数についての方程式を導出する第１変換ステップと、
前記方程式から前記入力条件を抽出し、該入力条件をノードとする原因結果グラフを作成する作成ステップと、
前記原因結果グラフを、前記入力条件の真偽の値の組み合わせと、前記出力変数の値との対応関係を示す前記デシジョンテーブルに変換する第２変換ステップと、
を有する検証方法。
【請求項１２】
ソースコードから、該ソースコードに含まれる出力変数の入力条件に応じた値を示すデシジョンテーブルを生成するテーブル生成手段と、
前記入力条件に応じた前記出力変数の値を示す前記デシジョンテーブルから、前記入力条件の真偽の値の組み合わせを抽出して、前記組み合わせを規定する第１コードを生成する第１生成手段と、
前記デシジョンテーブルから、前記第１生成手段により抽出された前記組み合わせに対応する前記出力変数の値を抽出し、前記出力変数の値を規定する第２コードを生成する第２生成手段と、
前記第１コードを、前記ソースコードを実行するための実行コードの前段側に付加し、前記第２コードを、前記実行コードの後段側に付加することにより検証用コードを生成するコード生成手段と、
前記検証用コードを実行することにより、前記デシジョンテーブルと、前記ソースコードとの等価性を検証する検証手段と、
をコンピュータに実現させ、
さらに、前記テーブル生成手段として、
前記ソースコードから前記出力変数を特定する特定手段と、
前記ソースコードに含まれる式を等価な式に置き換える等価変換処理を実行して、前記特定手段により特定された前記出力変数についての方程式を導出する第１変換手段と、
前記方程式から前記入力条件を抽出し、該入力条件をノードとする原因結果グラフを作成する作成手段と、
前記原因結果グラフを、前記入力条件の真偽の値の組み合わせと、前記出力変数の値との対応関係を示す前記デシジョンテーブルに変換する第２変換手段と、
を前記コンピュータに実現させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、検証装置、検証システム、検証方法およびプログラムに関する。
【背景技術】
【０００２】
ソフトウェア開発において、ソースコードは仕様書から作成される。この時、ソフトウェアの設計図となるドキュメントは、基本設計書および詳細設計書等が存在するが、通常、これらは機能（モジュール）毎に作成される。したがって、ソフトウェアの設計および製造を行う際には、機能毎の設計書からモジュールを製造し、それを組み合わせて一つのソフトウェアを製造する。ソフトウェアの仕様を抽出するには、ソフトウェアのソースコードからモジュールを区分けし、そのモジュールごとの振舞いを調査する必要がある。
【０００３】
上述のようなソフトウェアの仕様として、例えば、入力条件と出力値との関係を規定したデシジョンテーブル（決定表）がある。しかし、このようなソフトウェアの仕様が、そのソースコードの振る舞いを正確に規定しているものであるかどうか、または、ソースコードの振る舞いが、ソフトウェアの仕様通りに動作するものであるか否かの等価性の検証をするためには、別途検証ツールが必要となる。
【０００４】
ここで、例えば、ソースコードの振る舞いが、検証範囲（関数中の変数の値の範囲）と、その検証範囲における出力変数の期待値とを設定し、そのソースコードの振る舞いが、設定された検証範囲で、出力変数が期待値となるか否かを検証する技術が提案されている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１３−２３９００８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、上述のような検証技術は、検証範囲と期待値との組み合わせをまとまりとして検証できるのか否か明確ではなく、例えば、デシジョンテーブルのように、入力条件と出力値との組み合わせのまとめた仕様情報を検証するのは適さないという問題点があった。
【０００７】
また、検証対象となるソースコードを検証するために、必要となる検証用のコード（検証ツールが認識するためのコード）を、ソースコードの中にＣ言語のコメント形式で予め記述しておかなければならないという問題点もあった。
【０００８】
本発明は、上記に鑑みてなされたものであって、検証対象となるソースコードに対してコメント等を記述する必要がなく、デシジョンテーブルとの等価性を検証することができる検証装置、検証システム、検証方法およびプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００９】
実施形態の検証装置は、テーブル生成手段と、第１生成手段と、第２生成手段と、コード生成手段と、検証手段と、を備える。テーブル生成手段は、ソースコードから、ソースコードに含まれる出力変数の入力条件に応じた値を示すデシジョンテーブルを生成する。第１生成手段は、入力条件に応じた出力変数の値の変動を示すデシジョンテーブルから、入力条件の真偽の値の組み合わせを抽出して、組み合わせを規定する第１コードを生成する。第２生成手段は、デシジョンテーブルから、第１生成手段により抽出された組み合わせに対応する出力変数の値を抽出し、出力変数の値を規定する第２コードを生成する。コード生成手段は、第１コードを、ソースコードを実行するための実行コードの前段側に付加し、第２コードを、実行コードの後段側に付加することにより検証用コードを生成する。検証手段は、検証用コードを実行することにより、デシジョンテーブルと、ソースコードとの等価性を検証する。テーブル生成手段は、特定手段と、第１変換手段と、作成手段と、第２変換手段と、を有する。特定手段は、ソースコードから出力変数を特定する。第１変換手段は、ソースコードに含まれる式を等価な式に置き換える等価変換処理を実行して、特定手段により特定された出力変数についての方程式を導出する。作成手段は、方程式から入力条件を抽出し、入力条件をノードとする原因結果グラフを作成する。第２変換手段は、原因結果グラフを、入力条件の真偽の値の組み合わせと、出力変数の値との対応関係を示すデシジョンテーブルに変換する。
【図面の簡単な説明】
【００１０】
【図１】図１は、検証装置のハードウェア構成の一例を示す図である。
【図２】図２は、検証装置の機能ブロックの構成の一例を示す図である。
【図３】図３は、入力変数から出力変数の値を生成する動作を説明する図である。
【図４】図４は、仕様抽出動作の一例を示すフローチャートである。
【図５】図５は、定数伝播処理を説明する図である。
【図６】図６は、入力変数伝播処理を説明する図である。
【図７】図７は、枝刈り処理を説明する図である。
【図８】図８は、条件式情報伝播処理を説明する図である。
【図９】図９は、等価変換処理の一部を示すフローチャートである。
【図１０】図１０は、モジュールのソースコードのサンプルを示す図である。
【図１１】図１１は、出力変数を特定する処理を説明する図である。
【図１２】図１２は、定数伝播処理および入力伝播処理を説明する図である。
【図１３】図１３は、枝刈り処理を説明する図である。
【図１４】図１４は、条件式情報伝播処理を説明する図である。
【図１５】図１５は、条件式情報伝播処理を実行して方程式を得る動作を説明する図である。
【図１６】図１６は、論理演算子で表された方程式に変換する動作を説明する図である。
【図１７】図１７は、出力変数を仮変数に設定する動作を説明する図である。
【図１８】図１８は、中間的な原因結果グラフを導出する動作を説明する図である。
【図１９】図１９は、最終的な原因結果グラフを導出する動作を説明する図である。
【図２０】図２０は、デシジョンテーブルを作成する動作を説明する図である。
【図２１】図２１は、検証用コードを作成する動作の概要を説明する図である。
【図２２】図２２は、等価性検証動作の一例を示すフローチャートである。
【図２３】図２３は、事前条件および事後条件のコードを設定する例を示す図である。
【図２４】図２４は、事前条件および事後条件のコードを設定する別の例を示す図である。
【図２５】図２５は、検証用コードを作成する動作の概要を説明する図である。
【発明を実施するための形態】
【００１１】
以下の図面において、同一の部分には同一の符号が付してある。ただし、図面は模式的なものであり、厚みと平面寸法との関係、各層の厚みの比率等は現実のものとは異なる場合がある。したがって、具体的な厚みおよび寸法は以下の説明を参酌して判断すべきものである。
【００１２】
（第１の実施形態）
図１は、第１の実施形態に係る検証装置のハードウェア構成の一例を示す図である。図１を参照しながら、検証装置の一例であるＰＣ１のハードウェア構成について説明する。
【００１３】
図１に示すように、検証装置の一例であるＰＣ１は、通信部１１と、操作部１２と、表示部１３と、記憶部１４と、外部記憶装置１５と、制御部１６と、ＣＤ−ＲＯＭドライブ１８と、備えている。上述の各部は、バス１９によって接続され、互いにデータの送受信が可能となっている。
【００１４】
通信部１１は、外部機器と通信する装置である。通信部１１は、例えば、ＮＩＣ（Ｎｅｔｗｏｒｋ  Ｉｎｔｅｒｆａｃｅ  Ｃａｒｄ）等の通信装置によって実現される。通信部１１の通信プロトコルとして、例えば、ＴＣＰ（Ｔｒａｎｓｍｉｓｓｉｏｎ  Ｃｏｎｔｒｏｌ  Ｐｒｏｔｏｃｏｌ）／ＩＰ（Ｉｎｔｅｒｎｅｔ  Ｐｒｏｔｏｃｏｌ）またはＵＤＰ（Ｕｓｅｒ  Ｄａｔａｇｒａｍ  Ｐｒｏｔｏｃｏｌ）／ＩＰ等を適用できる。
【００１５】
操作部１２は、ユーザによって制御部１６に対して所定の処理を実行させるための操作入力を行う装置である。操作部１２は、例えば、マウス、キーボード、テンキー、タッチパッド、またはタッチパネルにおける操作入力機能によって実現される。
【００１６】
表示部１３は、制御部１６により実行されているアプリケーション画像等を表示する装置である。表示部１３は、例えば、ＣＲＴ（Ｃａｔｈｏｄｅ  Ｒａｙ  Ｔｕｂｅ）ディスプレイ、液晶ディスプレイ、プラズマディスプレイまたは有機ＥＬ（Ｅｌｅｃｔｒｏｌｕｍｉｎｅｓｃｅｎｃｅ）ディスプレイ等によって実現される。
【００１７】
記憶部１４は、ＰＣ１で実行される各種プログラムおよびＰＣ１で行われる各種処理に使用されるデータ等を記憶する装置である。記憶部１４は、例えば、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）およびＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）等の記憶装置によって実現される。
【００１８】
外部記憶装置１５は、プログラム、ソースコード、および各種データ等を蓄積して記憶する記憶装置である。外部記憶装置１５は、例えば、ＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）、ＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）、光ディスク、または光磁気ディスク（ＭＯ：Ｍａｇｎｅｔｏ−Ｏｐｔｉｃａｌ  Ｄｉｓｋ）等の記憶装置によって実現される。
【００１９】
制御部１６は、ＰＣ１の各部の動作を制御する装置である。制御部１６は、例えば、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）およびＡＳＩＣ（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）等で実現される。
【００２０】
ＣＤ−ＲＯＭドライブ１８は、着脱自在な記憶媒体の一例としてのＣＤ−ＲＯＭ（Ｃｏｍｐａｃｔ  Ｄｉｓｃ  Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）１７に対するデータの読み出しおよび書き込みを制御する装置である。なお、上述の着脱可能な記憶媒体の他の例として、ＣＤ−Ｒ（Ｃｏｍｐａｃｔ  Ｄｉｓｃ  Ｒｅｃｏｒｄａｂｌｅ）、ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｋ）またはブルーレイディスク等のコンピュータで読み取り可能な記憶媒体に記憶して提供するように構成してもよい。
【００２１】
図２は、第１の実施形態に係る検証装置の機能ブロックの構成の一例を示す図である。図２を参照しながら、ＰＣ１の機能ブロックの構成について説明する。
【００２２】
図２に示すように、ＰＣ１は、各機能を実現する手段として、仕様抽出手段１００（テーブル生成手段）と、等価性検証手段１５０と、記憶手段１６０と、を有する。
【００２３】
仕様抽出手段１００は、仕様抽出動作の対象となるソフトウェアのモジュール（対象モジュール）のソースコードから、仕様情報としてのデシジョンテーブル（決定表）を生成する機能部である。仕様抽出手段１００は、出力変数特定手段１０１（特定手段）と、等価変換手段１０２（第１変換手段）と、グラフ作成手段１０３（作成手段）と、テーブル変換手段１０４（第２変換手段）と、を有する。
【００２４】
出力変数特定手段１０１は、仕様抽出動作の対象となるソフトウェアのモジュール（対象モジュール）のソースコード（例えば、後述の第１記憶手段１６１に記憶されたソースコード）に含まれる出力変数（例えば、グローバル変数）を抽出して特定する機能部である。ここで、グローバル変数とは、ソフトウェアの各モジュールの外で宣言された変数であり、いずれのモジュールにおいても参照および更新が可能な変数である。
【００２５】
等価変換手段１０２は、モジュールのソースコードに対して等価変換処理を実行して、ソースコードを縮約し、出力変数についての方程式を導出する機能部である。等価変換処理として、定数伝播処理、入力変数伝播処理、枝刈り処理および条件式情報伝播処理等があるが、各処理の詳細については後述する。
【００２６】
グラフ作成手段１０３は、等価変換手段１０２により導出された出力変数についての方程式から、原因結果グラフを作成する機能部である。ここで、原因結果グラフとは、１または複数の入力条件をノードとして、各ノードを論理記号により結合し、入力条件の組み合わせから出力値を導出するためのグラフである。原因結果グラフを作成する動作の詳細については後述する。
【００２７】
テーブル変換手段１０４は、グラフ作成手段１０３により作成された原因結果グラフをデシジョンテーブルに変換する機能部である。ここで、デシジョンテーブルとは、入力条件の組み合わせから出力変数の値（出力値）がどのような値をとるかを示す表であり、モジュールの振る舞いを表現する、すなわち、モジュールの仕様を決定付けるものである。
【００２８】
等価性検証手段１５０は、仕様抽出手段１００による仕様抽出動作により生成されたデシジョンテーブルと、仕様抽出動作の対象となったソースコードとの等価性を検証する機能部である。ここで、等価性を有するとは、ソースコードを実行した場合に、仕様情報（例えば、デシジョンテーブル）で規定された振る舞い通りに動作する場合をいうものとする。等価性検証手段１５０は、コード生成手段１５１と、検証手段１５２と、結果出力手段１５３と、を有する。
【００２９】
コード生成手段１５１は、ソースコードとデシジョンテーブルとの等価性を検証するための検証用コードを生成する機能部である。コード生成手段１５１は、事前条件設定手段１５１ａ（第１生成手段）と、事後条件設定手段１５１ｂ（第２生成手段）と、を有する。
【００３０】
事前条件設定手段１５１ａは、等価性の検証対象となるソースコード（以下、検証対象ソースコードという）に対する検証用コードに、仕様抽出手段１００により生成されたデシジョンテーブルの入力条件を規定するコード（第１コード）を設定する機能部である。事後条件設定手段１５１ｂは、検証対象ソースコードに対する検証用コードに、仕様抽出手段１００により生成されたデシジョンテーブルの事前条件設定手段１５１ａにより設定された入力条件に対応する出力変数の値（出力値）を規定するコード（第２コード）を設定する機能部である。
【００３１】
検証手段１５２は、コード生成手段１５１により生成された検証用コードを解析し、検証対象ソースコードを実行した場合に、事前条件設定手段１５１ａにより設定された入力条件を満たす場合に、事後条件設定手段１５１ｂにより設定された出力値となるか否かを検証する機能部である。検証手段１５２は、例えば、ＣＢＭＣ（Ｂｏｕｎｄｅｄ  Ｍｏｄｅｌ  Ｃｈｅｃｋｉｎｇ  ｆｏｒ  Ｃ／Ｃ＋＋）等の既存のモデル検査ツール（モデル検査ソフトウェア）を利用することが可能である。
【００３２】
結果出力手段１５３は、検証手段１５２により検証された検証対象ソースコードの検証結果を出力する機能部である。結果出力手段１５３は、例えば、検証結果をデータとして出力し記憶部１４に記憶させて保存するものとしてもよく、検証結果を表示部１３に表示させるものとしてもよい。
【００３３】
なお、本実施形態における「モジュール」とは、特定の機能を有するソフトウェア部品であり、その実体であるプログラムのコードを「ソースコード」と記載しているが、双方を明確に区別することを意図するものではない。
【００３４】
記憶手段１６０は、制御部１６により実行される各種プログラム、およびＰＣ１で行われる各種処理に使用されるデータ等を記憶する機能部である。記憶手段１６０は、図１に示す、記憶部１４によって実現される。記憶手段１６０は、第１記憶手段１６１と、第２記憶手段１６２と、を有する。
【００３５】
第１記憶手段１６１は、仕様抽出動作の対象、かつ、等価性の検証対象となるソースコードを記憶する機能部である。第２記憶手段１６２は、仕様抽出手段１００により生成されたデシジョンテーブルをデータとして記憶する機能部である。
【００３６】
上述の出力変数特定手段１０１、等価変換手段１０２、グラフ作成手段１０３、テーブル変換手段１０４、コード生成手段１５１、検証手段１５２および結果出力手段１５３は、ＰＣ１の制御部１６が外部記憶装置１５等に記憶されたプログラムを記憶部１４に読み出して実行することにより実現される。なお、出力変数特定手段１０１、等価変換手段１０２、グラフ作成手段１０３、テーブル変換手段１０４、コード生成手段１５１、検証手段１５２および結果出力手段１５３は、すべてがプログラムの実行により実現されることに限定されるものではなく、少なくともいずれかが、ハードウェア回路によって実現されるものとしてもよい。
【００３７】
また、図２に示す機能ブロックの構成は、機能を概念的に示したものであって、このような構成に限定されるものではない。例えば、図２で独立した機能部として図示した複数の機能部を、１つの機能部として構成してもよい。一方、図２の１つの機能部が有する機能を複数の分割し、複数の機能部として構成するものとしてもよい。
【００３８】
図３は、モジュールが入力変数から出力変数の値を生成する動作を説明する図である。図３を参照しながら、対象モジュール２０について、モジュールとしての動作の概要を説明する。
【００３９】
図３に示すように、対象モジュール２０は、入力変数に格納された値（入力値）に基づいて、所定の処理を実行し、出力変数に出力値を格納して出力する機能を有する。対象モジュール２０の入力変数の値は、対象モジュール２０の外部から入力されるデータであって、例えば、引数およびグローバル変数に格納される。対象モジュール２０の出力変数の値は、対象モジュール２０の外部に伝達されるデータであって、例えば、対象モジュール２０内で更新されるグローバル変数の値である。このような、対象モジュール２０の入出力関係に基づいた動作仕様を抽出することが、上述のデシジョンテーブルを求めることに相当する。
【００４０】
図４は、第１の実施形態に係る検証装置の仕様抽出動作の一例を示すフローチャートである。図５は、定数伝播処理を説明する図である。図６は、入力変数伝播処理を説明する図である。図７は、枝刈り処理を説明する図である。図８は、条件式情報伝播処理を説明する図である。図９は、等価変換処理のうち定数伝播処理、入力変数伝播処理および枝刈り処理のループ処理を示すフローチャートである。図４〜９を参照しながら、検証装置であるＰＣ１の仕様抽出動作の流れについて説明する。
【００４１】
（ステップＳ１０）
出力変数特定手段１０１は、第１記憶手段１６１に記憶された対象モジュールのソースコードを読み出して入力する。出力変数特定手段１０１は、ソースコードに含まれる関数における出力変数を特定する。具体的には、出力変数特定手段１０１は、出力変数として、ソースコードに含まれる関数における、更新されているグローバル変数を特定する。そして、ステップＳ１１へ移行する。
【００４２】
なお、出力変数特定手段１０１は、出力変数として、ソースコードに含まれる関数において、更新されるグローバル変数を特定するものとしているが、これに限定されるものではない。例えば、出力変数特定手段１０１は、対象モジュールのグローバル変数ではなく、関数の戻り値を、出力変数として特定してもよい。
【００４３】
また、出力変数特定手段１０１は、第１記憶手段１６１からソースコードを読み出して入力するものとしたが、これに限定されるものではなく、ユーザが操作部１２を介して直接、操作入力したソースコードを入力するものとしてもよい。
【００４４】
（ステップＳ１１）
等価変換手段１０２は、対象モジュールのソースコードにおいて等価変換処理を実行し、出力変数についての方程式を導出する。具体的には、等価変換手段１０２は、等価変換処理として、定数伝播処理、入力変数伝播処理、枝刈り処理および条件式情報伝播処理を実行する。
【００４５】
ここで、図５を参照しながら、定数伝播処理の内容について説明する。定数伝播処理は、ソースコードにおいて、変数への定数の代入箇所を開始点として、その変数を読み取る（参照する）時点で有効かどうかを判定し、有効である場合、定数に置き換える処理である。図５に示すサンプルコード３０に対して、定数伝播処理を実行した結果のコードを定数伝播処理後コード３１とする。
【００４６】
まず、サンプルコード３０のコード部３００において、定数「１」が変数「Ａ」に代入されているので、この代入している箇所を開始点とする。
【００４７】
次に、サンプルコード３０のコード部３０１において、変数「Ａ」が参照されている。変数「Ａ」には、コード部３００において定数「１」が代入されており、コード部３０１において、変数「Ａ」を参照すると定数「１」を得ることができるので、この変数「Ａ」を定数「１」に置き換える。その結果、コード部３０１（「Ｂ＝Ａ＋１；」）は、定数伝播処理後コード３１の定数伝播処理後コード部３１０（「Ｂ＝２；」）に置き換えることができる。
【００４８】
次に、同様に、コード部３０１が、定数伝播処理後コード部３１０に置き換えられた結果、サンプルコード３０のコード部３０２（「Ｃ＝Ｂ；」）は、定数伝播処理後コード３１の定数伝播処理後コード部３１１（「Ｃ＝２；」）に置き換えることができる。
【００４９】
そして、コード部３００における変数「Ａ」への定数「１」の代入から、サンプルコード３０のコード部３０３（「Ｆｕｎｃ（Ａ）；」）は、定数伝播処理後コード３１の定数伝播処理後コード部３１２（「Ｆｕｎｃ（１）；」）に置き換えることができる。これは、関数「Ｆｕｎｃ」の引数としての変数「Ａ」が定数「１」に置き換えられたことを意味する。
【００５０】
以上の動作にように、定数伝播処理は、ソースコード中の変数を定数に置き換えることによって、ソースコードを簡略化して縮約することができる。
【００５１】
次に、図６を参照しながら、入力変数伝播処理の内容について説明する。入力変数伝播処理は、グローバル変数である入力変数を使って計算される変数の箇所を起点として、その下流でその変数を用いる式において、その変数を入力変数に置き換える処理をいうものとする。図６に示すサンプルコード３０ａに対して、入力変数伝播処理を実行した結果のコードを入力変数伝播処理後コード３１ａとする。
【００５２】
まず、サンプルコード３０ａにおけるコード部３００ａにおいて、入力変数「ｇ１」が変数「ａ１」に代入されているので、この代入計算されている箇所を起点とする。
【００５３】
次に、サンプルコード３０ａのコード部３０１ａ（「ａ２＝ａ１＋１；」）において、コード部３００ａにおける変数「ａ１」が計算に用いられているので、入力変数伝播処理後コード３１ａの入力変数伝播処理後コード部３１０ａ（「ａ２＝ｇ１＋１；」）に置き換えることができる。
【００５４】
以上の動作のように、入力変数伝播処理は、ソースコード中の変数を入力変数に置き換えることによって、ソースコードを簡略化して縮約することができる。
【００５５】
次に、図７を参照しながら、枝刈り処理の内容について説明する。枝刈り処理は、定数伝播処理および入力変数伝播処理を実行した結果、分岐条件式を定数（例えば、ｉｆ文であれば条件式、ｓｗｉｔｃｈ文であればｃａｓｅ値）に置き換えること等によって、複数の分岐の選択肢のうち、実行されることのない選択肢を削除する処理である。図７に示すサンプルコード３０ｂに対して、枝刈り処理を実行した結果のコードを枝刈り処理後コード３１ｂとする。
【００５６】
サンプルコード３０ｂのコード部３００ｂにおいて、変数「Ａ」に定数「１」が入力されている。したがって、条件分岐式であるサンプルコード３０ｂのコード部３０１ｂにおける条件（「Ａ＝＝０」）を満たすことはないので、分岐の選択肢の一つである「分岐１；」が実行されることはない。よって、この実行されることのない「分岐１；」を削除することによって、条件分岐式であるコード部３０１ｂは、枝刈り処理後コード３１ｂの枝刈り処理後コード部３１０ｂ（「分岐２；」）に置き換えることができる。
【００５７】
以上のように、枝刈り処理は、数行に渡って記述された条件分岐式の記述量を減らす（図７の例では１行）ことができるので、ソースコードを簡略化して縮約することができる。
【００５８】
次に、図８を参照しながら、条件式情報伝播処理の内容について説明する。条件式情報伝播処理は、条件分岐式（例えば、ｉｆ文およびｓｗｉｔｃｈ文等）を３項式に置き換える処理をいうものとする。図８に示すサンプルコード３０ｃに対して、条件式情報伝播処理を実行した結果のコードを条件式情報伝播処理後コード３１ｃとする。
【００５９】
サンプルコード３０ｃのコード部３００ｃは、ｉｆ文で表された条件分岐式である。このコード部３００ｃを、３項演算子を用いた３項式に置き換えたのが条件式情報伝播処理後コード３１ｃの条件式情報伝播処理後コード部３１０ｃ（「ｂ＝（Ａ？０：１）；」）である。
【００６０】
以上のように、条件式情報伝播処理は、数行に渡って記述された条件分岐式を１行の３項式に置き換えることができるので、ソースコードを簡略化して縮約することができる。
【００６１】
次に、図９を参照しながら、定数伝播処理、入力変数伝播処理および枝刈り処理をループ処理する動作を説明する。枝刈り処理は、上述のように、定数伝播処理および入力変数伝播処理を実行した後等に、分岐条件式を定数に置き換えることが可能となった場合に置き換えることによって、複数の分岐の選択肢のうち、実行されることのない選択肢を削除する処理である。なお、定数伝播処理、入力変数伝播処理および枝刈り処理の実行順序は任意でよい。
【００６２】
また、枝刈り処理を実行することによって、条件分岐式が簡略化され、分岐の選択肢のうち特定の選択肢が条件分岐式外に出る、すなわち、特定の選択肢が常時実行されることになる。この枝刈り処理により常時実行されることになった選択肢は、新たに、定数伝播処理または入力変数伝播処理により縮約することができる可能性がある。
【００６３】
以上のことから、図９に示す手順で定数伝播処理、入力変数伝播処理および枝刈り処理を実行する。まず、等価変換手段１０２は、ソースコードに対して、定数伝播処理（ステップＳ１１０）および入力変数伝播処理（ステップＳ１１１）を実行する。次に、等価変換手段１０２は、定数伝播処理および入力変数伝播処理によって縮約されたソースコードに対して、枝刈り処理を実行する（ステップＳ１１２）。そして、等価変換手段１０２は、定数伝播処理、入力変数伝播処理および枝刈り処理を実行した結果、ソースコードの縮約が収束したか否か、すなわち、ソースコードがこれ以上縮約できないか否かを判定する。縮約が収束した場合（ステップＳ１１３：Ｙｅｓ）、処理を終了し、縮約が収束していない場合（ステップＳ１１３：Ｎｏ）、ステップＳ１１０へ戻る。
【００６４】
以上のように、図９に示す定数伝播処理、入力変数伝播処理および枝刈り処理のループ処理を実行することによって、ソースコードをより確実に縮約することができる。そして、等価変換手段１０２は、定数伝播処理、入力変数伝播処理および枝刈り処理のループ処理を実行した後、条件式情報伝播処理を実行することによって、３項式で表された、出力変数についての方程式を導出することができる。そして、ステップＳ１２へ移行する。
【００６５】
（ステップＳ１２）
グラフ作成手段１０３は、等価変換手段１０２により導出された出力変数についての方程式から、原因結果グラフを作成する。具体的には、グラフ作成手段１０３は、出力変数についての方程式の各入力条件をノードとして、後述するように、ＯＲ記号部、ＡＮＤ記号部およびＮＯＴ記号部で結合することにより、出力変数の値（出力値）の振る舞いを把握するための原因結果グラフを作成する。ただし、グラフ作成手段１０３は、上述のように出力変数についての方程式から、入力条件式のノードがＯＲ記号部、ＡＮＤ記号部およびＮＯＴ記号部によって結合された原因結果グラフを作成する。したがって、等価変換手段１０２は、３項演算子を用いて表された方程式を、論理演算子を用いて表された方程式に変換することが望ましい。また、グラフ作成手段１０３による出力変数についての方程式から原因結果グラフへの作成手順の詳細は後述する。そして、ステップＳ１３へ移行する。
【００６６】
（ステップＳ１３）
テーブル変換手段１０４は、グラフ作成手段１０３により作成された原因結果グラフをデシジョンテーブルに変換する。具体的には、テーブル変換手段１０４は、上述の出力変数についての方程式の入力条件（原因結果グラフにおける入力条件のノード）の値の組み合わせごとに、出力変数の値（出力値）がどのように値をとるかについて表にしたデシジョンテーブルを作成する。また、テーブル変換手段１０４による原因結果グラフからデシジョンテーブルへの変換手順の詳細は後述する。そして、仕様抽出動作を終了する。
【００６７】
図１０は、仕様抽出動作の対象となるモジュールのソースコードのサンプルを示す図である。図１１は、モジュールに対して出力変数を特定する処理を説明する図である。図１２は、モジュールに対して定数伝播処理および入力伝播処理を実行する動作を説明する図である。図１３は、モジュールに対して枝刈り処理を実行する動作を説明する図である。図１４は、モジュールに対して条件式情報伝播処理を実行する動作を説明する図である。図１５は、モジュールに対して条件式情報伝播処理を実行して方程式を得る動作を説明する図である。図１６は、３項演算子により表された方程式を論理演算子により表された方程式に変換する動作を説明する図である。図１７は、等価変換処理を実行する前に出力変数を仮変数に設定する動作を説明する図である。図１０〜１７を参照しながら、具体的なモジュールに対する等価変換手段１０２による等価変換処理について説明する。
【００６８】
図１０に示す対象モジュール２０は、以下の等価変換処理を実行する前の具体的なサンプルコードである。なお、図１０においては、対象モジュール２０のソースコードがＣ言語で記載されているが、これに限定されるものではなく、上述の等価変換処理が実行できるプログラム言語であればよい。
【００６９】
まず、図１１に示すように、出力変数特定手段１０１は、対象モジュール２０において、更新されているグローバル変数、すなわち出力変数を特定する。図１１に示すように、対象モジュール２０においては、グローバル変数としては、グローバル変数２００（「Ｏｕｔｐｕｔ＿ｄａｔａ」）およびグローバル変数２０１（「Ｇｌｏｂａｌ＿ｓｔａｔｕｓ」）が宣言されている。出力変数特定手段１０１は、グローバル変数のうち、グローバル変数２０１は参照されているのみ（「ｓａｍｐｌｅ＿ｓｔａｔｕｓ１＝Ｇｌｏｂａｌ＿ｓｔａｔｕｓ；」）なので、出力変数ではなく入力変数であると判断する。また、出力変数特定手段１０１は、グローバル変数のうち、グローバル変数２００は書き換えられている（更新されている）（例えば「Ｏｕｔｐｕｔ＿ｄａｔａ＝ｓｔａｔｕｓ２；」）ので出力変数であると特定する。
【００７０】
対象モジュール２０における入力条件部２０２〜２０４は、後述するように、等価変換手段１０２によって導出された出力変数についての方程式における入力条件となるコード部である。
【００７１】
次に、図１２に示すように、コード部２０５において変数「ｓｔａｔｕｓ１」に定数「０」が代入されていることから、「ｓｔａｔｕｓ２＝ｓｔａｔｕｓ１＋１；」は「ｓｔａｔｕｓ２＝１；」と置き換えることができる。したがって、等価変換手段１０２は、定数伝播処理によって、対象モジュール２０のコード部２０５を、定数伝播処理後コード部２１０に置き換えることができる。
【００７２】
また、変数「ｓｔａｔｓｕ２」には定数「１」が代入されていることから、コード部２０７ａ〜２０７ｃ（「Ｏｕｔｐｕｔ＿ｄａｔａ＝ｓｔａｔｕｓ２；」）は、「Ｏｕｔｐｕｔ＿ｄａｔａ＝１；」に置き換えることができる。したがって、等価変換手段１０２は、定数伝播処理によって、対象モジュール２０のコード部２０７ａ〜２０７ｃを、それぞれ定数伝播処理後コード部２１２ａ〜２１２ｃに置き換えることができる。
【００７３】
また、変数「ｓｔａｔｕｓ２」には定数「１」が代入されていることから、Ｉｆ文の条件式を示すコード部２０８（「ｉｆ（（ｓｔａｔｕｓ２＝＝０））」）は、「ｉｆ（（１＝＝０））」に置き換えることができる。したがって、等価変換手段１０２は、定数伝播処理によって、対象モジュール２０のコード部２０８を、定数伝播処理後コード部２１３に置き換えることができる。
【００７４】
また、コード部２０６において入力変数「Ｇｌｏｂａｌ＿ｓｔａｔｕｓ」が変数「ｓａｍｐｌｅ＿ｓｔａｔｕｓ１」に入力されていることから、「ｓａｍｐｌｅ＿ｓｔａｔｕｓ２＝ｓａｍｐｌｅ＿ｓｔａｔｕｓ１＋１；」は「ｓａｍｐｌｅ＿ｓｔａｔｕｓ２＝Ｇｌｏｂａｌ＿ｓｔａｔｕｓ＋１；」に置き換えることができる。したがって、等価変換手段１０２は、入力変数伝播処理によって、対象モジュール２０のコード部２０６を、入力変数伝播処理後コード部２１１に置き換えることができる。
【００７５】
以上のようにして、等価変換手段１０２は、定数伝播処理および入力変数伝播処理によって、対象モジュール２０を処理後モジュール２１に変換する。
【００７６】
次に、図１３に示すように、分岐条件式であるコード部２１４において、図１２に示す定数伝播処理後コード部２１３に相当する条件の部分が「１＝＝０」であるので、「Ｏｕｔｐｕｔ＿ｄａｔａ＝１；」は実行されることがない。したがって、等価変換手段１０２は、枝刈り処理によって、処理後モジュール２１のコード部２１４を、枝刈り処理後コード部２２０（コードなし）に置き換えることができる。
【００７７】
以上のようにして、等価変換手段１０２は、枝刈り処理によって、処理後モジュール２１を処理後モジュール２２に変換する。
【００７８】
次に、図１４に示すように、条件分岐式であるコード部２２１は、３項演算子を用いた３項式に置き換えることができる。すなわち、等価変換手段１０２は、条件式情報伝播処理によって、処理後モジュール２２のコード部２２１を、３項式である条件式情報伝播処理後コード部２３０（「Ｏｕｔｐｕｔ＿ｄａｔａ＝（！（ｓａｍｐｌｅ＿ｖａｒｉａｌｂｅ２＝＝１）＆＆ｓａｍｐｌｅ＿ｆｌａｇｓ＝＝１）？１：０；」）に置き換えることができる。
【００７９】
以上のようにして、等価変換手段１０２は、条件式情報伝播処理によって、処理後モジュール２２を処理後モジュール２３に変換する。
【００８０】
次に、図１５に示すように、条件分岐式であるコード部２３１は、３項演算子を用いた３項式に置き換えることができる。すなわち、等価変換手段１０２は、条件式情報伝播処理によって、処理後モジュール２３のコード部２３１を、３項式である条件式情報伝播処理後コード部２４０（「Ｏｕｔｐｕｔ＿ｄａｔａ＝ｓａｍｐｌｅ＿ｖａｒｉａｂｌｅ１＞６１？１：（（！（ｓａｍｐｌｅ＿ｖａｒｉａｂｌｅ２＝＝１）＆＆ｓａｍｐｌｅ＿ｆｌａｇｓ＝＝１）？１：０）；」）に置き換えることができる。
【００８１】
以上のようにして、等価変換手段１０２は、条件式情報伝播処理によって、処理後モジュール２３を処理後モジュール２４に変換する。この変換された処理後モジュール２４の条件式情報伝播処理後コード部２４０の方程式が、等価変換手段１０２によって導出される出力変数ついての方程式となる。ただし、上述したように、後工程の原因結果グラフは、グラフ作成手段１０３により、入力条件式のノードがＯＲ記号部、ＡＮＤ記号部およびＮＯＴ記号部によって結合されて作成される。したがって、図１６に示すように、等価変換手段１０２は、導出した条件式情報伝播処理後コード部２４０に示す３項演算子を用いた表された方程式を、論理演算子を用いて表された方程式２４１（「Ｏｕｔｐｕｔ＿ｄａｔａ＝（ｓａｍｐｌｅ＿ｖａｒｉａｂｌｅ１＞６１）｜｜！（ｓａｍｐｌｅ＿ｖａｒｉａｂｌｅ１＞６１）＆＆！（ｓａｍｐｌｅ＿ｖａｒｉａｂｌｅ２＝＝１）＆＆ｓａｍｐｌｅ＿ｆｌａｇｓ＝＝１」）に変換する。すなわち、方程式２４１が、等価変換手段１０２が最終的に導出する出力変数についての方程式である。
【００８２】
以上のように、等価変換手段１０２による等価変換処理（定数伝播処理、入力変数伝播処理、枝刈り処理および条件式情報伝播処理）によって、モジュールのソースコードを縮約することができ、それによって縮約された出力変数についての方程式を導出することができる。
【００８３】
なお、モジュールのソースコードにおいて出力変数を使って計算する式がない場合、出力変数が等価変換手段１０２による等価変換処理のうちの枝刈り処理によって、出力変数についての方程式が削除されてしまう場合がある。この場合、図１７の対象モジュール２５の仮変数設定コード部２５０に示すように、出力変数特定手段１０１により特定された出力変数（図１７では「Ｖ１」、「Ｖ２」および「Ｖ３」）を、仮変数（図１７では「ｔｍｐ＿Ｖ１」、「ｔｍｐ＿Ｖ２」および「ｔｍｐ＿Ｖ３」）に代入処理を実行すればよい。これによって、等価変換手段１０２によって対象モジュール２５から等価変換後モジュール２６に変換された場合、仮変数設定コード部２５０は、仮変数（実質は出力変数）についての方程式である方程式コード部２６０に変換され、方程式が削除されてしまうことを防止できる。
【００８４】
図１８は、方程式の入力条件の論理式からＯＲ記号部およびＡＮＤ記号部によって中間的な原因結果グラフを導出する動作を説明する図である。図１９は、中間的な原因結果グラフからＮＯＴ記号部および同一式のノードの統合によって最終的な原因結果グラフを導出する動作を説明する図である。図１８および１９を参照しながら、グラフ作成手段１０３による原因結果グラフの作成について説明する。
【００８５】
まず、図１８に示すように、グラフ作成手段１０３は、等価変換手段１０２によって導出された図１６に示す方程式２４１の右辺（入力条件が論理演算子で結合された式）を抽出する。ＯＲ演算子（「｜｜」）、ＡＮＤ演算子（「＆＆」）、ＮＯＴ演算子（「！」）の順に演算の優先順位が高くなるので、グラフ作成手段１０３は、ＯＲ演算子によって結合された入力条件をそれぞれ抽出し、それぞれの入力条件をノードとして、各ノードを図１８に示すＯＲ記号部６０によって結合させる。具体的には、グラフ作成手段１０３は、方程式２４１の右辺のうちＯＲ演算子で結合された入力条件「ｓａｍｐｌｅ＿ｖａｒｉａｂｌｅ１＞６１」および「！（ｓａｍｐｌｅ＿ｖａｒｉａｂｌｅ１＞６１）＆＆！（ｓａｍｐｌｅ＿ｖａｒｉａｂｌｅ２＝＝１）＆＆ｓａｍｐｌｅ＿ｆｌａｇｓ＝＝１」を、それぞれノード４０、４１としてＯＲ記号部６０で結合させる。ノード４０とノード４１とのＯＲ演算の結果が出力値となり、グラフ作成手段１０３は、ＯＲ記号部６０の出力側と、出力値を示す出力値ノード７０とを結合させる。
【００８６】
次に、グラフ作成手段１０３は、生成した各ノードの入力条件において、ＡＮＤ演算子によって結合された入力条件をそれぞれ抽出し、それぞれの入力条件を新たなノードとして、各ノードを図１８に示すＡＮＤ記号部６１によって結合させる。具体的には、グラフ作成手段１０３は、ノード４１の入力条件のうちＡＮＤ演算子で結合された入力条件「！（ｓａｍｐｌｅ＿ｖａｒｉａｂｌｅ１＞６１）」、「！（ｓａｍｐｌｅ＿ｖａｒｉａｂｌｅ２＝＝１）」および「ｓａｍｐｌｅ＿ｆｌａｇｓ＝＝１」を、それぞれ、ノード４２〜４４としてＡＮＤ記号部６１で結合させる。そして、グラフ作成手段１０３は、ＡＮＤ記号部６１の出力側と、ＯＲ記号部６０とを結合させる。
【００８７】
次に、図１９に示すように、グラフ作成手段１０３は、生成した各ノードの入力条件において、ＮＯＴ演算子を含む入力条件を抽出し、ＮＯＴ演算子を外した入力条件を新たなノードとして、そのノードを図１９に示すＮＯＴ演算子と結合させる。具体的には、グラフ作成手段１０３は、ノード４２の入力条件「！（ｓａｍｐｌｅ＿ｖａｒｉａｂｌｅ１＞６１）」にＮＯＴ演算子が含まれるので、ＮＯＴ演算子を外した入力条件「ｓａｍｐｌｅ＿ｖａｒｉａｂｌｅ１＞６１」を新たなノードであるノード４２ａとする。そして、グラフ作成手段１０３は、ノード４２ａを、ＮＯＴ記号部６２ａを介してＡＮＤ記号部６１に結合させる。また、グラフ作成手段１０３は、ノード４３の入力条件「！（ｓａｍｐｌｅ＿ｖａｒｉａｂｌｅ２＝＝１）」にＮＯＴ演算子が含まれるので、ＮＯＴ演算子を外した入力条件「ｓａｍｐｌｅ＿ｖａｒｉａｂｌｅ２＝＝１」を新たなノードであるノード４３ａとする。そして、グラフ作成手段１０３は、ノード４３ａを、ＮＯＴ記号部６２ｂを介してＡＮＤ記号部６１に結合させる。
【００８８】
次に、グラフ作成手段１０３は、ここまでで生成したノードのうち、入力条件が同一式であるノードを１つのノードに統一する。具体的には、グラフ作成手段１０３は、ノード４０およびノード４２ａの入力条件が「ｓａｍｐｌｅ＿ｖａｒｉａｂｌｅ１＞６１」で同一式なので、ノード４０とノード４２ａとを１つのノード４５に統一する。
【００８９】
このように、グラフ作成手段１０３は、等価変換手段１０２より導出された方程式２４１から、右辺に含まれる入力条件をノードとしてＯＲ記号部、ＡＮＤ記号部およびＮＯＴ記号部で結合させ、同一式の入力条件を１つのノードに統一させることによって、原因結果グラフを作成する。
【００９０】
以上のように、グラフ作成手段１０３は、出力変数の方程式における入力条件を抽出して、抽出した入力条件をノードとして、論理記号（ＯＲ記号部、ＡＮＤ記号部およびＮＯＴ記号部）によって結合し、共通のノードを統合している。これによって、等価変換手段１０２により導出された出力変数についての方程式から、縮約された原因結果グラフを作成することができる。
【００９１】
図２０は、原因結果グラフからデシジョンテーブルを作成する動作を説明する図である。図２０を参照しながら、テーブル変換手段１０４による原因結果グラフからデシジョンテーブルへの変換について説明する。
【００９２】
図２０に示すように、テーブル変換手段１０４は、グラフ作成手段１０３により作成された原因結果グラフをデシジョンテーブル５０に変換する。デシジョンテーブルの形式は、様々な形式が存在するが、本実施形態においては、図２０に示すデシジョンテーブル５０のように、入力条件を示す「入力」、および出力変数を示す「出力」の各列で構成されたテーブルを作成するものとする。ただし、デシジョンテーブルの形式は、上述に限定されるものではない。
【００９３】
具体的には、まず、テーブル変換手段１０４は、テーブルの「入力」（入力条件）の欄に、グラフ作成手段１０３により作成された原因結果グラフにおけるすべてのノードの入力条件をそれぞれ記載する。図２０においては、入力条件として、「ｓａｍｐｌｅ＿ｖａｒｉａｂｌｅ１＞６１」、「ｓａｍｐｌｅ＿ｖａｒｉａｂｌｅ２＝＝１」および「ｓａｍｐｌｅ＿ｆｌａｇｓ＝＝１」が記載されている。そして、テーブル変換手段１０４は、テーブルの「出力」（出力変数）の欄に、出力変数を記載する。図２０においては、出力変数として、「Ｏｕｔｐｕｔ＿ｄａｔａ」が記載されている。
【００９４】
次に、テーブル変換手段１０４は、原因結果グラフに基づいて、各入力条件が真値「Ｔ」（ｔｒｕｅ）であるか、偽値「Ｆ」（ｆａｌｓｅ）であるかの組み合わせによって、出力値が取り得る値である「１」および「０」のいずれとなるかについての対応関係を記載する。
【００９５】
原因結果グラフから、入力条件「ｓａｍｐｌｅ＿ｖａｒｉａｂｌｅ１＞６１」が真値「Ｔ」であれば、入力条件「ｓａｍｐｌｅ＿ｖａｒｉａｂｌｅ２＝＝１」および「ｓａｍｐｌｅ＿ｆｌａｇｓ＝＝１」の真偽に関わりなく、出力値は「１」となる。したがって、テーブル変換手段１０４は、テーブルに、入力条件「ｓａｍｐｌｅ＿ｖａｒｉａｂｌｅ１＞６１」が真値「Ｔ」の場合、出力値は「１」となる対応関係を記載する。このとき、テーブルにおける入力条件「ｓａｍｐｌｅ＿ｖａｒｉａｂｌｅ２＝＝１」および「ｓａｍｐｌｅ＿ｆｌａｇｓ＝＝１」の欄は空欄としている。
【００９６】
また、原因結果グラフから、入力条件「ｓａｍｐｌｅ＿ｖａｒｉａｂｌｅ１＞６１」が偽値「Ｆ」、かつ入力条件「ｓａｍｐｌｅ＿ｆｌａｇｓ＝＝１」が真値「Ｔ」の場合、入力条件「ｓａｍｐｌｅ＿ｖａｒｉａｂｌｅ２＝＝１」の真偽によって、出力値は異なる。すなわち、入力条件「ｓａｍｐｌｅ＿ｖａｒｉａｂｌｅ２＝＝１」が偽値「Ｆ」の場合、出力値は「１」となり、真値「Ｔ」の場合、出力値は「０」となる。したがって、テーブル変換手段１０４は、テーブルに、入力条件「ｓａｍｐｌｅ＿ｖａｒｉａｂｌｅ１＞６１」が偽値「Ｆ」、「ｓａｍｐｌｅ＿ｖａｒｉａｂｌｅ２＝＝１」が偽値「Ｆ」、かつ「ｓａｍｐｌｅ＿ｆｌａｇｓ＝＝１」が真値「Ｔ」の場合、出力値は「１」となる対応関係を記載する。また、テーブル変換手段１０４は、テーブルに、入力条件「ｓａｍｐｌｅ＿ｖａｒｉａｂｌｅ１＞６１」が偽値「Ｆ」、「ｓａｍｐｌｅ＿ｖａｒｉａｂｌｅ２＝＝１」が真値「Ｔ」、かつ「ｓａｍｐｌｅ＿ｆｌａｇｓ＝＝１」が真値「Ｔ」の場合、出力値は「０」となる対応関係を記載する。
【００９７】
また、原因結果グラフから、入力条件「ｓａｍｐｌｅ＿ｖａｒｉａｂｌｅ１＞６１」および「ｓａｍｐｌｅ＿ｆｌａｇｓ＝＝１」が偽値「Ｆ」であれば、入力条件「ｓａｍｐｌｅ＿ｖａｒｉａｂｌｅ２＝＝１」の真偽に関わりなく、出力値は「０」となる。したがって、テーブル変換手段１０４は、テーブルに、入力条件「ｓａｍｐｌｅ＿ｖａｒｉａｂｌｅ１＞６１」および「ｓａｍｐｌｅ＿ｆｌａｇｓ＝＝１」が偽値「Ｆ」の場合、出力値は「０」となる対応関係を記載する。このとき、テーブルにおける入力条件「ｓａｍｐｌｅ＿ｖａｒｉａｂｌｅ２＝＝１」の欄は空欄としている。
【００９８】
以上の動作によって、テーブル変換手段１０４は、グラフ作成手段１０３により作成された原因結果グラフを、図２０に示すデシジョンテーブル５０に変換する。このように、テーブル変換手段１０４は、等価変換手段１０２により導出された、縮約された出力変数についての方程式から、グラフ作成手段１０３により縮約された原因結果グラフが作成され、この縮約された原因結果グラフに基づいてデシジョンテーブル５０に変換している。これによって、グラフ作成手段１０３により作成された原因結果グラフから、最適化された入力条件の組み合わせから構成されたコンパクトなデシジョンテーブルを求めることができる。
【００９９】
なお、上述したソースコードからデシジョンテーブルを生成する方法は一例であり、これに限定されるものではなく、その他の方法でデシジョンテーブルを生成するものとしてもよい。
【０１００】
図２１は、第１の実施形態に係る検証装置のデシジョンテーブルから検証用コードを作成する動作の概要を説明する図である。図２１を参照ながら、本実施形態に係る検証装置であるＰＣ１の等価性検証動作の流れの概要について説明する。
【０１０１】
図２１に示すように、検証対象ソースコード８０は、上述のように仕様抽出手段１００により仕様情報であるデシジョンテーブル８１が生成されているものとする。次に、等価性検証手段１５０のコード生成手段１５１は、デシジョンテーブル８１の入力条件のそれぞれの真偽の値を示す行（以下、入力条件行という）を抜き出して、検証対象ソースコード８０の前段側に、その入力条件行の入力条件を規定するコード（事前条件部８２）を設定する。また、コード生成手段１５１は、デシジョンテーブル８１から抜き出した入力条件行に対応する出力変数の値（出力値）を抜き出し、検証対象ソースコード８０の後段側に、その出力値を規定するコード（事後条件部８３）を設定する。このように、コード生成手段１５１は、事前条件部８２、検証対象ソースコード８０、および事後条件部８３を含んだ検証用コード８４を生成する。
【０１０２】
次に、コード生成手段１５１は、生成した検証用コード８４を、検証ツール８５（図２の検証手段１５２に相当）に出力する。検証用コード８４を入力した検証ツール８５は、検証用コード８４を解析し、検証対象ソースコード８０を実行した場合に、コード生成手段１５１により設定された入力条件を満たす場合に、設定された出力値となるか否かを検証する。そして、検証ツール８５は、検証の結果（ＯＫ・ＮＧ判定）を出力する。
【０１０３】
図２２は、第１の実施形態に係る検証装置の等価性検証動作の一例を示すフローチャートである。図２３は、検証用コードに事前条件および事後条件のコードを設定する例を示す図である。図２４は、検証用コードに事前条件および事後条件のコードを設定する別の例を示す図である。図２２〜２４を参照ながら検証装置であるＰＣ１の等価性検証動作の流れの詳細について説明する。なお、図２２においては、簡便に記載するため、デシジョンテーブルを「ＤＴ」と記載している。
【０１０４】
（ステップＳ２１）
等価性検証手段１５０のコード生成手段１５１は、記憶手段１６０の第１記憶手段１６１に記憶された、仕様抽出動作の対象、かつ、等価性の検証対象となるソースコード（検証対象ソースコード）を読み出して入力する。さらに、コード生成手段１５１は、記憶手段１６０の第２記憶手段１６２に記憶された、検証対象ソースコードに対する仕様抽出動作により生成されたデシジョンテーブルを読み出して入力する。また、コード生成手段１５１は、図２３に示すように、例えば、検証対象ソースコードのうち、関数「ｆｕｎｃ０１」について、仕様情報であるデシジョンテーブル９０との等価性の検証動作を行う。すなわち、デシジョンテーブル９０は、関数「ｆｕｎｃ０１」に含まれる出力変数「ｚ」のデシジョンテーブルである。
【０１０５】
図２３に示すように、コード生成手段１５１は、関数「ｆｕｎｃ０１」を検証対象とするために、検証用コード９１において、関数「ｆｕｎｃ０１」を使用するためのヘッダファイル「ｆｕｎｃ０１．ｈ」をインクルードするためのコードを、３行目に追記する。次に、コード生成手段１５１は、ソースコードが外部ファイルで記述されている関数「ｆｕｎｃ０１」を検証用コード９１内で呼び出すために、ｅｘｔｅｒｎ宣言（プロトタイプ宣言）をするためのコードを、６行目に追記する。そして、コード生成手段１５１は、単純に関数「ｆｕｎｃ０１」を実行するための関数「ｃｐｒｏｖｅｒ＿ｍａｉｎ」（引数・戻り値なし）を、１３行目に追記し、関数「ｆｕｎｃ０１」を実行するコード「ｆｕｎｃ０１（）；」（以下、実行コードという）を、１９行目に追記する。なお、単純に関数「ｆｕｎｃ０１」を実行するための関数名は、一例であり任意の関数名でよい。
【０１０６】
なお、コード生成手段１５１は、第１記憶手段１６１からソースコードを読み出して入力するものとしたが、これに限定されるものではなく、ユーザが操作部１２を介して直接、操作入力したソースコードを入力するものとしてもよい。
【０１０７】
（ステップＳ２２）
コード生成手段１５１の事前条件設定手段１５１ａは、デシジョンテーブル９０から１行ずつ入力条件行を抜き出す（抽出する）。具体的には、図２３に示すように、例えば、事前条件設定手段１５１ａが抜き出した行を入力条件行９００とする。
【０１０８】
また、コード生成手段１５１の事後条件設定手段１５１ｂは、デシジョンテーブル９０から事前条件設定手段１５１ａにより抜き出された入力条件行に対応する出力変数の値（出力値）を抜き出す（抽出する）。具体的には、図２３に示すように、例えば、事後条件設定手段１５１ｂが抜き出した出力変数の値を出力値９０１とする。そして、ステップＳ２３へ移行する。
【０１０９】
（ステップＳ２３）
事前条件設定手段１５１ａは、抜き出した入力条件行の入力条件の真偽値を規定するコードを事前条件として生成する。例えば、図２３に示す入力条件行９００は、入力条件「ｇ１＞１００」が真値（Ｔ）であり、かつ、入力条件「ｇ２＝＝０」が偽値（Ｆ）であることを示す。したがって、事前条件設定手段１５１ａは、入力条件行の入力条件の真偽値を規定するコードとして、「＿＿ＣＰＲＯＶＥＲ＿ａｓｓｕｍｅ（（ｇ１＞１００）＆＆！（ｇ２＝＝０））；」を生成する。この「＿＿ＣＰＲＯＶＥＲ＿ａｓｓｕｍｅ（）；」のコードは、入力条件の真偽を満たす場合、すなわち、入力条件「ｇ１＞１００」が真値、かつ、入力条件「ｇ２＝＝０」が偽値であるものと指定するコードである。
【０１１０】
事後条件設定手段１５１ｂは、抜き出した出力値を規定するコードを事後条件として生成する。例えば、図２３に示す出力値９０１は、入力条件行９００の真偽値を満たす場合、出力変数「ｚ」の値が「０」であることを示す。したがって、事後条件設定手段１５１ｂは、出力値を規定するコードとして、「＿＿ＣＰＲＯＶＥＲ＿ａｓｓｅｒｔ（ｚ＝＝（０））；」を生成する。この「＿＿ＣＰＲＯＶＥＲ＿ａｓｓｅｒｔ（ｚ＝＝（０））；」のコードは、入力条件行９００が示す入力条件の真偽値の場合であって、関数「ｆｕｎｃ０１」が実行された時点で、出力変数（図２３においては「ｚ」）が取るべき値を指定するコードである。そして、ステップＳ２４へ移行する。
【０１１１】
（ステップＳ２４）
事前条件設定手段１５１ａは、生成した「＿＿ＣＰＲＯＶＥＲ＿ａｓｓｕｍｅ（（ｇ１＞１００）＆＆！（ｇ２＝＝０））；」を、事前条件設定コード９１０として、検証用コード９１における実行コードの前段側（図２３では、１６行目）に追記する。また、事前条件設定手段１５１ａは、変数「ｇ１」、「ｇ２」を不定値とするために、検証用コード９１において、未定義関数「ｎｏｎｄｅｔ（）」を用いて型宣言をするためのコード「ｉｎｔ  ｇ１  ＝  ｎｏｎｄｅｔ（）；」および「ｉｎｔ  ｇ２  ＝  ｎｏｎｄｅｔ（）：」をそれぞれ追記している。これは、Ｃ言語の仕様に基づくものであり、他の言語で必要がなければ追記する必要はない。
【０１１２】
事後条件設定手段１５１ｂは、生成した「＿＿ＣＰＲＯＶＥＲ＿ａｓｓｅｒｔ（ｚ＝＝（０））；」を、事後条件設定コード９１１として、検証用コード９１における実行コードの後段側（図２３では、２２行目）に追記する。また、事後条件設定手段１５１ｂは、出力変数「ｚ」を不定値とするために、検証用コード９１において、未定義関数「ｎｏｎｄｅｔ（）」を用いて型宣言をするためのコード「ｉｎｔｚ１  ＝  ｎｏｎｄｅｔ（）；」を追記している。これは、Ｃ言語の仕様に基づくものであり、他の言語で必要がなければ追記する必要はない。
【０１１３】
なお、未定義関数として「ｎｏｎｄｅｔ（）」としているが、仮に表記した関数であり、未定義関数であればどのような関数でもよい。
【０１１４】
すなわち、コード生成手段１５１は、検証対象ソースコード、事前条件設定手段１５１ａにより生成された事前条件設定コード９１０、および、事後条件設定手段１５１ｂにおより生成された事後条件設定コード９１１等に基づいて、検証用コード９１を完成（生成）させる。そして、ステップＳ２５へ移行する。
【０１１５】
（ステップＳ２５）
等価性検証手段１５０の検証手段１５２は、コード生成手段１５１により生成された検証用コード（図２３では、検証用コード９１）を入力する。そして、検証手段１５２は、入力した検証用コードを実行することによって、検証対象ソースコード（具体的には、図２３に示す関数「ｆｕｎｃ０１」）と、仕様抽出手段１００により生成されたデシジョンテーブル（図２３では、デシジョンテーブル９０）との等価性の検証動作を行う。
【０１１６】
図２３の例では、検証手段１５２は、検証用コード９１を実行する場合に、「＿＿ＣＰＲＯＶＥＲ＿ａｓｓｕｍｅ（（ｇ１＞１００）＆＆！（ｇ２＝＝０））；」によって、「ｇ１＞１００」が真値、かつ、「ｇ２＝＝０」が偽値であるものとして、関数「ｆｕｎｃ０１」を実行する。そして、検証手段１５２は、関数「ｆｕｎｃ０１」を実行した時点で、「＿＿ＣＰＲＯＶＥＲ＿ａｓｓｅｒｔ（ｚ＝＝（０））；」によって、出力変数「ｚ」が指定された出力値「０」であるか否かの判定を行う。そして、ステップＳ２６へ移行する。
【０１１７】
（ステップＳ２６）
等価性検証手段１５０の結果出力手段１５３は、検証手段１５２により検証対象ソースコードに対して、デシジョンテーブルの入力条件行ごとに行われた等価性の検証動作の検証結果を出力する。結果出力手段１５３は、例えば、検証結果をデータとして出力し記憶部１４に記憶させて保存するものとしてもよく、検証結果を表示部１３に表示させるものとしてもよい。
【０１１８】
上述のステップＳ２２〜２６の処理を、デシジョンテーブル（図２３では、デシジョンテーブル９０）のすべての入力条件行に対して行う。その後、ステップＳ２７へ移行する。
【０１１９】
（ステップＳ２７）
検証手段１５２は、デシジョンテーブルのすべての入力条件行、およびそれに対応する出力値について、検証対象ソースコードと、デシジョンテーブルとの等価性の検証動作を行った後、検証結果が判定ＮＧとなる入力条件行が１つでも存在するか否かを求める。検証結果が判定ＮＧとなる入力条件行が１つも存在しない場合（ステップＳ２７：Ｎｏ）、ステップＳ２８へ移行し、存在する場合（ステップＳ２７：Ｙｅｓ）、ステップＳ２９へ移行する。
【０１２０】
（ステップＳ２８）
検証手段１５２は、等価性の検証動作の結果、デシジョンテーブルで判定ＮＧとなる入力条件行が１つも存在しない場合、デシジョンテーブルと、検証対象ソースコードとは等価であるものと判定する。検証手段１５２は、この判定結果（検証結果）を結果出力手段１５３に送る。そして、ステップＳ３０へ移行する。
【０１２１】
（ステップＳ２９）
検証手段１５２は、等価性の検証動作の結果、デシジョンテーブルで判定ＮＧとなる入力条件行が１つでも存在する場合、デシジョンテーブルと、検証対象ソースコードとは等価でないものと判定する。検証手段１５２は、この判定結果（検証結果）を結果出力手段１５３に送る。そして、ステップＳ３０へ移行する。
【０１２２】
（ステップＳ３０）
結果出力手段１５３は、検証手段１５２により検証対象ソースコードに対する等価性の検証動作の検証結果を出力する。結果出力手段１５３は、例えば、検証結果をデータとして出力し記憶部１４に記憶させて保存するものとしてもよく、検証結果を表示部１３に表示させるものとしてもよい。そして、等価性検証動作を終了する。
【０１２３】
なお、上述の図２３に示すデシジョンテーブル９０では、出力値はすべて特定の値をとる場合を示したが、図２４に示すデシジョンテーブル９０ａのように、出力変数「ｚ」の出力値として不変値（この場合「ｚ」と記載するものとする）を含む場合を想定する。この場合、事前条件設定手段１５１ａによって、デシジョンテーブル９０ａから入力条件行９００ａが抜き出され、入力条件の真偽値を規定するコードとして、「＿＿ＣＰＲＯＶＥＲ＿ａｓｓｕｍｅ（（ｇ１＞１００）＆＆！（ｇ２＝＝０））；」が生成され、このコードを事前条件設定コード９１０ａとして検証用コード９１ａに追記される動作は、上述の入力条件行９００および事前条件設定コード９１０と同様である。
【０１２４】
一方、出力変数「ｚ」が不変値であるか否か、すなわち、関数「ｆｕｎｃ０１」の実行前後で出力変数「ｚ」の値が変わらないか否かを検証する場合には、関数「ｆｕｎｃ０１」の実行前の出力変数「ｚ」の値を取得しておく必要がある。したがって、事後条件設定手段１５１ｂは、関数「ｆｕｎｃ０１」の実行前の出力変数「ｚ」の値を仮変数「ｚ＿ｔｍｐ」に退避させるために、図２４に示すように、検証用コード９１ａの１５行目に、「ｉｎｔ  ｚ＿ｔｍｐ  ＝  ｚ；」のコードを追記する。そして、事後条件設定手段１５１ｂは、事前条件設定手段１５１ａにより抜き出された入力条件行９００ａに対応する出力変数の値（不変値）である出力値９０１ａを抜き出す。そして、事後条件設定手段１５１ｂは、不変値の出力値９０１ａを規定するコードとして、「＿＿ＣＰＲＯＶＥＲ＿ａｓｓｅｒｔ（ｚ＝＝ｚ＿ｔｍｐ）；」を生成する。この「＿＿ＣＰＲＯＶＥＲ＿ａｓｓｅｒｔ（ｚ＝＝ｚ＿ｔｍｐ）；」のコードは、入力条件行９００ａが示す入力条件の真偽値の場合であって、関数「ｆｕｎｃ０１」が実行された時点で、出力変数「ｚ」が不変のままであるか否かを検証するコードである。そして、事後条件設定手段１５１ｂは、生成した「＿＿ＣＰＲＯＶＥＲ＿ａｓｓｅｒｔ（ｚ＝＝ｚ＿ｔｍｐ）；」を、事後条件設定コード９１１ａとして、検証用コード９１ａにおける実行コードの後段側（図２４では、２４行目）に追記する。
【０１２５】
これによって、出力変数の出力値として不変値を含む場合であっても、検証対象ソースコード（関数）の実行後においても、出力変数が不変であるか否かを検証することが可能となる。
【０１２６】
また、上述の図２３では、検証対象ソースコードが外部ファイルで記述されている場合であって、ｅｘｔｅｒｎ宣言をすることにより、外部ファイルで記述されている等価性検証動作の対象となる関数を呼び出すものとしたが、これに限定されるものではない。例えば、図２３に示す検証用コード９１において、１９行目の「ｆｕｎｃ０１（）；」の代わりに、検証対象ソースコードの関数が記述されたコードそのもの（実行コード）を記述するものとしてもよい。
【０１２７】
以上の動作のように、本実施形態に係る検証装置（ＰＣ１）は、検証対象ソースコードについて仕様抽出手段１００による仕様抽出動作によって、デシジョンテーブルを生成し、等価性検証手段１５０による等価性検証動作によって、デシジョンテーブルと検証対象ソースコードとが等価であるか否かを検証するものとしている。これによって、仕様抽出手段１００による仕様抽出動作によって生成したデシジョンテーブルが、元のソースコード（検証対象ソースコード）と等価であるか否か、すなわち、生成されたデシジョンテーブルがソースコードの仕様情報として正確な情報であるか否かを検証することができる。
【０１２８】
また、コード生成手段１５１は、検証対象ソースコードを編集することなく、デシジョンテーブルの入力条件行および出力値から生成したコードに基づいて、検証用コードを生成するものとしている。これによって、検証対象ソースコードに対して、検証用コードを生成するためのコメント等を記述する必要がなく、検証用コードを自動生成することができるので、検証対象ソースコードとデシジョンテーブルとの等価性の検証を効率的に行うことができる。
【０１２９】
また、等価性検証手段１５０への入力情報を、入力条件と出力値とが構造化されたデシジョンテーブルとしている。これによって、検証手段１５２による仕様情報（デシジョンテーブル）とソースコードとの等価性の検証動作をまとめて効率的に行うことができる。
【０１３０】
なお、図２に示すように、仕様抽出手段１００および等価性検証手段１５０は、双方、ＰＣ１が有するものとしたが、これに限定されるものではない。例えば、仕様抽出手段１００を有する装置と、等価性検証手段１５０を有する装置とを別々の装置として、これらの装置が全体として上述の実施形態の動作を実現する検証システムを構成するものとしてもよい。この場合、仕様抽出手段１００を有する装置により生成されたデシジョンテーブルのデータは、通信手段（有線または無線を問わない）によって、等価性検証手段１５０を有する装置に送信され、等価性検証手段１５０を有する装置は、受信したデシジョンテーブルのデータを用いて等価性検証動作を実行するものとしてもよい。さらに、仕様抽出手段１００と等価性検証手段１５０とがそれぞれ別の装置に備えられる構成に限定されるものではなく、これらが含む各手段がさらに別の装置に備えられるものとしてもよい。例えば、等価性検証手段１５０のうち、検証手段１５２だけ別の装置に備えられるものとし、コード生成手段１５１により生成した検証コードに基づく等価性検証動作を、検証手段１５２を有する装置に委託する、という構成であってもよい。
【０１３１】
（第２の実施形態）
本実施形態のＰＣ１について、第１の実施形態のＰＣ１と相違する点を中心に説明する。第１の実施形態においては、仕様抽出手段１００により生成されたデシジョンテーブルを用いて、検証対象ソースコードと等価であるか否かを検証する動作を説明した。本実施形態においては、例えば、検証対象ソースコードについてユーザ自身が作成したデシジョンテーブルと、その検証対象ソースコードとが等価であるか否かを検証する動作について説明する。なお、本実施形態のＰＣ１のハードウェア構成および機能ブロック構成は、それぞれ上述の図１および２に示した構成と同様である。以下、特に機能ブロック構成について、第１の実施形態と相違する点を説明する。
【０１３２】
等価性検証手段１５０は、例えば、検証対象ソースコードについてユーザ自身により作成されたデシジョンテーブル（すなわち、ＰＣ１とは無関係に独立に外部で作成されたデシジョンテーブル）と、その検証対象ソースコードとの等価性を検証する機能部である。等価性検証手段１５０は、コード生成手段１５１と、検証手段１５２と、結果出力手段１５３と、を有する。なお、コード生成手段１５１、検証手段１５２および結果出力手段１５３の機能は、第１の実施形態と同様である。
【０１３３】
記憶手段１６０は、制御部１６により実行される各種プログラム、およびＰＣ１で行われる各種処理に使用されるデータ等を記憶する機能部である。記憶手段１６０は、第１記憶手段１６１と、第２記憶手段１６２と、を有する。
【０１３４】
第１記憶手段１６１は、等価性の検証対象となるソースコードを記憶する機能部である。第２記憶手段１６２は、例えば、検証対象ソースコードについてユーザ自身により作成されたデシジョンテーブルをデータとして記憶する機能部である。
【０１３５】
以上のように、本実施形態に係る検証装置（ＰＣ１）は、第１の実施形態のように仕様抽出手段１００により生成されたデシジョンテーブルではなく、例えば、検証対象ソースコードについてユーザ自身により作成されたデシジョンテーブルと、その検証対象ソースコードとの等価性を検証するものとしている。これによって、ユーザ自身により作成されたデシジョンテーブルが、検証対象ソースコードと等価であるか否か、すなわち、ユーザ自身により作成されたデシジョンテーブルが、検証対象ソースコードの振る舞いを正確に示す仕様情報であるか否かを検証することができる。
【０１３６】
なお、本実施形態に係るＰＣ１は、ユーザ自身により作成されたデシジョンテーブルと検証対象ソースコードとの等価性の検証動作のみに特化するものであれば、仕様抽出手段１００は備えていなくてもよい。
【０１３７】
（第３の実施形態）
本実施形態のＰＣ１について、第１の実施形態のＰＣ１と相違する点を中心に説明する。第１の実施形態においては、仕様抽出手段１００により生成されたデシジョンテーブルを用いて、検証対象ソースコードと等価であるか否かを検証する動作を説明した。本実施形態においては、バージョンアップ（以下、派生開発ともいう）される前のソースコード（以下、レガシーソースコードともいう）に対して仕様抽出手段１００によりデシジョンテーブルを生成させ、このデシジョンテーブルと、派生開発後のソースコードとの等価性の検証動作について説明する。なお、本実施形態のＰＣ１のハードウェア構成および機能ブロック構成は、それぞれ上述の図１および２に示した構成と同様である。以下、特に機能ブロック構成について、第１の実施形態と相違する点を説明する。
【０１３８】
等価性検証手段１５０は、仕様抽出手段１００による仕様抽出動作により生成されたデシジョンテーブルと、仕様抽出動作の対象となったソースコードから派生開発されたソースコードとの等価性を検証する機能部である。この場合、検証対象ソースコードは、仕様抽出動作の対象となったソースコードから派生開発されたソースコードとなる。等価性検証手段１５０は、コード生成手段１５１と、検証手段１５２と、結果出力手段１５３と、を有する。なお、コード生成手段１５１、検証手段１５２および結果出力手段１５３の機能は、第１の実施形態と同様である。
【０１３９】
記憶手段１６０は、制御部１６により実行される各種プログラム、およびＰＣ１で行われる各種処理に使用されるデータ等を記憶する機能部である。記憶手段１６０は、図１に示す、記憶部１４によって実現される。記憶手段１６０は、第１記憶手段１６１と、第２記憶手段１６２と、を有する。
【０１４０】
第１記憶手段１６１は、仕様抽出動作の対象となるレガシーソースコード、および、そのソースコードから派生開発された検証対象ソースコードを記憶する機能部である。第２記憶手段１６２は、派生開発される前のレガシーソースコードについて仕様抽出手段１００により生成されたデシジョンテーブルをデータとして記憶する機能部である。
【０１４１】
図２５は、第３の実施形態に係る検証装置のデシジョンテーブルから検証用コードを作成する動作の概要を説明する図である。図２５を参照しながら、本実施形態に係る検証装置であるＰＣ１の等価性検証動作の流れについて説明する。
【０１４２】
図２５に示すように、検証対象ソースコード８０ａは、レガシーソースコード８６から派生開発されたソースコードである。まず、仕様抽出手段１００は、レガシーソースコード８６について仕様情報であるデシジョンテーブル８１ａを生成する。次に、等価性検証手段１５０のコード生成手段１５１は、デシジョンテーブル８１ａの入力条件のそれぞれの真偽の値を示す行（以下、入力条件行という）を抜き出して、検証対象ソースコード８０ａの前段側に、その入力条件行の入力条件を規定するコード（事前条件部８２ａ）を設定する。また、コード生成手段１５１は、デシジョンテーブル８１ａから抜き出した入力条件行に対応する出力変数の値（出力値）を抜き出し、検証対象ソースコード８０ａの後段側に、その出力値を規定するコード（事後条件部８３ａ）を設定する。このように、コード生成手段１５１は、事前条件部８２ａ、検証対象ソースコード８０ａ、および事後条件部８３ａを含んだ検証用コード８４ａを生成する。
【０１４３】
次に、コード生成手段１５１は、生成した検証用コード８４ａを、検証ツール８５（図２の検証手段１５２に相当）に出力する。検証用コード８４ａを入力した検証ツール８５は、検証用コード８４ａを解析し、検証対象ソースコード８０ａを実行した場合に、コード生成手段１５１により設定された入力条件を満たす場合に、設定された出力値となるか否かを検証する。そして、検証ツール８５は、検証の結果（ＯＫ・ＮＧ判定）を出力する。なお、上述の等価性検証動作の詳細は、第１の実施形態における図２２〜２４で説明した動作内容に準じる。
【０１４４】
以上のように、本実施形態に係る検証装置（ＰＣ１）は、派生開発される前のレガシーソースコードに対して仕様抽出手段１００によりデシジョンテーブルを生成させ、このデシジョンテーブルと、派生開発後のソースコードとの等価性の検証動作を行うものとしている。これによって、等価性検証手段１５０の検証結果により、レガシーソースコードと、派生開発されたソースコードとが、どのように動作仕様が異なるのかを把握することができる。また、レガシーソースコードから派生開発するにしても、機能として変更すべきでないコード部分も存在する。この場合、本実施形態に係る検証装置によれば、レガシーソースコードから生成されたデシジョンテーブルと、派生開発されたソースコードとの等価性の検証動作を行うことにより、変更すべきでない機能が保持されているか否かを確認することができる。
【０１４５】
なお、レガシーソースコード８６から生成されたデシジョンテーブル８１ａを、検証対象ソースコード８０ａ用にユーザ自身がデシジョンテーブルを編集し、このデシジョンテーブルと、検証対象ソースコード８０ａとの等価性の検証動作を行うことにより、ユーザ自身が作成したデシジョンテーブルが、検証対象ソースコード８０ａの振る舞いを正確に規定した仕様情報であるか否かを確認することもできる。逆に、ユーザ自身がデシジョンテーブル８１ａを検証対象ソースコード８０ａ用に編集したデシジョンテーブルの仕様通りに、検証対象ソースコード８０ａが動作するか否かを確認することもできる。
【０１４６】
また、等価性検証手段１５０は、仕様抽出手段１００による仕様抽出動作により生成されたデシジョンテーブルと、仕様抽出動作の対象となったソースコードから派生開発されたソースコードとの等価性を検証するものとしたが、これに限定されるものではない。例えば、等価性検証手段１５０は、仕様抽出手段１００により派生開発されたソースコードに対して仕様抽出動作が行われて生成されたデシジョンテーブルと、派生開発前のソースコード（レガシーソースコード）との等価性を検証するものとしてもよい。これによっても、等価性検証手段１５０の検証結果により、レガシーソースコードと、派生開発されたソースコードとが、どのように動作仕様が異なるのかを把握することができる。
【０１４７】
なお、上述の各実施形態に係るＰＣ１で実行されるプログラムは、ＲＯＭ等に予め組み込まれて提供される。また、上述の各実施形態に係るＰＣ１で実行されるプログラムは、インストール可能な形式または実行可能な形式のファイルでＣＤ−ＲＯＭ（Ｃｏｍｐａｃｔ  Ｄｉｓｋ  Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、フレキシブルディスク（ＦＤ）、ＣＤ−Ｒ（Ｃｏｍｐａｃｔ  Ｄｉｓｋ  Ｒｅｃｏｒｄａｂｌｅ）、ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｋ）等のコンピュータで読み取り可能な記憶媒体に記憶してコンピュータプログラムプロダクトとして提供されるように構成してもよい。
【０１４８】
さらに、上述の各実施形態に係るＰＣ１で実行されるプログラムを、インターネット等のネットワークに接続されたコンピュータ上に格納し、ネットワーク経由でダウンロードさせることにより提供するように構成してもよい。また、上述の各実施形態に係るＰＣ１で実行されるプログラムをインターネット等のネットワーク経由で提供または配布するように構成してもよい。
【０１４９】
また、上述の各実施形態のＰＣ１で実行されるプログラムは、コンピュータを上述したＰＣ１の各機能部として機能させ得る。このコンピュータは、ＣＰＵ（制御部１６）がコンピュータ読取可能な記憶媒体からプログラムを主記憶装置上に読み出して実行することができる。
【０１５０】
本発明の各実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。この新規な各実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換えおよび変更を行うことができる。これら実施形態は、発明の範囲および要旨に含まれるとともに、特許請求の範囲に記載された発明およびその均等の範囲に含まれる。
【符号の説明】
【０１５１】
１  ＰＣ
１１  通信部
１２  操作部
１３  表示部
１４  記憶部
１５  外部記憶装置
１６  制御部
１７  ＣＤ−ＲＯＭ
１８  ＣＤ−ＲＯＭドライブ
１９  バス
２０  対象モジュール
２１〜２４  処理後モジュール
２５  対象モジュール
２６  等価変換後モジュール
３０、３０ａ〜３０ｃ  サンプルコード
３１  定数伝播処理後コード
３１ａ  入力変数伝播処理後コード
３１ｂ  枝刈り処理後コード
３１ｃ  条件式情報伝播処理後コード
４０〜４５  ノード
４２ａ、４３ａ  ノード
５０  デシジョンテーブル
６０  ＯＲ記号部
６１  ＡＮＤ記号部
６２ａ、６２ｂ  ＮＯＴ記号部
７０  出力値ノード
８０、８０ａ  検証対象ソースコード
８１、８１ａ  デシジョンテーブル
８２、８２ａ  事前条件部
８３、８３ａ  事後条件部
８４、８４ａ  検証用コード
８５  検証ツール
８６  レガシーソースコード
９０、９０ａ  デシジョンテーブル
９１、９１ａ  検証用コード
１００  仕様抽出手段
１０１  出力変数特定手段
１０２  等価変換手段
１０３  グラフ作成手段
１０４  テーブル変換手段
１５０  等価性検証手段
１５１  コード生成手段
１５１ａ  事前条件設定手段
１５１ｂ  事後条件設定手段
１５２  検証手段
１５３  結果出力手段
１６０  記憶手段
１６１  第１記憶手段
１６２  第２記憶手段
２００、２０１  グローバル変数
２０２〜２０４  入力条件部
２０５、２０６、２０７ａ〜２０７ｃ、２０８  コード部
２１０  定数伝播処理後コード部
２１１  入力変数伝播処理後コード部
２１２ａ〜２１２ｃ、２１３  定数伝播処理後コード部
２１４  コード部
２２０  枝刈り処理後コード部
２２１  コード部
２３０  条件式情報伝播処理後コード部
２３１  コード部
２４０  条件式情報伝播処理後コード部
２４１  方程式
２５０  仮変数設定コード部
２６０  方程式コード部
３００〜３０３  コード部
３００ａ、３０１ａ  コード部
３００ｂ、３０１ｂ  コード部
３００ｃ  コード部
３１０〜３１２  定数伝播処理後コード部
３１０ａ  入力変数伝播処理後コード部
３１０ｂ  枝刈り処理後コード部
３１０ｃ  条件式情報伝播処理後コード部
９００、９００ａ  入力条件行
９０１、９０１ａ  出力値
９１０、９１０ａ  事前条件設定コード
９１１、９１１ａ  事後条件設定コード
【図１】
0006363027.tif 000002
【図２】
0006363027.tif 000003
【図３】
0006363027.tif 000004
【図４】
0006363027.tif 000005
【図５】
0006363027.tif 000006
【図６】
0006363027.tif 000007
【図７】
0006363027.tif 000008
【図８】
0006363027.tif 000009
【図９】
0006363027.tif 000010
【図１０】
0006363027.tif 000011
【図１１】
0006363027.tif 000012
【図１２】
0006363027.tif 000013
【図１３】
0006363027.tif 000014
【図１４】
0006363027.tif 000015
【図１５】
0006363027.tif 000016
【図１６】
0006363027.tif 000017
【図１７】
0006363027.tif 000018
【図１８】
0006363027.tif 000019
【図１９】
0006363027.tif 000020
【図２０】
0006363027.tif 000021
【図２１】
0006363027.tif 000022
【図２２】
0006363027.tif 000023
【図２３】
0006363027.tif 000024
【図２４】
0006363027.tif 000025
【図２５】
0006363027.tif 000026