【実施例1】
【0021】
図1は、本発明をシステムとして実現した場合のシステム構成である。本発明は、例えばソフトウェアツールとして実現される。システム10において、処理を実行するためのソフトウェアは検証モデル生成プログラム1131として、例えばコンピュータ11上のROM113に格納されており、CPU111によって読み出され、RAM112を作業用記憶領域として用い、実行される。これにより、コンピュータ11は検証モデル生成プログラム1131によって規定された処理を実行する。その処理内容は
図2以降で説明する。解析対象となるソースコードファイルは、コンピュータ11上のハードディスク114などの記憶装置に格納されている。解析実行指示などのユーザ操作は、キーボードなどの入力装置12から行うことができる。
【0022】
なお、検証モデル生成プログラム1131による出力は、例えばディスプレイなどの表示装置13になされるが、それ以外に、図示しない外部コンピュータへのネットワークを介した出力、CD−ROMなどの外部記憶媒体へのデータファイル形式での書き込みによる出力であってもよい。
【0023】
図2は、検証モデル生成プログラム1131の基本的な機能構成を示している。ファイル入力部21は、解析対象となるソースコードファイルをユーザが1ないし複数選択できる機能を有しており、ユーザによるファイル指定に従い、ソースコードファイルをコンピュータの記憶媒体(ハードディスク114など)から読み込む。依存関係解析部22は、ユーザが解析実行を指示すると、ファイル入力部21が読み込んだソースコードファイルを解析し、ソースコードから生成されるプログラムの依存関係を導出する。ここで依存関係とは、プログラムの実行順序により演算結果に影響のありうる関係のことであり、具体的には、ステートメント間の依存関係であるプログラム依存関係や、変数間の依存関係である変数依存関係である。プログラム依存関係を変数単位に分解すると変数依存関係になるので、プログラム依存関係と変数依存関係は情報としては等価とみなせる。プログラム依存関係や変数依存関係の導出方法については、文献に譲り、本明細書では割愛する。
【0024】
変数属性入力部23は、ソースコードに記述されたある変数に関する属性について、ユーザからの入力を受け付ける。以降では特に明記しない限り、変数の属性といえば、ソフトウェアモデルの入出力の整合に関係するものを指すとする。変数属性データベース24は、ファイル入力部21が読み込んでいるソースコードの一部の変数について、属性情報を記録している。変数属性解釈部25は、依存関係解析部22が導出した依存関係情報と、変数属性入力部23と変数属性データベース24のいずれか、または両方が持つ変数属性情報とから、ソースコードに記述された各変数の属性について、可能な限り推論を行う。推論には、推論ルールデータベース26に記録されたルールを用いる。変数属性表示部27は、変数属性解釈部25が推論した変数属性情報を、変数属性入力部23と変数属性データベース24の持つ変数属性情報と併せて、表示装置13に表示する。
【0025】
図3は、検証モデル生成プログラム1131が
図2に示された機能を用いて行う処理であり、入力となるソースコードに記述された変数の属性情報を推論する処理のフローを示している。
【0026】
処理を開始すると、ステップ31にて、依存関係解析部22は、入力となるソースコードの依存関係を解析し、データとして出力する。例として、変数aと変数bについて、a=bという式がソースコードに記述されているとすると、変数依存関係としては「a←b」と表現できる。これは変数bが変数aに影響を与えるという意味である。逆に「a→b」と記述してもよく、表現のルールを決めればよい。本実施例では前者を採用する。また、aは依存元、bは依存先と呼ぶことにする。
【0027】
次にステップ32にて、変数属性解釈部25は、変数属性入力部23や変数属性データベース24から、入力となるソースコードに記述された変数の属性情報を取得し、依存関係解析部22の出力した依存関係データにおける各変数と対応付ける。なおステップ32は、該当する変数の属性情報が空のときだけ実行し、それ以外ではスキップする。
【0028】
次にステップ33にて、変数属性解釈部25は、依存関係データにおいて属性推論処理の始端となる変数を抽出する。本実施例では、入力となるソースコードがプログラムとして実行される際に入力となる変数の属性情報をもとに、前向きに(依存先の変数から、依存元の変数へ)属性情報の推論を進めるものとする。また、本実施例の処理は再帰的になっている。このため始端変数として、影響する変数がない、すなわちどの変数からも依存されていない(依存元になる変数が存在しない)変数を抽出する。ただし依存関係がループしており該当する変数が存在しない場合には、任意の変数を1つ選択する。
【0029】
次にステップ34にて、変数属性解釈部25は、対象とする始端変数のそれぞれについて、属性を推論する処理(詳細は
図4に記載)を行う。ステップ34は、ステップ33にて抽出された全ての推論始端となる変数について、それぞれ実行する。以上をもって処理を終了する。
【0030】
なお、
図3の処理を実行するタイミングは、ユーザによる実行指示時か、ユーザが変数属性入力部23に対し属性情報を入力したときとする。処理を終了したら、変数属性表示部27が、出力された依存関係情報を表示装置13に表示する。
【0031】
図4は、ある変数の属性情報を推論する処理であり、
図3のステップ34(「属性推論」処理)の詳細フローを示している。
【0032】
処理を開始すると、ステップ41は、属性情報を推論する対象変数の全ての依存元変数について、それぞれ実行する。ステップ41にて、変数属性解釈部25は、対象とする依存元変数について、属性情報を推論する処理(
図4の処理)を行う。次にステップ42にて、変数属性解釈部25は、対象変数と依存元変数とがデータ依存関係にあるかを判定する。データ依存関係であれば、対象変数の属性情報を更新する必要が無いので処理を終了し、そうでなければ、ステップ43に進む。次にステップ43にて、変数属性解釈部25は、いずれかの依存元変数の属性情報がステップ41にて更新されたか否かを判定する。1変数でも更新されていればステップ44に進み、1つも更新されていなければ、対象変数の属性情報を保持して、処理を終了する。次にステップ44にて、変数属性解釈部25は、対象変数が推論ルールデータベース26に記録されている推論ルールに該当するか否かを判定する。1ルールでも該当すればステップ45に進み、該当するルールがなければ、対象変数の属性情報を保持して、処理を終了する。次にステップ45にて、変数属性解釈部25は、ステップ44にて該当した推論ルールに基づき推論処理を実行し、その結果を対象変数の属性情報に反映する。以上をもって処理を終了する。なお上記は依存関係がループしていない場合の処理であり、ループが存在する場合には、1度「属性推論」処理の対象になった変数は対象外にすることが必要となる。
【0033】
以下では、
図3と
図4の処理例を示す。
図5のソースコード50は、解析対象として検証モデル生成プログラム1131に入力する、C言語で記述されたソースコードの例である。左端の数字は行番号である。
【0034】
図6の変数依存関係グラフ61は、
図5のソースコード50を依存関係解析部22が解析し出力する変数依存関係データをグラフ化したものである。この変数依存関係グラフ61は、例えば表示装置13に表示される。変数依存関係グラフ61のノードは、変数の名称や実体(記憶領域)だけでなく、記述位置(および実行パス)でも区別した変数である。例えば「stroke(L20@control)」と表記された変数は、ソースファイルの20行目、関数control内に記述された変数strokeであること意味している。変数の区別には、記述された行番号だけでなく列番号や、ソースファイル名を用いてもよい。また、
図6のグラフには記載されていないが、各ノードには、変数の型のようにソースコードのみから判明する属性や、変数属性入力部23や変数属性データベース24から与えられた属性、変数属性解釈部25が推論した属性が対応付けられ、データとしてRAM112やハードディスク114に記憶されている。
【0035】
また
図6において、依存関係を示すエッジ(矢印)、および演算式における関係を示すエッジ(破線)には、関係の種類を示すデータが対応付けられて記憶されている。依存関係のエッジにおいて、defは依存元の変数を依存先の変数が定義(代入などにより値を決めていること)を示している。useはデータ依存関係(依存元の変数が、依存先の変数の値を利用していること)を示している。condは制御依存関係(依存先の変数の値により実行パスが変わるため、依存元の変数の値に影響があること)を示している。
【0036】
図7の変数属性テーブル71は、変数属性データベース24に記録されている変数属性の例を示している。変数属性テーブル71の項目は、変数名、in/out(変数がプログラムの入力か出力か)、単位、データ種別からなる。これらの値は予め設定されている。変数reg_ad_1は、入力用の変数であり、データ種別は(例えば自動車のブレーキペダルの)ストローク量であることがわかる。またその単位は「(A/D変換値)」とあるが、これはA/D(Analog/Digital)変換により得られる値であり、単位は特に決められていないことを示している。
【0037】
図8の推論ルールテーブル81は、推論ルールデータベース26に記録されている推論ルールの例を示している。推論ルールテーブル81の項目は、前件と後件からなる。前件の条件が成立するときに、後件の条件も成立することを意味している。前件と後件は、述語論理で表現されている。これらの値は予め設定されている。
【0038】
推論ルールテーブル81の推論ルールNo.1にて、XとYはある変数を示しており、Def(X,Y)「XがYを定義している」ならば、SameAttr(X,Y)「YはXと同じ属性情報を有する」ことを意味している。
【0039】
推論ルールテーブル81の推論ルールNo.2にて、X,Y,Aはある変数を示しており、Cond(X,A)「AがXと制御依存関係にある(Aが依存元)」かつ、Cond(Y,A)「AがYと制御依存関係にある」かつ、Comp(X,Y)「XとYとは演算式内にて大小比較の関係にある(大小比較記号で結ばれている)」ならば、Flag(A)「Aは(異常などの)判定フラグであり、単位はなし」、かつSameAttr(X,Y)であることを意味している。なお、フラグAの判定対象とするデータ種別は、例えば変数Xのデータ種別とする。
【0040】
推論ルールテーブル81の推論ルールNo.3にて、X,Y,Zはある変数を示しており、Def(X,Y,Z)「XとYがZを定義している」かつ、Mul(X,Y)「XとYとは演算式内にて乗算の関係にある(乗算記号で結ばれている)」ならば、MulAttr(X,Y,Z)「Zのデータ種別はX(またはY)と同じであり、かつ、Zの単位はXとYの単位を乗じたもの」であることを意味している。同様に、和差算、除算についても推論ルールを記述することができる。
【0041】
推論ルールテーブル81の推論ルールNo.4にて、X,Yはある変数を示しており、Comp(X,Y)かつ、Vacant(Y)「Yの属性が空」ならば、Thrsh(Y)「Yのデータ種目は『閾値』である」であることを意味している。ただし、Thrsh(Y)に「?」が付いているのは、確定でないことを意味している。なお、閾値Yのデータ種別は、変数Xのデータ種別とする。
【0042】
推論ルールテーブル81の推論ルールNo.5にて、X,Y,Zはある変数を示しており、Def(X,Y,Z)かつ、Vacant(Y)ならば、SameAttr(X,Z)であることを意味している。ただし、SameAttr(X,Z)に「?」が付いており、確定でないことを意味している。
【0043】
推論ルールテーブル81の推論ルールNo.6にて、Y,Aはある変数を示しており、推論ルールNo.2の前件が成立し、かつErrThrsh(Y)「Yが異常閾値」ならば、ErrFlag(A)「Aは異常判定フラグ(異常を示すフラグ)」であることを意味している。前件に推論ルールNo.2を用いているので、No.6が優先されるとする。つまり、Flag(A)よりErrFlag(A)の適用が優先される。
【0044】
図9は、変数依存関係グラフ61のノードと対応付けられた変数属性テーブル91を示しており、
図3の処理を1回実行した後の値が入っている。変数属性テーブル91の項目は、変数名、単位、データ種別からなる。
【0045】
変数属性テーブルにおいて、変数は実体で区別されており、記述位置では区別されていない。このため、変数依存関係グラフ61のノードと、変数属性テーブル91の行とは、n:1対応となっている。例えば変数strokeについて、変数依存関係グラフ61には対応するノードが2つあるが、変数属性テーブル91には対応する行は1つのみである。
【0046】
以下では、変数属性解釈部25が推論処理により変数属性テーブル91を生成する過程を説明する。変数属性解釈部25は、依存関係解析部22から変数依存関係グラフ61のデータを受け取り、変数依存関係グラフ61に含まれる変数から、変数属性テーブル91のデータ構造を生成する。この時点で、変数属性テーブル91には変数名のみが入っており、残りのデータは空である。各変数の属性情報の更新を示すフラグ(変数属性テーブル91に記載なし)はクリアする。
【0047】
次に変数属性解釈部25は、変数依存関係グラフ61に含まれる変数の属性情報を、変数属性データベース24の変数属性テーブル71から取得する。ただし本実施例では、入力用変数の属性情報のみを取得する。すると、変数reg_ad_1に関する属性情報が取得されるので、変数属性テーブル91に値を入れる。この際、変数reg_ad_1の属性情報の更新を示すフラグをセットする。
【0048】
次に変数属性解釈部25は、変数依存関係グラフ61の推論始端となる変数を抽出する。全ノードについて、依存元となる変数の有無を判定し、無いと判定されたノードだけ残すと、変数stroke(L20@control)が抽出される。この変数に対して、変数属性解釈部25は
図4の「属性推論」処理を行う。
【0049】
変数stroke(L20@control)に対して「属性推論」処理が実行されると、「属性推論」は再帰的な処理となっているため、変数依存関係グラフ61の全ノードに対して「属性推論」処理が実行される。変数reg_ad_1(L7@input)は、依存先変数を持たないので、属性情報が保持される。この属性情報は、変数属性テーブル71から取得した値と同じである。
【0050】
次に、変数stroke_raw(L7@input)に対して、ステップ42〜45の処理が実行される。依存先変数のreg_ad_1(L7@input)は、変数属性テーブル71から値を取得したことで、属性情報が更新されているので、推論ルールテーブル81から合致する推論ルールが検索される。合致する推論ルールとしてNo.1が抽出され(推論ルールのXがreg_ad_1,Yがstroke_raw)、stroke_rawの属性は、reg_ad_1と同じ内容に更新される。
【0051】
同様に他の変数の属性情報も更新していく。変数stroke_raw(L16@convert)と変数stroke_raw(L10@check)は、変数stroke_raw(L7@input)とデータ依存関係なので、属性情報は更新しない(更新済みである)。
【0052】
変数stroke_max(L10@check)は、推論ルールテーブル81の推論ルールNo.4に合致するので、データ種別は「ストローク量に対する閾値」、単位は「(A/D変換値)」と判定される。ただし確定ではないので、属性値に「?」が付いている。
【0053】
変数err_stroke(L11@check)は、推論ルールテーブル81の推論ルールNo.2に合致する(推論ルールのXがstroke_raw,Yがstroke_max,Aがerr_stroke)ので、後件のFlag(A)から、err_strokeの属性情報について、データ種別はストローク量に対する判定フラグであり、判定フラグなので単位はなしに更新される。またSameAttr(X,Y)から、stroke_maxの属性は、stroke_rawと同じ内容に更新される。
【0054】
変数err_stroke(L15@convert)はerr_stroke(L11@check)とデータ依存関係なので、属性情報は更新しない。
【0055】
変数stroke(L16@convert)は、推論ルールテーブル81の推論ルールNo.3に合致する(推論ルールのXがstroke_raw,Yがc_in_stroke,Zがstroke)。しかし、c_in_strokeの属性情報が空であり不明なので、推論を進めることはできない。その一方で、推論ルールNo.5にも合致するので、strokeデータ種別は「ストローク量」と判定される。ただし確定ではないので、属性値に「?」が付いている。
【0056】
以上で、
図3の処理を終了する。同様にして、出力用変数の属性情報をもとに、後ろ向きに推論を進めてもよい。
【0057】
以上のようにして、一部の変数の属性情報から、他の変数の属性情報を自動的に推論することができ、ユーザが手作業で変数の依存関係を追跡し、属性情報を解釈していくより、短い時間で変数の属性情報を得ることができる。
【0058】
図10は、ユーザからの変数属性情報の入力を受けて
図3の推論処理を再度実行し、変数属性テーブル91を更新した変数属性テーブル101を示している。
【0059】
変数属性テーブル91の値が推論処理により導出された後で、ユーザが変数属性入力部23に対し、変数stroke_maxのデータ種別が「異常閾値」、単位が「(A/D変換値)」であると入力する。これらの属性値は、データ種別と単位と、それぞれに取りうる値が用意されており、候補としてリスト表示される。ユーザは表示装置13上でリストを目視し、入力装置12から選択の上、確定させる。検証モデル生成プログラム1131内では、データ種別の候補として、「閾値」や「異常閾値」などが予め定義されている。また、「異常閾値」は「閾値」の下位概念であると定義されている。このため、変数stroke_maxのデータ種別が「閾値」のときは、リスト上で現在の値として「閾値」が選択状態にあり、その次の候補として下位概念である「異常閾値」がリスト上で順に表示される。
【0060】
ユーザが属性情報の入力を確定させると、検証モデル生成プログラム1131は
図3の推論処理を実行する。すると変数err_strokeの属性情報が、推論ルールNo.6により更新され、データ種別は「ストローク量の異常判定フラグ」となる。
【0061】
さらにユーザが変数c_in_strokeの属性情報として、データ種別を「係数」、単位を「cm/(A/D変換値)」と入力して確定させると、検証モデル生成プログラム1131は
図3の推論処理を実行し、変数strokeの属性情報が推論ルールNo.3により更新され、データ種別は「ストローク量」、単位は「cm」となる。単位を示すデータは、分子と分母とそれぞれに要素を用意して、分子と分母で重複するものを除去すればよい。なお、単位系の演算規則は、推論ルールテーブル81と同様に、検証モデル生成プログラム1131内に定義しておくものとする。
【0062】
以上のようにして、ユーザが変数の属性情報を追加入力することで、属性情報を推論できる変数の個数を増やし、全変数に対する割合を向上させることができるので、ユーザが手作業で変数の属性情報を解釈するより、さらに短い時間で変数の属性情報を得ることができる。
図11は、検証モデル生成プログラム1131の機能構成を示しており、これらの機能は
図2の基本機能構成と併せて動作する。
【0063】
依存関係限定部111は、依存関係解析部22から解析対象のソースコードに関する依存関係情報を受け取り、依存関係情報に含まれる各変数について個別に、ソースコード抽出時に残すか否かのデータ(残存設定データ)と対応付けて管理する。残存設定データは2値(True;残す、False;残さない)で示され、依存関係情報のうちソースコード抽出に利用する範囲を限定する意味がある。残存設定データの初期値は、例えば全変数についてTrueとする。また依存関係解析部22は、ユーザ入力や外部環境モデル選択部116からの指定を受けて、残存設定データを変更する。
【0064】
依存関係情報において、ソースコード抽出時に残る設定となっている変数と、残らない設定となっている変数とに依存関係があるとき、残る変数がソフトウェアモデルと外部環境モデルとの境界になる。以下、このような変数を境界変数と呼ぶ。例えば変数依存関係グラフ61において、stroke_raw(L7@input)を残すと設定し、reg_ad_1(L7@input)を残さないと設定したとき、stroke_raw(L7@input)は境界変数である。
【0065】
依存関係解析部22の残存設定データに対する、ユーザ入力や外部環境モデル選択部116からの指定内容は、各変数の残存設定でもよいし、境界に指定する変数でも良い。例えばstroke_raw(L7@input)を入力側の境界変数に指定するとき、stroke_raw(L7@input)の残存設定はTrueとなり、reg_ad_1(L7@input)の残存設定はFalseとなる。
【0066】
ソースコード抽出部112は、ファイル入力部21から解析対象のソースコードを受け取り、依存関係限定部111による依存関係情報とその残存設定データとに基づいて、ソースコードの抽出(スライシング)を行う。抽出したソースコードはファイルに出力する。スライシングの方法として例えば、ソースコードを構文解析した後、依存関係情報に含まれる変数のうち、残存設定がTrueの変数が記述されているステートメント、およびそのステートメントを包含する構文(関数など)、関連する構文(変数宣言など)を残し、それ以外のコードを除去する。
【0067】
モデル変換部113は、ソースコード抽出部112が出力するスライシング後のソースコードを、モデル検査器が扱えるモデル記述言語に変換する。例えばSPIN(Simple Promela INterpriter)というモデル検査器では、モデル記述言語はPromelaである。モデル変換の方法として、ソースコードを構文解析した後、ソースコードの構文から、モデル記述言語の構文へ変換する規則に基づいて各構文を変換する。この変換規則は予め用意しておく。変換により得られるモデルは、検査対象となるソフトウェアに関する検証用モデルであり、検査対象となるシステムに関する検証用モデルの部品である。
【0068】
外部環境モデルデータベース114は、検証対象となるソフトウェアの外部環境について予めコーディングまたは自動コード生成用にテンプレート化されたモデル部品について、属性と紐付けられて記憶されている。外部環境モデル候補抽出部115は、依存関係限定部111から残存設定データと対応付けられた依存関係情報を、変数属性解釈部25から検証対象となるソフトウェアの各変数の属性情報を受け取り、残存設定がTrueとなっている変数の属性情報の一部(データ項目や単位など)を検索キーとして、インタフェースが合致する外部環境モデルを、外部環境モデルデータベース114より抽出する。抽出された外部環境モデルは、検証対象となるソフトウェアの外部環境となりうるモデルである。
【0069】
外部環境モデル選択部116は、外部環境モデル候補抽出部115により抽出された外部環境モデルの属性(名称等)を、ユーザに対して表示装置13を用いてリスト表示し、ユーザからの各外部環境モデルの利用有無について、入力装置12から指定を受け付ける。利用有無は、デフォルトでは「なし」である。ユーザが外部環境モデルの1つについて、利用有無を「あり」に指定すると、選択された外部環境モデルのインタフェースとなっている変数の属性情報が、依存関係限定部111に渡され、依存関係限定部111は検証対象となるソフトウェアの変数のうち、外部環境モデルのインタフェース変数と属性が合致する変数を依存関係情報から検索し、境界変数として残存設定を変更する。具体的には、境界変数は残す設定とする。インタフェース変数が入力のとき、境界変数から依存元方向(より出力に近い方)の変数は、残らない設定の変数を残る設定に変更する(例えば残存設定がTrueの変数が出現するまで)。また、境界変数から依存先方向(より入力に近い方)の変数は、残らない設定とする。インタフェース変数が出力のときには、入力のときと残存設定の変更が逆になる。なお外部環境モデル選択部116は、利用有無が「あり」に指定された外部環境モデルをファイルに出力してもよい。
【0070】
モデル合成部117は、モデル変換部113が出力するソフトウェアモデルと、外部環境モデル選択部116にて利用ありに指定された外部環境モデルとから、検証対象となるシステムの検証モデルを合成する。この際、外部環境モデルのインタフェース変数と、対応するソフトウェアの境界変数とで、一致しない属性情報がある場合、外部環境モデルのインタフェース変数の属性情報を変更する。例えば、インタフェース変数の名称を、境界変数の名称と同一に変更する。合成された検証モデルは、ハードディスク14にファイルとして出力される。
【0071】
図12は、検証モデル生成プログラム1131が
図2や
図11に示された機能を用いて行う処理であり、システムの検証モデルを生成する処理のフローを示している。
【0072】
処理を開始すると、ステップ121にて、検証モデル生成プログラム1131は、
図3の処理を行い、検証対象となるソフトウェアの依存関係情報を生成する。依存関係解析部22から、依存関係限定部111に、依存関係情報が渡されて管理される。
【0073】
ステップ122にて、外部環境モデル候補抽出部115は、ステップ121にて出力された依存関係情報をもとに、外部環境モデルデータベース114から外部環境モデルの候補を抽出する。
【0074】
ステップ123にて、検証モデル生成プログラム1131は、入力装置12からのユーザ入力を確認する。ユーザ入力がある変数の残存設定を変更するものであれば、ステップ124に進む。ユーザ入力が外部環境モデル候補抽出部115の抽出したある外部環境モデルの利用有無設定を変更するものであれば、ステップ125に進む。ユーザ入力がシステムの検証モデル合成を指示するものであれば、ステップ127に進む。
【0075】
ステップ124にて、依存関係限定部111は、ユーザ入力に従って依存関係情報における各変数の残存設定を変更し、ステップ122に戻る。ステップ122では、各変数の残存設定の変更に対応して、外部環境モデル候補の抽出を再度実行する。
【0076】
ステップ125にて、外部環境モデル選択部116は、ユーザ入力に従って各外部環境モデルの利用有無設定を変更し、ステップ126に進む。ステップ126にて、依存関係限定部111は、ステップ125にて利用ありと設定された外部環境モデルの、インタフェース変数の属性から、検証対象となるソフトウェアにて対応する境界変数を検索し、依存関係情報における各変数の残存設定を変更する。変更が完了したら、ステップ123に戻る。
【0077】
ステップ127にて、ソースコード抽出部112は、変数の残存設定を付与された依存関係情報を利用してソースコードの抽出を行う。ステップ128にて、モデル変換部113は、ステップ127にて抽出されたソースコードを、ソフトウェアの検証用モデルに変換する。ステップ129にて、モデル合成部117は、ステップ128にて出力されたソフトウェアの検証モデルと、ステップ125にて利用ありと設定された外部環境モデルとから、システムの検証モデルを合成して出力する。以上により処理を終了する。
【0078】
図13の外部環境モデル属性テーブル131は、外部環境モデルデータベース114に記録されている外部環境モデルに関する属性情報の例であり、このテーブルも外部環境モデルデータベース114に記録されている。変数属性テーブル131の1行は1つの外部環境モデルに紐付いており、項目は外部環境モデル名、インタフェース変数名、in/out(インタフェース変数が入力か出力か)、(インタフェース変数の)単位、(インタフェース変数の)データ種別、(外部環境モデルの)抽象度からなる。これらの値は予め設定されている。
【0079】
外部環境モデル属性テーブル131には、Stroke1、Stroke2、Stroke3の3つの外部環境モデルが登録されており、どれもインタフェース変数のデータ種別は「ストローク量」、入出力は「入力」である。一方で、インタフェース変数の単位は、Stroke1とStroke2が「(A/D変換値)」、Stroke3は「cm」となっている。
【0080】
外部環境モデル候補抽出部115は、
図10の変数属性テーブル101を変数属性解釈部25から受け取り、外部環境モデル属性テーブル131とデータ種別および単位が合致する外部環境モデルを抽出する。すると、変数reg_ad_1とstroke_rawに対してはStroke1とStroke2が、変数strokeに対してはStroke3が抽出され、外部環境モデル選択部116にその属性情報と共に渡される。
【0081】
また依存関係限定部111は、外部環境モデル選択部116から、Stroke1〜Stroke3のうち、ユーザに利用ありと設定された外部環境モデルのインタフェース変数に関する属性情報を受け取り、依存関係情報における各変数の残存設定を変更する。例えばユーザがStroke3を利用ありに設定したとき、そのインタフェース変数のデータ種別「ストローク量」と単位「cm」が依存関係限定部111に渡され、依存関係限定部111は対応する変数strokeを境界変数として扱う。
【0082】
図14の検証用モデル140は、検証対象システムについてモデル合成部117が出力する検証用モデルの例である。なお検証用モデル140を出力する前提として、外部環境モデル選択部116では外部環境モデルとしてStroke3がユーザ入力により利用ありに設定されており、依存関係限定部111ではユーザ入力により変数err_strokeの残存設定がFalseにされているとする。またモデル合成部117が利用する変換ルールは、C言語の関数をPromelaのインラインマクロに置換し、関数コールグラフにてどの関数からも呼び出しされていない関数に対応するインラインマクロを実行するプロセスを追加するとしている。
【0083】
検証用モデル140は、4つの部分から成っている。検証用モデル部品141は、ソフトウェアモデルと外部環境用モデルにて使用されている変数や固定値の宣言を、モデル合成部117がまとめたものである。検証用モデル部品142は、外部環境モデルデータベース114に記録されている外部環境モデルStroke3のコードについて、インタフェース変数名を境界変数strokeの名称に変更したものである。検証用モデル部品143は、モデル変換部113が変換して出力したソフトウェアの検証用モデルについて、さらにモデル合成部117が、境界変数stroke(14行目)に値を代入する構文を、外部環境モデルStroke3のインラインマクロ呼び出しに置換したものである。このようなインラインマクロへの置換は、予め変換ルールとして決めておく。検証用モデル部品144は、モデル合成部117にて追加されたプロセスである。
【0084】
以上のようにしてシステムの検証用モデルをプログラムが合成することにより、ユーザは外部環境モデルの選択に掛かる工数や、ソフトウェアモデルと外部環境モデルとの入出力を整合させる手間を低減させることができる。またさらに、ユーザがソフトウェアとその外部環境の双方をモデル化する作業に掛かる工数を低減することができる。