(58)【調査した分野】(Int.Cl.,DB名)
前記第1変換手段は、前記等価変換処理として、定数伝播処理、入力変数伝播処理および枝刈り処理のループ処理を実行することによって前記ソースコードを縮約し、該ソースコードの縮約が収束した時点で前記ループ処理を終了する請求項1または2に記載の検証装置。
前記検証手段は、前記ソースコードが実行された場合に、前記デシジョンテーブルで規定された前記入力条件に応じて、前記出力変数の値が出力されるか否かを判定することにより、前記等価性を検証する請求項1〜3のいずれか一項に記載の検証装置。
【発明を実施するための形態】
【0011】
以下の図面において、同一の部分には同一の符号が付してある。ただし、図面は模式的なものであり、厚みと平面寸法との関係、各層の厚みの比率等は現実のものとは異なる場合がある。したがって、具体的な厚みおよび寸法は以下の説明を参酌して判断すべきものである。
【0012】
(第1の実施形態)
図1は、第1の実施形態に係る検証装置のハードウェア構成の一例を示す図である。
図1を参照しながら、検証装置の一例であるPC1のハードウェア構成について説明する。
【0013】
図1に示すように、検証装置の一例であるPC1は、通信部11と、操作部12と、表示部13と、記憶部14と、外部記憶装置15と、制御部16と、CD−ROMドライブ18と、備えている。上述の各部は、バス19によって接続され、互いにデータの送受信が可能となっている。
【0014】
通信部11は、外部機器と通信する装置である。通信部11は、例えば、NIC(Network Interface Card)等の通信装置によって実現される。通信部11の通信プロトコルとして、例えば、TCP(Transmission Control Protocol)/IP(Internet Protocol)またはUDP(User Datagram Protocol)/IP等を適用できる。
【0015】
操作部12は、ユーザによって制御部16に対して所定の処理を実行させるための操作入力を行う装置である。操作部12は、例えば、マウス、キーボード、テンキー、タッチパッド、またはタッチパネルにおける操作入力機能によって実現される。
【0016】
表示部13は、制御部16により実行されているアプリケーション画像等を表示する装置である。表示部13は、例えば、CRT(Cathode Ray Tube)ディスプレイ、液晶ディスプレイ、プラズマディスプレイまたは有機EL(Electroluminescence)ディスプレイ等によって実現される。
【0017】
記憶部14は、PC1で実行される各種プログラムおよびPC1で行われる各種処理に使用されるデータ等を記憶する装置である。記憶部14は、例えば、ROM(Read Only Memory)およびRAM(Random Access Memory)等の記憶装置によって実現される。
【0018】
外部記憶装置15は、プログラム、ソースコード、および各種データ等を蓄積して記憶する記憶装置である。外部記憶装置15は、例えば、HDD(Hard Disk Drive)、SSD(Solid State Drive)、光ディスク、または光磁気ディスク(MO:Magneto−Optical Disk)等の記憶装置によって実現される。
【0019】
制御部16は、PC1の各部の動作を制御する装置である。制御部16は、例えば、CPU(Central Processing Unit)およびASIC(Application Specific Integrated Circuit)等で実現される。
【0020】
CD−ROMドライブ18は、着脱自在な記憶媒体の一例としてのCD−ROM(Compact Disc Read Only Memory)17に対するデータの読み出しおよび書き込みを制御する装置である。なお、上述の着脱可能な記憶媒体の他の例として、CD−R(Compact Disc Recordable)、DVD(Digital Versatile Disk)またはブルーレイディスク等のコンピュータで読み取り可能な記憶媒体に記憶して提供するように構成してもよい。
【0021】
図2は、第1の実施形態に係る検証装置の機能ブロックの構成の一例を示す図である。
図2を参照しながら、PC1の機能ブロックの構成について説明する。
【0022】
図2に示すように、PC1は、各機能を実現する手段として、仕様抽出手段100(テーブル生成手段)と、等価性検証手段150と、記憶手段160と、を有する。
【0023】
仕様抽出手段100は、仕様抽出動作の対象となるソフトウェアのモジュール(対象モジュール)のソースコードから、仕様情報としてのデシジョンテーブル(決定表)を生成する機能部である。仕様抽出手段100は、出力変数特定手段101(特定手段)と、等価変換手段102(第1変換手段)と、グラフ作成手段103(作成手段)と、テーブル変換手段104(第2変換手段)と、を有する。
【0024】
出力変数特定手段101は、仕様抽出動作の対象となるソフトウェアのモジュール(対象モジュール)のソースコード(例えば、後述の第1記憶手段161に記憶されたソースコード)に含まれる出力変数(例えば、グローバル変数)を抽出して特定する機能部である。ここで、グローバル変数とは、ソフトウェアの各モジュールの外で宣言された変数であり、いずれのモジュールにおいても参照および更新が可能な変数である。
【0025】
等価変換手段102は、モジュールのソースコードに対して等価変換処理を実行して、ソースコードを縮約し、出力変数についての方程式を導出する機能部である。等価変換処理として、定数伝播処理、入力変数伝播処理、枝刈り処理および条件式情報伝播処理等があるが、各処理の詳細については後述する。
【0026】
グラフ作成手段103は、等価変換手段102により導出された出力変数についての方程式から、原因結果グラフを作成する機能部である。ここで、原因結果グラフとは、1または複数の入力条件をノードとして、各ノードを論理記号により結合し、入力条件の組み合わせから出力値を導出するためのグラフである。原因結果グラフを作成する動作の詳細については後述する。
【0027】
テーブル変換手段104は、グラフ作成手段103により作成された原因結果グラフをデシジョンテーブルに変換する機能部である。ここで、デシジョンテーブルとは、入力条件の組み合わせから出力変数の値(出力値)がどのような値をとるかを示す表であり、モジュールの振る舞いを表現する、すなわち、モジュールの仕様を決定付けるものである。
【0028】
等価性検証手段150は、仕様抽出手段100による仕様抽出動作により生成されたデシジョンテーブルと、仕様抽出動作の対象となったソースコードとの等価性を検証する機能部である。ここで、等価性を有するとは、ソースコードを実行した場合に、仕様情報(例えば、デシジョンテーブル)で規定された振る舞い通りに動作する場合をいうものとする。等価性検証手段150は、コード生成手段151と、検証手段152と、結果出力手段153と、を有する。
【0029】
コード生成手段151は、ソースコードとデシジョンテーブルとの等価性を検証するための検証用コードを生成する機能部である。コード生成手段151は、事前条件設定手段151a(第1生成手段)と、事後条件設定手段151b(第2生成手段)と、を有する。
【0030】
事前条件設定手段151aは、等価性の検証対象となるソースコード(以下、検証対象ソースコードという)に対する検証用コードに、仕様抽出手段100により生成されたデシジョンテーブルの入力条件を規定するコード(第1コード)を設定する機能部である。事後条件設定手段151bは、検証対象ソースコードに対する検証用コードに、仕様抽出手段100により生成されたデシジョンテーブルの事前条件設定手段151aにより設定された入力条件に対応する出力変数の値(出力値)を規定するコード(第2コード)を設定する機能部である。
【0031】
検証手段152は、コード生成手段151により生成された検証用コードを解析し、検証対象ソースコードを実行した場合に、事前条件設定手段151aにより設定された入力条件を満たす場合に、事後条件設定手段151bにより設定された出力値となるか否かを検証する機能部である。検証手段152は、例えば、CBMC(Bounded Model Checking for C/C++)等の既存のモデル検査ツール(モデル検査ソフトウェア)を利用することが可能である。
【0032】
結果出力手段153は、検証手段152により検証された検証対象ソースコードの検証結果を出力する機能部である。結果出力手段153は、例えば、検証結果をデータとして出力し記憶部14に記憶させて保存するものとしてもよく、検証結果を表示部13に表示させるものとしてもよい。
【0033】
なお、本実施形態における「モジュール」とは、特定の機能を有するソフトウェア部品であり、その実体であるプログラムのコードを「ソースコード」と記載しているが、双方を明確に区別することを意図するものではない。
【0034】
記憶手段160は、制御部16により実行される各種プログラム、およびPC1で行われる各種処理に使用されるデータ等を記憶する機能部である。記憶手段160は、
図1に示す、記憶部14によって実現される。記憶手段160は、第1記憶手段161と、第2記憶手段162と、を有する。
【0035】
第1記憶手段161は、仕様抽出動作の対象、かつ、等価性の検証対象となるソースコードを記憶する機能部である。第2記憶手段162は、仕様抽出手段100により生成されたデシジョンテーブルをデータとして記憶する機能部である。
【0036】
上述の出力変数特定手段101、等価変換手段102、グラフ作成手段103、テーブル変換手段104、コード生成手段151、検証手段152および結果出力手段153は、PC1の制御部16が外部記憶装置15等に記憶されたプログラムを記憶部14に読み出して実行することにより実現される。なお、出力変数特定手段101、等価変換手段102、グラフ作成手段103、テーブル変換手段104、コード生成手段151、検証手段152および結果出力手段153は、すべてがプログラムの実行により実現されることに限定されるものではなく、少なくともいずれかが、ハードウェア回路によって実現されるものとしてもよい。
【0037】
また、
図2に示す機能ブロックの構成は、機能を概念的に示したものであって、このような構成に限定されるものではない。例えば、
図2で独立した機能部として図示した複数の機能部を、1つの機能部として構成してもよい。一方、
図2の1つの機能部が有する機能を複数の分割し、複数の機能部として構成するものとしてもよい。
【0038】
図3は、モジュールが入力変数から出力変数の値を生成する動作を説明する図である。
図3を参照しながら、対象モジュール20について、モジュールとしての動作の概要を説明する。
【0039】
図3に示すように、対象モジュール20は、入力変数に格納された値(入力値)に基づいて、所定の処理を実行し、出力変数に出力値を格納して出力する機能を有する。対象モジュール20の入力変数の値は、対象モジュール20の外部から入力されるデータであって、例えば、引数およびグローバル変数に格納される。対象モジュール20の出力変数の値は、対象モジュール20の外部に伝達されるデータであって、例えば、対象モジュール20内で更新されるグローバル変数の値である。このような、対象モジュール20の入出力関係に基づいた動作仕様を抽出することが、上述のデシジョンテーブルを求めることに相当する。
【0040】
図4は、第1の実施形態に係る検証装置の仕様抽出動作の一例を示すフローチャートである。
図5は、定数伝播処理を説明する図である。
図6は、入力変数伝播処理を説明する図である。
図7は、枝刈り処理を説明する図である。
図8は、条件式情報伝播処理を説明する図である。
図9は、等価変換処理のうち定数伝播処理、入力変数伝播処理および枝刈り処理のループ処理を示すフローチャートである。
図4〜9を参照しながら、検証装置であるPC1の仕様抽出動作の流れについて説明する。
【0041】
(ステップS10)
出力変数特定手段101は、第1記憶手段161に記憶された対象モジュールのソースコードを読み出して入力する。出力変数特定手段101は、ソースコードに含まれる関数における出力変数を特定する。具体的には、出力変数特定手段101は、出力変数として、ソースコードに含まれる関数における、更新されているグローバル変数を特定する。そして、ステップS11へ移行する。
【0042】
なお、出力変数特定手段101は、出力変数として、ソースコードに含まれる関数において、更新されるグローバル変数を特定するものとしているが、これに限定されるものではない。例えば、出力変数特定手段101は、対象モジュールのグローバル変数ではなく、関数の戻り値を、出力変数として特定してもよい。
【0043】
また、出力変数特定手段101は、第1記憶手段161からソースコードを読み出して入力するものとしたが、これに限定されるものではなく、ユーザが操作部12を介して直接、操作入力したソースコードを入力するものとしてもよい。
【0044】
(ステップS11)
等価変換手段102は、対象モジュールのソースコードにおいて等価変換処理を実行し、出力変数についての方程式を導出する。具体的には、等価変換手段102は、等価変換処理として、定数伝播処理、入力変数伝播処理、枝刈り処理および条件式情報伝播処理を実行する。
【0045】
ここで、
図5を参照しながら、定数伝播処理の内容について説明する。定数伝播処理は、ソースコードにおいて、変数への定数の代入箇所を開始点として、その変数を読み取る(参照する)時点で有効かどうかを判定し、有効である場合、定数に置き換える処理である。
図5に示すサンプルコード30に対して、定数伝播処理を実行した結果のコードを定数伝播処理後コード31とする。
【0046】
まず、サンプルコード30のコード部300において、定数「1」が変数「A」に代入されているので、この代入している箇所を開始点とする。
【0047】
次に、サンプルコード30のコード部301において、変数「A」が参照されている。変数「A」には、コード部300において定数「1」が代入されており、コード部301において、変数「A」を参照すると定数「1」を得ることができるので、この変数「A」を定数「1」に置き換える。その結果、コード部301(「B=A+1;」)は、定数伝播処理後コード31の定数伝播処理後コード部310(「B=2;」)に置き換えることができる。
【0048】
次に、同様に、コード部301が、定数伝播処理後コード部310に置き換えられた結果、サンプルコード30のコード部302(「C=B;」)は、定数伝播処理後コード31の定数伝播処理後コード部311(「C=2;」)に置き換えることができる。
【0049】
そして、コード部300における変数「A」への定数「1」の代入から、サンプルコード30のコード部303(「Func(A);」)は、定数伝播処理後コード31の定数伝播処理後コード部312(「Func(1);」)に置き換えることができる。これは、関数「Func」の引数としての変数「A」が定数「1」に置き換えられたことを意味する。
【0050】
以上の動作にように、定数伝播処理は、ソースコード中の変数を定数に置き換えることによって、ソースコードを簡略化して縮約することができる。
【0051】
次に、
図6を参照しながら、入力変数伝播処理の内容について説明する。入力変数伝播処理は、グローバル変数である入力変数を使って計算される変数の箇所を起点として、その下流でその変数を用いる式において、その変数を入力変数に置き換える処理をいうものとする。
図6に示すサンプルコード30aに対して、入力変数伝播処理を実行した結果のコードを入力変数伝播処理後コード31aとする。
【0052】
まず、サンプルコード30aにおけるコード部300aにおいて、入力変数「g1」が変数「a1」に代入されているので、この代入計算されている箇所を起点とする。
【0053】
次に、サンプルコード30aのコード部301a(「a2=a1+1;」)において、コード部300aにおける変数「a1」が計算に用いられているので、入力変数伝播処理後コード31aの入力変数伝播処理後コード部310a(「a2=g1+1;」)に置き換えることができる。
【0054】
以上の動作のように、入力変数伝播処理は、ソースコード中の変数を入力変数に置き換えることによって、ソースコードを簡略化して縮約することができる。
【0055】
次に、
図7を参照しながら、枝刈り処理の内容について説明する。枝刈り処理は、定数伝播処理および入力変数伝播処理を実行した結果、分岐条件式を定数(例えば、if文であれば条件式、switch文であればcase値)に置き換えること等によって、複数の分岐の選択肢のうち、実行されることのない選択肢を削除する処理である。
図7に示すサンプルコード30bに対して、枝刈り処理を実行した結果のコードを枝刈り処理後コード31bとする。
【0056】
サンプルコード30bのコード部300bにおいて、変数「A」に定数「1」が入力されている。したがって、条件分岐式であるサンプルコード30bのコード部301bにおける条件(「A==0」)を満たすことはないので、分岐の選択肢の一つである「分岐1;」が実行されることはない。よって、この実行されることのない「分岐1;」を削除することによって、条件分岐式であるコード部301bは、枝刈り処理後コード31bの枝刈り処理後コード部310b(「分岐2;」)に置き換えることができる。
【0057】
以上のように、枝刈り処理は、数行に渡って記述された条件分岐式の記述量を減らす(
図7の例では1行)ことができるので、ソースコードを簡略化して縮約することができる。
【0058】
次に、
図8を参照しながら、条件式情報伝播処理の内容について説明する。条件式情報伝播処理は、条件分岐式(例えば、if文およびswitch文等)を3項式に置き換える処理をいうものとする。
図8に示すサンプルコード30cに対して、条件式情報伝播処理を実行した結果のコードを条件式情報伝播処理後コード31cとする。
【0059】
サンプルコード30cのコード部300cは、if文で表された条件分岐式である。このコード部300cを、3項演算子を用いた3項式に置き換えたのが条件式情報伝播処理後コード31cの条件式情報伝播処理後コード部310c(「b=(A?0:1);」)である。
【0060】
以上のように、条件式情報伝播処理は、数行に渡って記述された条件分岐式を1行の3項式に置き換えることができるので、ソースコードを簡略化して縮約することができる。
【0061】
次に、
図9を参照しながら、定数伝播処理、入力変数伝播処理および枝刈り処理をループ処理する動作を説明する。枝刈り処理は、上述のように、定数伝播処理および入力変数伝播処理を実行した後等に、分岐条件式を定数に置き換えることが可能となった場合に置き換えることによって、複数の分岐の選択肢のうち、実行されることのない選択肢を削除する処理である。なお、定数伝播処理、入力変数伝播処理および枝刈り処理の実行順序は任意でよい。
【0062】
また、枝刈り処理を実行することによって、条件分岐式が簡略化され、分岐の選択肢のうち特定の選択肢が条件分岐式外に出る、すなわち、特定の選択肢が常時実行されることになる。この枝刈り処理により常時実行されることになった選択肢は、新たに、定数伝播処理または入力変数伝播処理により縮約することができる可能性がある。
【0063】
以上のことから、
図9に示す手順で定数伝播処理、入力変数伝播処理および枝刈り処理を実行する。まず、等価変換手段102は、ソースコードに対して、定数伝播処理(ステップS110)および入力変数伝播処理(ステップS111)を実行する。次に、等価変換手段102は、定数伝播処理および入力変数伝播処理によって縮約されたソースコードに対して、枝刈り処理を実行する(ステップS112)。そして、等価変換手段102は、定数伝播処理、入力変数伝播処理および枝刈り処理を実行した結果、ソースコードの縮約が収束したか否か、すなわち、ソースコードがこれ以上縮約できないか否かを判定する。縮約が収束した場合(ステップS113:Yes)、処理を終了し、縮約が収束していない場合(ステップS113:No)、ステップS110へ戻る。
【0064】
以上のように、
図9に示す定数伝播処理、入力変数伝播処理および枝刈り処理のループ処理を実行することによって、ソースコードをより確実に縮約することができる。そして、等価変換手段102は、定数伝播処理、入力変数伝播処理および枝刈り処理のループ処理を実行した後、条件式情報伝播処理を実行することによって、3項式で表された、出力変数についての方程式を導出することができる。そして、ステップS12へ移行する。
【0065】
(ステップS12)
グラフ作成手段103は、等価変換手段102により導出された出力変数についての方程式から、原因結果グラフを作成する。具体的には、グラフ作成手段103は、出力変数についての方程式の各入力条件をノードとして、後述するように、OR記号部、AND記号部およびNOT記号部で結合することにより、出力変数の値(出力値)の振る舞いを把握するための原因結果グラフを作成する。ただし、グラフ作成手段103は、上述のように出力変数についての方程式から、入力条件式のノードがOR記号部、AND記号部およびNOT記号部によって結合された原因結果グラフを作成する。したがって、等価変換手段102は、3項演算子を用いて表された方程式を、論理演算子を用いて表された方程式に変換することが望ましい。また、グラフ作成手段103による出力変数についての方程式から原因結果グラフへの作成手順の詳細は後述する。そして、ステップS13へ移行する。
【0066】
(ステップS13)
テーブル変換手段104は、グラフ作成手段103により作成された原因結果グラフをデシジョンテーブルに変換する。具体的には、テーブル変換手段104は、上述の出力変数についての方程式の入力条件(原因結果グラフにおける入力条件のノード)の値の組み合わせごとに、出力変数の値(出力値)がどのように値をとるかについて表にしたデシジョンテーブルを作成する。また、テーブル変換手段104による原因結果グラフからデシジョンテーブルへの変換手順の詳細は後述する。そして、仕様抽出動作を終了する。
【0067】
図10は、仕様抽出動作の対象となるモジュールのソースコードのサンプルを示す図である。
図11は、モジュールに対して出力変数を特定する処理を説明する図である。
図12は、モジュールに対して定数伝播処理および入力伝播処理を実行する動作を説明する図である。
図13は、モジュールに対して枝刈り処理を実行する動作を説明する図である。
図14は、モジュールに対して条件式情報伝播処理を実行する動作を説明する図である。
図15は、モジュールに対して条件式情報伝播処理を実行して方程式を得る動作を説明する図である。
図16は、3項演算子により表された方程式を論理演算子により表された方程式に変換する動作を説明する図である。
図17は、等価変換処理を実行する前に出力変数を仮変数に設定する動作を説明する図である。
図10〜17を参照しながら、具体的なモジュールに対する等価変換手段102による等価変換処理について説明する。
【0068】
図10に示す対象モジュール20は、以下の等価変換処理を実行する前の具体的なサンプルコードである。なお、
図10においては、対象モジュール20のソースコードがC言語で記載されているが、これに限定されるものではなく、上述の等価変換処理が実行できるプログラム言語であればよい。
【0069】
まず、
図11に示すように、出力変数特定手段101は、対象モジュール20において、更新されているグローバル変数、すなわち出力変数を特定する。
図11に示すように、対象モジュール20においては、グローバル変数としては、グローバル変数200(「Output_data」)およびグローバル変数201(「Global_status」)が宣言されている。出力変数特定手段101は、グローバル変数のうち、グローバル変数201は参照されているのみ(「sample_status1=Global_status;」)なので、出力変数ではなく入力変数であると判断する。また、出力変数特定手段101は、グローバル変数のうち、グローバル変数200は書き換えられている(更新されている)(例えば「Output_data=status2;」)ので出力変数であると特定する。
【0070】
対象モジュール20における入力条件部202〜204は、後述するように、等価変換手段102によって導出された出力変数についての方程式における入力条件となるコード部である。
【0071】
次に、
図12に示すように、コード部205において変数「status1」に定数「0」が代入されていることから、「status2=status1+1;」は「status2=1;」と置き換えることができる。したがって、等価変換手段102は、定数伝播処理によって、対象モジュール20のコード部205を、定数伝播処理後コード部210に置き換えることができる。
【0072】
また、変数「statsu2」には定数「1」が代入されていることから、コード部207a〜207c(「Output_data=status2;」)は、「Output_data=1;」に置き換えることができる。したがって、等価変換手段102は、定数伝播処理によって、対象モジュール20のコード部207a〜207cを、それぞれ定数伝播処理後コード部212a〜212cに置き換えることができる。
【0073】
また、変数「status2」には定数「1」が代入されていることから、If文の条件式を示すコード部208(「if((status2==0))」)は、「if((1==0))」に置き換えることができる。したがって、等価変換手段102は、定数伝播処理によって、対象モジュール20のコード部208を、定数伝播処理後コード部213に置き換えることができる。
【0074】
また、コード部206において入力変数「Global_status」が変数「sample_status1」に入力されていることから、「sample_status2=sample_status1+1;」は「sample_status2=Global_status+1;」に置き換えることができる。したがって、等価変換手段102は、入力変数伝播処理によって、対象モジュール20のコード部206を、入力変数伝播処理後コード部211に置き換えることができる。
【0075】
以上のようにして、等価変換手段102は、定数伝播処理および入力変数伝播処理によって、対象モジュール20を処理後モジュール21に変換する。
【0076】
次に、
図13に示すように、分岐条件式であるコード部214において、
図12に示す定数伝播処理後コード部213に相当する条件の部分が「1==0」であるので、「Output_data=1;」は実行されることがない。したがって、等価変換手段102は、枝刈り処理によって、処理後モジュール21のコード部214を、枝刈り処理後コード部220(コードなし)に置き換えることができる。
【0077】
以上のようにして、等価変換手段102は、枝刈り処理によって、処理後モジュール21を処理後モジュール22に変換する。
【0078】
次に、
図14に示すように、条件分岐式であるコード部221は、3項演算子を用いた3項式に置き換えることができる。すなわち、等価変換手段102は、条件式情報伝播処理によって、処理後モジュール22のコード部221を、3項式である条件式情報伝播処理後コード部230(「Output_data=(!(sample_varialbe2==1)&&sample_flags==1)?1:0;」)に置き換えることができる。
【0079】
以上のようにして、等価変換手段102は、条件式情報伝播処理によって、処理後モジュール22を処理後モジュール23に変換する。
【0080】
次に、
図15に示すように、条件分岐式であるコード部231は、3項演算子を用いた3項式に置き換えることができる。すなわち、等価変換手段102は、条件式情報伝播処理によって、処理後モジュール23のコード部231を、3項式である条件式情報伝播処理後コード部240(「Output_data=sample_variable1>61?1:((!(sample_variable2==1)&&sample_flags==1)?1:0);」)に置き換えることができる。
【0081】
以上のようにして、等価変換手段102は、条件式情報伝播処理によって、処理後モジュール23を処理後モジュール24に変換する。この変換された処理後モジュール24の条件式情報伝播処理後コード部240の方程式が、等価変換手段102によって導出される出力変数ついての方程式となる。ただし、上述したように、後工程の原因結果グラフは、グラフ作成手段103により、入力条件式のノードがOR記号部、AND記号部およびNOT記号部によって結合されて作成される。したがって、
図16に示すように、等価変換手段102は、導出した条件式情報伝播処理後コード部240に示す3項演算子を用いた表された方程式を、論理演算子を用いて表された方程式241(「Output_data=(sample_variable1>61)||!(sample_variable1>61)&&!(sample_variable2==1)&&sample_flags==1」)に変換する。すなわち、方程式241が、等価変換手段102が最終的に導出する出力変数についての方程式である。
【0082】
以上のように、等価変換手段102による等価変換処理(定数伝播処理、入力変数伝播処理、枝刈り処理および条件式情報伝播処理)によって、モジュールのソースコードを縮約することができ、それによって縮約された出力変数についての方程式を導出することができる。
【0083】
なお、モジュールのソースコードにおいて出力変数を使って計算する式がない場合、出力変数が等価変換手段102による等価変換処理のうちの枝刈り処理によって、出力変数についての方程式が削除されてしまう場合がある。この場合、
図17の対象モジュール25の仮変数設定コード部250に示すように、出力変数特定手段101により特定された出力変数(
図17では「V1」、「V2」および「V3」)を、仮変数(
図17では「tmp_V1」、「tmp_V2」および「tmp_V3」)に代入処理を実行すればよい。これによって、等価変換手段102によって対象モジュール25から等価変換後モジュール26に変換された場合、仮変数設定コード部250は、仮変数(実質は出力変数)についての方程式である方程式コード部260に変換され、方程式が削除されてしまうことを防止できる。
【0084】
図18は、方程式の入力条件の論理式からOR記号部およびAND記号部によって中間的な原因結果グラフを導出する動作を説明する図である。
図19は、中間的な原因結果グラフからNOT記号部および同一式のノードの統合によって最終的な原因結果グラフを導出する動作を説明する図である。
図18および19を参照しながら、グラフ作成手段103による原因結果グラフの作成について説明する。
【0085】
まず、
図18に示すように、グラフ作成手段103は、等価変換手段102によって導出された
図16に示す方程式241の右辺(入力条件が論理演算子で結合された式)を抽出する。OR演算子(「||」)、AND演算子(「&&」)、NOT演算子(「!」)の順に演算の優先順位が高くなるので、グラフ作成手段103は、OR演算子によって結合された入力条件をそれぞれ抽出し、それぞれの入力条件をノードとして、各ノードを
図18に示すOR記号部60によって結合させる。具体的には、グラフ作成手段103は、方程式241の右辺のうちOR演算子で結合された入力条件「sample_variable1>61」および「!(sample_variable1>61)&&!(sample_variable2==1)&&sample_flags==1」を、それぞれノード40、41としてOR記号部60で結合させる。ノード40とノード41とのOR演算の結果が出力値となり、グラフ作成手段103は、OR記号部60の出力側と、出力値を示す出力値ノード70とを結合させる。
【0086】
次に、グラフ作成手段103は、生成した各ノードの入力条件において、AND演算子によって結合された入力条件をそれぞれ抽出し、それぞれの入力条件を新たなノードとして、各ノードを
図18に示すAND記号部61によって結合させる。具体的には、グラフ作成手段103は、ノード41の入力条件のうちAND演算子で結合された入力条件「!(sample_variable1>61)」、「!(sample_variable2==1)」および「sample_flags==1」を、それぞれ、ノード42〜44としてAND記号部61で結合させる。そして、グラフ作成手段103は、AND記号部61の出力側と、OR記号部60とを結合させる。
【0087】
次に、
図19に示すように、グラフ作成手段103は、生成した各ノードの入力条件において、NOT演算子を含む入力条件を抽出し、NOT演算子を外した入力条件を新たなノードとして、そのノードを
図19に示すNOT演算子と結合させる。具体的には、グラフ作成手段103は、ノード42の入力条件「!(sample_variable1>61)」にNOT演算子が含まれるので、NOT演算子を外した入力条件「sample_variable1>61」を新たなノードであるノード42aとする。そして、グラフ作成手段103は、ノード42aを、NOT記号部62aを介してAND記号部61に結合させる。また、グラフ作成手段103は、ノード43の入力条件「!(sample_variable2==1)」にNOT演算子が含まれるので、NOT演算子を外した入力条件「sample_variable2==1」を新たなノードであるノード43aとする。そして、グラフ作成手段103は、ノード43aを、NOT記号部62bを介してAND記号部61に結合させる。
【0088】
次に、グラフ作成手段103は、ここまでで生成したノードのうち、入力条件が同一式であるノードを1つのノードに統一する。具体的には、グラフ作成手段103は、ノード40およびノード42aの入力条件が「sample_variable1>61」で同一式なので、ノード40とノード42aとを1つのノード45に統一する。
【0089】
このように、グラフ作成手段103は、等価変換手段102より導出された方程式241から、右辺に含まれる入力条件をノードとしてOR記号部、AND記号部およびNOT記号部で結合させ、同一式の入力条件を1つのノードに統一させることによって、原因結果グラフを作成する。
【0090】
以上のように、グラフ作成手段103は、出力変数の方程式における入力条件を抽出して、抽出した入力条件をノードとして、論理記号(OR記号部、AND記号部およびNOT記号部)によって結合し、共通のノードを統合している。これによって、等価変換手段102により導出された出力変数についての方程式から、縮約された原因結果グラフを作成することができる。
【0091】
図20は、原因結果グラフからデシジョンテーブルを作成する動作を説明する図である。
図20を参照しながら、テーブル変換手段104による原因結果グラフからデシジョンテーブルへの変換について説明する。
【0092】
図20に示すように、テーブル変換手段104は、グラフ作成手段103により作成された原因結果グラフをデシジョンテーブル50に変換する。デシジョンテーブルの形式は、様々な形式が存在するが、本実施形態においては、
図20に示すデシジョンテーブル50のように、入力条件を示す「入力」、および出力変数を示す「出力」の各列で構成されたテーブルを作成するものとする。ただし、デシジョンテーブルの形式は、上述に限定されるものではない。
【0093】
具体的には、まず、テーブル変換手段104は、テーブルの「入力」(入力条件)の欄に、グラフ作成手段103により作成された原因結果グラフにおけるすべてのノードの入力条件をそれぞれ記載する。
図20においては、入力条件として、「sample_variable1>61」、「sample_variable2==1」および「sample_flags==1」が記載されている。そして、テーブル変換手段104は、テーブルの「出力」(出力変数)の欄に、出力変数を記載する。
図20においては、出力変数として、「Output_data」が記載されている。
【0094】
次に、テーブル変換手段104は、原因結果グラフに基づいて、各入力条件が真値「T」(true)であるか、偽値「F」(false)であるかの組み合わせによって、出力値が取り得る値である「1」および「0」のいずれとなるかについての対応関係を記載する。
【0095】
原因結果グラフから、入力条件「sample_variable1>61」が真値「T」であれば、入力条件「sample_variable2==1」および「sample_flags==1」の真偽に関わりなく、出力値は「1」となる。したがって、テーブル変換手段104は、テーブルに、入力条件「sample_variable1>61」が真値「T」の場合、出力値は「1」となる対応関係を記載する。このとき、テーブルにおける入力条件「sample_variable2==1」および「sample_flags==1」の欄は空欄としている。
【0096】
また、原因結果グラフから、入力条件「sample_variable1>61」が偽値「F」、かつ入力条件「sample_flags==1」が真値「T」の場合、入力条件「sample_variable2==1」の真偽によって、出力値は異なる。すなわち、入力条件「sample_variable2==1」が偽値「F」の場合、出力値は「1」となり、真値「T」の場合、出力値は「0」となる。したがって、テーブル変換手段104は、テーブルに、入力条件「sample_variable1>61」が偽値「F」、「sample_variable2==1」が偽値「F」、かつ「sample_flags==1」が真値「T」の場合、出力値は「1」となる対応関係を記載する。また、テーブル変換手段104は、テーブルに、入力条件「sample_variable1>61」が偽値「F」、「sample_variable2==1」が真値「T」、かつ「sample_flags==1」が真値「T」の場合、出力値は「0」となる対応関係を記載する。
【0097】
また、原因結果グラフから、入力条件「sample_variable1>61」および「sample_flags==1」が偽値「F」であれば、入力条件「sample_variable2==1」の真偽に関わりなく、出力値は「0」となる。したがって、テーブル変換手段104は、テーブルに、入力条件「sample_variable1>61」および「sample_flags==1」が偽値「F」の場合、出力値は「0」となる対応関係を記載する。このとき、テーブルにおける入力条件「sample_variable2==1」の欄は空欄としている。
【0098】
以上の動作によって、テーブル変換手段104は、グラフ作成手段103により作成された原因結果グラフを、
図20に示すデシジョンテーブル50に変換する。このように、テーブル変換手段104は、等価変換手段102により導出された、縮約された出力変数についての方程式から、グラフ作成手段103により縮約された原因結果グラフが作成され、この縮約された原因結果グラフに基づいてデシジョンテーブル50に変換している。これによって、グラフ作成手段103により作成された原因結果グラフから、最適化された入力条件の組み合わせから構成されたコンパクトなデシジョンテーブルを求めることができる。
【0099】
なお、上述したソースコードからデシジョンテーブルを生成する方法は一例であり、これに限定されるものではなく、その他の方法でデシジョンテーブルを生成するものとしてもよい。
【0100】
図21は、第1の実施形態に係る検証装置のデシジョンテーブルから検証用コードを作成する動作の概要を説明する図である。
図21を参照ながら、本実施形態に係る検証装置であるPC1の等価性検証動作の流れの概要について説明する。
【0101】
図21に示すように、検証対象ソースコード80は、上述のように仕様抽出手段100により仕様情報であるデシジョンテーブル81が生成されているものとする。次に、等価性検証手段150のコード生成手段151は、デシジョンテーブル81の入力条件のそれぞれの真偽の値を示す行(以下、入力条件行という)を抜き出して、検証対象ソースコード80の前段側に、その入力条件行の入力条件を規定するコード(事前条件部82)を設定する。また、コード生成手段151は、デシジョンテーブル81から抜き出した入力条件行に対応する出力変数の値(出力値)を抜き出し、検証対象ソースコード80の後段側に、その出力値を規定するコード(事後条件部83)を設定する。このように、コード生成手段151は、事前条件部82、検証対象ソースコード80、および事後条件部83を含んだ検証用コード84を生成する。
【0102】
次に、コード生成手段151は、生成した検証用コード84を、検証ツール85(
図2の検証手段152に相当)に出力する。検証用コード84を入力した検証ツール85は、検証用コード84を解析し、検証対象ソースコード80を実行した場合に、コード生成手段151により設定された入力条件を満たす場合に、設定された出力値となるか否かを検証する。そして、検証ツール85は、検証の結果(OK・NG判定)を出力する。
【0103】
図22は、第1の実施形態に係る検証装置の等価性検証動作の一例を示すフローチャートである。
図23は、検証用コードに事前条件および事後条件のコードを設定する例を示す図である。
図24は、検証用コードに事前条件および事後条件のコードを設定する別の例を示す図である。
図22〜24を参照ながら検証装置であるPC1の等価性検証動作の流れの詳細について説明する。なお、
図22においては、簡便に記載するため、デシジョンテーブルを「DT」と記載している。
【0104】
(ステップS21)
等価性検証手段150のコード生成手段151は、記憶手段160の第1記憶手段161に記憶された、仕様抽出動作の対象、かつ、等価性の検証対象となるソースコード(検証対象ソースコード)を読み出して入力する。さらに、コード生成手段151は、記憶手段160の第2記憶手段162に記憶された、検証対象ソースコードに対する仕様抽出動作により生成されたデシジョンテーブルを読み出して入力する。また、コード生成手段151は、
図23に示すように、例えば、検証対象ソースコードのうち、関数「func01」について、仕様情報であるデシジョンテーブル90との等価性の検証動作を行う。すなわち、デシジョンテーブル90は、関数「func01」に含まれる出力変数「z」のデシジョンテーブルである。
【0105】
図23に示すように、コード生成手段151は、関数「func01」を検証対象とするために、検証用コード91において、関数「func01」を使用するためのヘッダファイル「func01.h」をインクルードするためのコードを、3行目に追記する。次に、コード生成手段151は、ソースコードが外部ファイルで記述されている関数「func01」を検証用コード91内で呼び出すために、extern宣言(プロトタイプ宣言)をするためのコードを、6行目に追記する。そして、コード生成手段151は、単純に関数「func01」を実行するための関数「cprover_main」(引数・戻り値なし)を、13行目に追記し、関数「func01」を実行するコード「func01();」(以下、実行コードという)を、19行目に追記する。なお、単純に関数「func01」を実行するための関数名は、一例であり任意の関数名でよい。
【0106】
なお、コード生成手段151は、第1記憶手段161からソースコードを読み出して入力するものとしたが、これに限定されるものではなく、ユーザが操作部12を介して直接、操作入力したソースコードを入力するものとしてもよい。
【0107】
(ステップS22)
コード生成手段151の事前条件設定手段151aは、デシジョンテーブル90から1行ずつ入力条件行を抜き出す(抽出する)。具体的には、
図23に示すように、例えば、事前条件設定手段151aが抜き出した行を入力条件行900とする。
【0108】
また、コード生成手段151の事後条件設定手段151bは、デシジョンテーブル90から事前条件設定手段151aにより抜き出された入力条件行に対応する出力変数の値(出力値)を抜き出す(抽出する)。具体的には、
図23に示すように、例えば、事後条件設定手段151bが抜き出した出力変数の値を出力値901とする。そして、ステップS23へ移行する。
【0109】
(ステップS23)
事前条件設定手段151aは、抜き出した入力条件行の入力条件の真偽値を規定するコードを事前条件として生成する。例えば、
図23に示す入力条件行900は、入力条件「g1>100」が真値(T)であり、かつ、入力条件「g2==0」が偽値(F)であることを示す。したがって、事前条件設定手段151aは、入力条件行の入力条件の真偽値を規定するコードとして、「__CPROVER_assume((g1>100)&&!(g2==0));」を生成する。この「__CPROVER_assume();」のコードは、入力条件の真偽を満たす場合、すなわち、入力条件「g1>100」が真値、かつ、入力条件「g2==0」が偽値であるものと指定するコードである。
【0110】
事後条件設定手段151bは、抜き出した出力値を規定するコードを事後条件として生成する。例えば、
図23に示す出力値901は、入力条件行900の真偽値を満たす場合、出力変数「z」の値が「0」であることを示す。したがって、事後条件設定手段151bは、出力値を規定するコードとして、「__CPROVER_assert(z==(0));」を生成する。この「__CPROVER_assert(z==(0));」のコードは、入力条件行900が示す入力条件の真偽値の場合であって、関数「func01」が実行された時点で、出力変数(
図23においては「z」)が取るべき値を指定するコードである。そして、ステップS24へ移行する。
【0111】
(ステップS24)
事前条件設定手段151aは、生成した「__CPROVER_assume((g1>100)&&!(g2==0));」を、事前条件設定コード910として、検証用コード91における実行コードの前段側(
図23では、16行目)に追記する。また、事前条件設定手段151aは、変数「g1」、「g2」を不定値とするために、検証用コード91において、未定義関数「nondet()」を用いて型宣言をするためのコード「int g1 = nondet();」および「int g2 = nondet():」をそれぞれ追記している。これは、C言語の仕様に基づくものであり、他の言語で必要がなければ追記する必要はない。
【0112】
事後条件設定手段151bは、生成した「__CPROVER_assert(z==(0));」を、事後条件設定コード911として、検証用コード91における実行コードの後段側(
図23では、22行目)に追記する。また、事後条件設定手段151bは、出力変数「z」を不定値とするために、検証用コード91において、未定義関数「nondet()」を用いて型宣言をするためのコード「intz1 = nondet();」を追記している。これは、C言語の仕様に基づくものであり、他の言語で必要がなければ追記する必要はない。
【0113】
なお、未定義関数として「nondet()」としているが、仮に表記した関数であり、未定義関数であればどのような関数でもよい。
【0114】
すなわち、コード生成手段151は、検証対象ソースコード、事前条件設定手段151aにより生成された事前条件設定コード910、および、事後条件設定手段151bにおより生成された事後条件設定コード911等に基づいて、検証用コード91を完成(生成)させる。そして、ステップS25へ移行する。
【0115】
(ステップS25)
等価性検証手段150の検証手段152は、コード生成手段151により生成された検証用コード(
図23では、検証用コード91)を入力する。そして、検証手段152は、入力した検証用コードを実行することによって、検証対象ソースコード(具体的には、
図23に示す関数「func01」)と、仕様抽出手段100により生成されたデシジョンテーブル(
図23では、デシジョンテーブル90)との等価性の検証動作を行う。
【0116】
図23の例では、検証手段152は、検証用コード91を実行する場合に、「__CPROVER_assume((g1>100)&&!(g2==0));」によって、「g1>100」が真値、かつ、「g2==0」が偽値であるものとして、関数「func01」を実行する。そして、検証手段152は、関数「func01」を実行した時点で、「__CPROVER_assert(z==(0));」によって、出力変数「z」が指定された出力値「0」であるか否かの判定を行う。そして、ステップS26へ移行する。
【0117】
(ステップS26)
等価性検証手段150の結果出力手段153は、検証手段152により検証対象ソースコードに対して、デシジョンテーブルの入力条件行ごとに行われた等価性の検証動作の検証結果を出力する。結果出力手段153は、例えば、検証結果をデータとして出力し記憶部14に記憶させて保存するものとしてもよく、検証結果を表示部13に表示させるものとしてもよい。
【0118】
上述のステップS22〜26の処理を、デシジョンテーブル(
図23では、デシジョンテーブル90)のすべての入力条件行に対して行う。その後、ステップS27へ移行する。
【0119】
(ステップS27)
検証手段152は、デシジョンテーブルのすべての入力条件行、およびそれに対応する出力値について、検証対象ソースコードと、デシジョンテーブルとの等価性の検証動作を行った後、検証結果が判定NGとなる入力条件行が1つでも存在するか否かを求める。検証結果が判定NGとなる入力条件行が1つも存在しない場合(ステップS27:No)、ステップS28へ移行し、存在する場合(ステップS27:Yes)、ステップS29へ移行する。
【0120】
(ステップS28)
検証手段152は、等価性の検証動作の結果、デシジョンテーブルで判定NGとなる入力条件行が1つも存在しない場合、デシジョンテーブルと、検証対象ソースコードとは等価であるものと判定する。検証手段152は、この判定結果(検証結果)を結果出力手段153に送る。そして、ステップS30へ移行する。
【0121】
(ステップS29)
検証手段152は、等価性の検証動作の結果、デシジョンテーブルで判定NGとなる入力条件行が1つでも存在する場合、デシジョンテーブルと、検証対象ソースコードとは等価でないものと判定する。検証手段152は、この判定結果(検証結果)を結果出力手段153に送る。そして、ステップS30へ移行する。
【0122】
(ステップS30)
結果出力手段153は、検証手段152により検証対象ソースコードに対する等価性の検証動作の検証結果を出力する。結果出力手段153は、例えば、検証結果をデータとして出力し記憶部14に記憶させて保存するものとしてもよく、検証結果を表示部13に表示させるものとしてもよい。そして、等価性検証動作を終了する。
【0123】
なお、上述の
図23に示すデシジョンテーブル90では、出力値はすべて特定の値をとる場合を示したが、
図24に示すデシジョンテーブル90aのように、出力変数「z」の出力値として不変値(この場合「z」と記載するものとする)を含む場合を想定する。この場合、事前条件設定手段151aによって、デシジョンテーブル90aから入力条件行900aが抜き出され、入力条件の真偽値を規定するコードとして、「__CPROVER_assume((g1>100)&&!(g2==0));」が生成され、このコードを事前条件設定コード910aとして検証用コード91aに追記される動作は、上述の入力条件行900および事前条件設定コード910と同様である。
【0124】
一方、出力変数「z」が不変値であるか否か、すなわち、関数「func01」の実行前後で出力変数「z」の値が変わらないか否かを検証する場合には、関数「func01」の実行前の出力変数「z」の値を取得しておく必要がある。したがって、事後条件設定手段151bは、関数「func01」の実行前の出力変数「z」の値を仮変数「z_tmp」に退避させるために、
図24に示すように、検証用コード91aの15行目に、「int z_tmp = z;」のコードを追記する。そして、事後条件設定手段151bは、事前条件設定手段151aにより抜き出された入力条件行900aに対応する出力変数の値(不変値)である出力値901aを抜き出す。そして、事後条件設定手段151bは、不変値の出力値901aを規定するコードとして、「__CPROVER_assert(z==z_tmp);」を生成する。この「__CPROVER_assert(z==z_tmp);」のコードは、入力条件行900aが示す入力条件の真偽値の場合であって、関数「func01」が実行された時点で、出力変数「z」が不変のままであるか否かを検証するコードである。そして、事後条件設定手段151bは、生成した「__CPROVER_assert(z==z_tmp);」を、事後条件設定コード911aとして、検証用コード91aにおける実行コードの後段側(
図24では、24行目)に追記する。
【0125】
これによって、出力変数の出力値として不変値を含む場合であっても、検証対象ソースコード(関数)の実行後においても、出力変数が不変であるか否かを検証することが可能となる。
【0126】
また、上述の
図23では、検証対象ソースコードが外部ファイルで記述されている場合であって、extern宣言をすることにより、外部ファイルで記述されている等価性検証動作の対象となる関数を呼び出すものとしたが、これに限定されるものではない。例えば、
図23に示す検証用コード91において、19行目の「func01();」の代わりに、検証対象ソースコードの関数が記述されたコードそのもの(実行コード)を記述するものとしてもよい。
【0127】
以上の動作のように、本実施形態に係る検証装置(PC1)は、検証対象ソースコードについて仕様抽出手段100による仕様抽出動作によって、デシジョンテーブルを生成し、等価性検証手段150による等価性検証動作によって、デシジョンテーブルと検証対象ソースコードとが等価であるか否かを検証するものとしている。これによって、仕様抽出手段100による仕様抽出動作によって生成したデシジョンテーブルが、元のソースコード(検証対象ソースコード)と等価であるか否か、すなわち、生成されたデシジョンテーブルがソースコードの仕様情報として正確な情報であるか否かを検証することができる。
【0128】
また、コード生成手段151は、検証対象ソースコードを編集することなく、デシジョンテーブルの入力条件行および出力値から生成したコードに基づいて、検証用コードを生成するものとしている。これによって、検証対象ソースコードに対して、検証用コードを生成するためのコメント等を記述する必要がなく、検証用コードを自動生成することができるので、検証対象ソースコードとデシジョンテーブルとの等価性の検証を効率的に行うことができる。
【0129】
また、等価性検証手段150への入力情報を、入力条件と出力値とが構造化されたデシジョンテーブルとしている。これによって、検証手段152による仕様情報(デシジョンテーブル)とソースコードとの等価性の検証動作をまとめて効率的に行うことができる。
【0130】
なお、
図2に示すように、仕様抽出手段100および等価性検証手段150は、双方、PC1が有するものとしたが、これに限定されるものではない。例えば、仕様抽出手段100を有する装置と、等価性検証手段150を有する装置とを別々の装置として、これらの装置が全体として上述の実施形態の動作を実現する検証システムを構成するものとしてもよい。この場合、仕様抽出手段100を有する装置により生成されたデシジョンテーブルのデータは、通信手段(有線または無線を問わない)によって、等価性検証手段150を有する装置に送信され、等価性検証手段150を有する装置は、受信したデシジョンテーブルのデータを用いて等価性検証動作を実行するものとしてもよい。さらに、仕様抽出手段100と等価性検証手段150とがそれぞれ別の装置に備えられる構成に限定されるものではなく、これらが含む各手段がさらに別の装置に備えられるものとしてもよい。例えば、等価性検証手段150のうち、検証手段152だけ別の装置に備えられるものとし、コード生成手段151により生成した検証コードに基づく等価性検証動作を、検証手段152を有する装置に委託する、という構成であってもよい。
【0131】
(第2の実施形態)
本実施形態のPC1について、第1の実施形態のPC1と相違する点を中心に説明する。第1の実施形態においては、仕様抽出手段100により生成されたデシジョンテーブルを用いて、検証対象ソースコードと等価であるか否かを検証する動作を説明した。本実施形態においては、例えば、検証対象ソースコードについてユーザ自身が作成したデシジョンテーブルと、その検証対象ソースコードとが等価であるか否かを検証する動作について説明する。なお、本実施形態のPC1のハードウェア構成および機能ブロック構成は、それぞれ上述の
図1および2に示した構成と同様である。以下、特に機能ブロック構成について、第1の実施形態と相違する点を説明する。
【0132】
等価性検証手段150は、例えば、検証対象ソースコードについてユーザ自身により作成されたデシジョンテーブル(すなわち、PC1とは無関係に独立に外部で作成されたデシジョンテーブル)と、その検証対象ソースコードとの等価性を検証する機能部である。等価性検証手段150は、コード生成手段151と、検証手段152と、結果出力手段153と、を有する。なお、コード生成手段151、検証手段152および結果出力手段153の機能は、第1の実施形態と同様である。
【0133】
記憶手段160は、制御部16により実行される各種プログラム、およびPC1で行われる各種処理に使用されるデータ等を記憶する機能部である。記憶手段160は、第1記憶手段161と、第2記憶手段162と、を有する。
【0134】
第1記憶手段161は、等価性の検証対象となるソースコードを記憶する機能部である。第2記憶手段162は、例えば、検証対象ソースコードについてユーザ自身により作成されたデシジョンテーブルをデータとして記憶する機能部である。
【0135】
以上のように、本実施形態に係る検証装置(PC1)は、第1の実施形態のように仕様抽出手段100により生成されたデシジョンテーブルではなく、例えば、検証対象ソースコードについてユーザ自身により作成されたデシジョンテーブルと、その検証対象ソースコードとの等価性を検証するものとしている。これによって、ユーザ自身により作成されたデシジョンテーブルが、検証対象ソースコードと等価であるか否か、すなわち、ユーザ自身により作成されたデシジョンテーブルが、検証対象ソースコードの振る舞いを正確に示す仕様情報であるか否かを検証することができる。
【0136】
なお、本実施形態に係るPC1は、ユーザ自身により作成されたデシジョンテーブルと検証対象ソースコードとの等価性の検証動作のみに特化するものであれば、仕様抽出手段100は備えていなくてもよい。
【0137】
(第3の実施形態)
本実施形態のPC1について、第1の実施形態のPC1と相違する点を中心に説明する。第1の実施形態においては、仕様抽出手段100により生成されたデシジョンテーブルを用いて、検証対象ソースコードと等価であるか否かを検証する動作を説明した。本実施形態においては、バージョンアップ(以下、派生開発ともいう)される前のソースコード(以下、レガシーソースコードともいう)に対して仕様抽出手段100によりデシジョンテーブルを生成させ、このデシジョンテーブルと、派生開発後のソースコードとの等価性の検証動作について説明する。なお、本実施形態のPC1のハードウェア構成および機能ブロック構成は、それぞれ上述の
図1および2に示した構成と同様である。以下、特に機能ブロック構成について、第1の実施形態と相違する点を説明する。
【0138】
等価性検証手段150は、仕様抽出手段100による仕様抽出動作により生成されたデシジョンテーブルと、仕様抽出動作の対象となったソースコードから派生開発されたソースコードとの等価性を検証する機能部である。この場合、検証対象ソースコードは、仕様抽出動作の対象となったソースコードから派生開発されたソースコードとなる。等価性検証手段150は、コード生成手段151と、検証手段152と、結果出力手段153と、を有する。なお、コード生成手段151、検証手段152および結果出力手段153の機能は、第1の実施形態と同様である。
【0139】
記憶手段160は、制御部16により実行される各種プログラム、およびPC1で行われる各種処理に使用されるデータ等を記憶する機能部である。記憶手段160は、
図1に示す、記憶部14によって実現される。記憶手段160は、第1記憶手段161と、第2記憶手段162と、を有する。
【0140】
第1記憶手段161は、仕様抽出動作の対象となるレガシーソースコード、および、そのソースコードから派生開発された検証対象ソースコードを記憶する機能部である。第2記憶手段162は、派生開発される前のレガシーソースコードについて仕様抽出手段100により生成されたデシジョンテーブルをデータとして記憶する機能部である。
【0141】
図25は、第3の実施形態に係る検証装置のデシジョンテーブルから検証用コードを作成する動作の概要を説明する図である。
図25を参照しながら、本実施形態に係る検証装置であるPC1の等価性検証動作の流れについて説明する。
【0142】
図25に示すように、検証対象ソースコード80aは、レガシーソースコード86から派生開発されたソースコードである。まず、仕様抽出手段100は、レガシーソースコード86について仕様情報であるデシジョンテーブル81aを生成する。次に、等価性検証手段150のコード生成手段151は、デシジョンテーブル81aの入力条件のそれぞれの真偽の値を示す行(以下、入力条件行という)を抜き出して、検証対象ソースコード80aの前段側に、その入力条件行の入力条件を規定するコード(事前条件部82a)を設定する。また、コード生成手段151は、デシジョンテーブル81aから抜き出した入力条件行に対応する出力変数の値(出力値)を抜き出し、検証対象ソースコード80aの後段側に、その出力値を規定するコード(事後条件部83a)を設定する。このように、コード生成手段151は、事前条件部82a、検証対象ソースコード80a、および事後条件部83aを含んだ検証用コード84aを生成する。
【0143】
次に、コード生成手段151は、生成した検証用コード84aを、検証ツール85(
図2の検証手段152に相当)に出力する。検証用コード84aを入力した検証ツール85は、検証用コード84aを解析し、検証対象ソースコード80aを実行した場合に、コード生成手段151により設定された入力条件を満たす場合に、設定された出力値となるか否かを検証する。そして、検証ツール85は、検証の結果(OK・NG判定)を出力する。なお、上述の等価性検証動作の詳細は、第1の実施形態における
図22〜24で説明した動作内容に準じる。
【0144】
以上のように、本実施形態に係る検証装置(PC1)は、派生開発される前のレガシーソースコードに対して仕様抽出手段100によりデシジョンテーブルを生成させ、このデシジョンテーブルと、派生開発後のソースコードとの等価性の検証動作を行うものとしている。これによって、等価性検証手段150の検証結果により、レガシーソースコードと、派生開発されたソースコードとが、どのように動作仕様が異なるのかを把握することができる。また、レガシーソースコードから派生開発するにしても、機能として変更すべきでないコード部分も存在する。この場合、本実施形態に係る検証装置によれば、レガシーソースコードから生成されたデシジョンテーブルと、派生開発されたソースコードとの等価性の検証動作を行うことにより、変更すべきでない機能が保持されているか否かを確認することができる。
【0145】
なお、レガシーソースコード86から生成されたデシジョンテーブル81aを、検証対象ソースコード80a用にユーザ自身がデシジョンテーブルを編集し、このデシジョンテーブルと、検証対象ソースコード80aとの等価性の検証動作を行うことにより、ユーザ自身が作成したデシジョンテーブルが、検証対象ソースコード80aの振る舞いを正確に規定した仕様情報であるか否かを確認することもできる。逆に、ユーザ自身がデシジョンテーブル81aを検証対象ソースコード80a用に編集したデシジョンテーブルの仕様通りに、検証対象ソースコード80aが動作するか否かを確認することもできる。
【0146】
また、等価性検証手段150は、仕様抽出手段100による仕様抽出動作により生成されたデシジョンテーブルと、仕様抽出動作の対象となったソースコードから派生開発されたソースコードとの等価性を検証するものとしたが、これに限定されるものではない。例えば、等価性検証手段150は、仕様抽出手段100により派生開発されたソースコードに対して仕様抽出動作が行われて生成されたデシジョンテーブルと、派生開発前のソースコード(レガシーソースコード)との等価性を検証するものとしてもよい。これによっても、等価性検証手段150の検証結果により、レガシーソースコードと、派生開発されたソースコードとが、どのように動作仕様が異なるのかを把握することができる。
【0147】
なお、上述の各実施形態に係るPC1で実行されるプログラムは、ROM等に予め組み込まれて提供される。また、上述の各実施形態に係るPC1で実行されるプログラムは、インストール可能な形式または実行可能な形式のファイルでCD−ROM(Compact Disk Read Only Memory)、フレキシブルディスク(FD)、CD−R(Compact Disk Recordable)、DVD(Digital Versatile Disk)等のコンピュータで読み取り可能な記憶媒体に記憶してコンピュータプログラムプロダクトとして提供されるように構成してもよい。
【0148】
さらに、上述の各実施形態に係るPC1で実行されるプログラムを、インターネット等のネットワークに接続されたコンピュータ上に格納し、ネットワーク経由でダウンロードさせることにより提供するように構成してもよい。また、上述の各実施形態に係るPC1で実行されるプログラムをインターネット等のネットワーク経由で提供または配布するように構成してもよい。
【0149】
また、上述の各実施形態のPC1で実行されるプログラムは、コンピュータを上述したPC1の各機能部として機能させ得る。このコンピュータは、CPU(制御部16)がコンピュータ読取可能な記憶媒体からプログラムを主記憶装置上に読み出して実行することができる。
【0150】
本発明の各実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。この新規な各実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換えおよび変更を行うことができる。これら実施形態は、発明の範囲および要旨に含まれるとともに、特許請求の範囲に記載された発明およびその均等の範囲に含まれる。