(57)【要約】【課題】領域不定変数を使用する制御ソフトウェアの検証を行うソフトウェア検証装置を提供する。【解決手段】ソフトウェア検証装置は、制御ソフトウェアを実行してＣＰＵの動作を模擬するＣＰＵシミュレータと、ＣＰＵシミュレータと外的要因シミュレータを連携動作させる連携部と、を備えており、連携部は、制御ソフトウェアに含まれる各関数で宣言される領域不定変数の種別を示す領域不定変数情報と、領域不定変数に割り当てられる仮想アドレス空間のアドレスとスタックポインタ値との関係を領域不定変数の種別ごとに示す仕様情報とを有し、ＣＰＵシミュレータから通知された関数コールで呼び出される関数で宣言される領域不定変数に割り当てられるアドレスを、関数コールと共に通知されたスタックポインタ値、仕様情報および領域不定変数情報から計算し、計算したアドレスをＣＰＵシミュレータに通知する。【選択図】図１
2013058177.tif 000002
【特許請求の範囲】
【請求項１】
装置に組み込まれるＣＰＵが実行する制御ソフトウェアの検証装置であって、
前記制御ソフトウェアを実行して前記ＣＰＵの動作を模擬するＣＰＵシミュレータと、
前記装置の前記ＣＰＵにより制御される機能の動作を模擬する外的要因シミュレータと、
前記ＣＰＵシミュレータと前記外的要因シミュレータとの間で送受信される情報を伝達して、前記ＣＰＵシミュレータと前記外的要因シミュレータを連携動作させる連携手段と、
を備えており、
前記ＣＰＵシミュレータは、前記連携手段から通知された仮想アドレス空間のアドレスを含む通知対象アドレス範囲情報を有しており、前記制御ソフトウェアの実行によりアクセスするアドレスが、前記通知対象アドレス範囲情報に含まれるアドレスであると、アクセスするアドレスを前記連携手段に通知し、前記制御ソフトウェアの実行により関数コールが発生すると、該関数コールが発生したときのスタックポインタ値および該関数コールにより呼び出される関数を示す情報と共に該関数コールの発生を前記連携手段に通知し、
前記連携手段は、前記制御ソフトウェアに含まれる各関数で宣言される領域不定変数の種別を示す領域不定変数情報と、領域不定変数に割り当てられる仮想アドレス空間のアドレスとスタックポインタ値との関係を領域不定変数の種別ごとに示す仕様情報とを有し、前記ＣＰＵシミュレータから通知された関数コールで呼び出される関数で宣言される領域不定変数に割り当てられるアドレスを、前記通知されたスタックポインタ値、前記仕様情報および前記領域不定変数情報から計算し、計算したアドレスを前記ＣＰＵシミュレータに通知する、
ことを特徴とするソフトウェア検証装置。
【請求項２】
前記連携手段は、前記ＣＰＵシミュレータから通知された関数コールで呼び出された関数について、ネストの深さを示すネスト値を含む管理情報を保持しており、前記ＣＰＵシミュレータから第１の関数を呼び出す関数コールの通知を受けると、前記第１の関数のネスト値を実行中に対応する値に設定し、前記第１の関数で宣言される領域不定変数に割り当てられるアドレスの追加を前記ＣＰＵシミュレータに通知し、続いて、前記ＣＰＵシミュレータから第２の関数を呼び出す関数コールの通知を受けると、前記第２の関数のネスト値を実行中に対応する値に設定し、前記第１の関数のネスト値をネストの深さが１であることを示す値に変更し、前記第２の関数で宣言される領域不定変数に割り当てられるアドレスの追加と、前記第１の関数で宣言される領域不定変数に割り当てられたアドレスの削除を、前記ＣＰＵシミュレータに通知し、
前記ＣＰＵシミュレータは、前記通知対象アドレス範囲情報に含まれるアドレスを、前記連携手段からの通知に応じて更新する、
ことを特徴とする請求項１に記載のソフトウェア検証装置。
【請求項３】
前記管理情報は、各領域不定変数の種別を示す情報を含み、
前記連携手段は、前記ＣＰＵシミュレータから前記第２の関数を呼び出す関数コールの通知を受けると、前記第１の関数で宣言される領域不定変数の種別に基づき、前記第１の関数で宣言される領域不定変数が前記第２の関数で有効であるか無効であるかを判定し、無効である領域不定変数に割り当てられたアドレスの削除を、前記ＣＰＵシミュレータに通知し、有効である領域不定変数に割り当てられたアドレスの削除を、前記ＣＰＵシミュレータに通知しない、
ことを特徴とする請求項２に記載のソフトウェア検証装置。
【請求項４】
前記ＣＰＵシミュレータは、前記制御ソフトウェアの実行により関数リターンが発生すると、該関数リターンの発生を前記連携手段に通知し、
前記連携手段は、前記ＣＰＵシミュレータから関数リターンの発生の通知を受けると、ネスト値から実行中の関数と、前記関数リターンの発生により実行中となる関数を判定し、実行中の関数で宣言される領域不定変数に割り当てられたアドレスの削除と、前記関数リターンの発生により実行中となる関数で宣言される領域不定変数に割り当てられたアドレスの追加を、前記ＣＰＵシミュレータに通知する、
ことを特徴とする請求項２又は３に記載のソフトウェア検証装置。
【請求項５】
前記管理情報は、各領域不定変数のアドレス範囲についてのアドレス条件を示す情報を含み、
前記連携手段は、領域不定変数に割り当てられるアドレスが該領域不定変数のアドレス条件に合致する場合、該領域不定変数に割り当てられるアドレスの追加を前記ＣＰＵシミュレータに通知し、合致しない場合、該領域不定変数に割り当てられるアドレスの追加を前記ＣＰＵシミュレータに通知しない、
ことを特徴とする請求項２から４のいずれか１項に記載のソフトウェア検証装置。
【請求項６】
装置に組み込まれるＣＰＵが実行する制御ソフトウェアの検証装置であって、
前記制御ソフトウェアを解析して、領域不定変数の保存領域の確保命令を認識すると、該確保命令の通知命令を、該確保命令の前又は後ろに追加して、修正した制御ソフトウェアを出力する処理を行う前処理手段と、
前記修正した制御ソフトウェアを実行して前記ＣＰＵの動作を模擬するＣＰＵシミュレータと、
前記装置の前記ＣＰＵにより制御される機能の動作を模擬する外的要因シミュレータと、
前記ＣＰＵシミュレータと前記外的要因シミュレータとの間で送受信される情報を伝達して、前記ＣＰＵシミュレータと前記外的要因シミュレータを連携動作させる連携手段と、
を備えており、
前記ＣＰＵシミュレータは、前記連携手段から通知された仮想アドレス空間のアドレスを含む通知対象アドレス範囲情報を有しており、前記制御ソフトウェアの実行によりアクセスするアドレスが、前記通知対象アドレス範囲情報に含まれるアドレスであると、前記連携手段にアクセスするアドレスを通知し、前記制御ソフトウェアの実行により通知命令を読み出すと、該通知命令を読み出したときのスタックポインタ値と、該通知命令の前又は後の確保命令の対象である領域不定変数の種別を示す情報と共に領域確保イベントを前記連携手段に通知し、
前記連携手段は、領域不定変数に割り当てられる仮想アドレス空間のアドレスとスタックポインタ値との関係を領域不定変数の種別ごとに示す仕様情報を有し、前記ＣＰＵシミュレータから通知された領域確保イベントに含まれるスタックポインタ値および変数の種別と、前記仕様情報から、該領域確保イベントに対応する通知命令の前又は後の確保命令の対象である領域不定変数に割り当てられるアドレスを計算し、計算したアドレスを前記ＣＰＵシミュレータに通知する、
ことを特徴とするソフトウェア検証装置。
【請求項７】
請求項１から６のいずれか１項に記載のソフトウェア検証装置としてコンピュータを機能させることを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、装置を制御するための制御ソフトウェアの検証を行うソフトウェア検証装置に関し、特に、領域不定変数を使用している制御ソフトウェアの検証を行うソフトウェア検証装置に関する。
【背景技術】
【０００２】
特許文献１は、装置に組み込まれ、装置の各部を制御するＣＰＵで動作する制御ソフトウェアの検証のため、当該ＣＰＵの動作を模擬するＣＰＵシミュレータの利用を開示している。また、通常の装置においては、ＣＰＵに制御される各機能ブロックの状態変化に応じて、ＣＰＵの動作が変化し、かつ、ＣＰＵからの信号出力により、ＣＰＵに制御される各機能ブロックの動作は変化する。このため、特許文献２は、ＣＰＵがアクセスし、かつ、それらから値を読み込むペリフェラルの動作を模擬する外的要因シミュレータの使用を開示している。なお、ペリフェラルとは、装置のＣＰＵ以外の機能ブロックであり、ＣＰＵがその値を読み込んだり、値を出力したりするものである。外的要因シミュレータは、ＣＰＵシミュレータから情報を受け取って、対応する機能の動作を模擬し、模擬結果を、ＣＰＵシミュレータへ送信したり、割込要求を出力したりする。この様に、ＣＰＵシミュレータと外的要因シミュレータとを連携動作させるシステムを、以下、シミュレーション連携システムと呼ぶ。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開平６−２０２９０３号公報
【特許文献２】特開２００５−３３９０２９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
シミュレーション連携システムにおいて、ＣＰＵシミュレータは、外的要因シミュレータに対する何らかの制御のために出力値等を変更する場合、例えば、仮想アドレス空間上の当該制御の出力値を保持するメモリにアクセスしてその値を書き換える。この値の書き換えを外的要因シミュレータに通知するため、ＣＰＵシミュレータは、外的要因シミュレータにメモリアクセスイベントの通知を行う。しかしながら、総てのメモリアクセス毎にイベント発生通知を行うと通信負荷が大きくなる。このため、外的要因シミュレータに通知が必要な制御対象に対応する仮想アドレス空間のアドレス範囲を定義しておき、ＣＰＵシミュレータは、定義されたアドレス範囲へのメモリアクセスのみを外的要因シミュレータに通知している。なお、この制御対象は、ＣＰＵで実行する制御ソフトウェアにおいては、通常、変数で記述されている。
【０００５】
しかしながら、この場合、外的要因シミュレータにそのアクセスを通知すべき変数に割り当てられたアドレスを、シミュレーションの実行前に判定する必要がある。ここで、変数は、コンパイル時にメモリアドレスが割り当てられるグローバル変数と、プログラム実行中に動的にメモリアドレスが割り当てられる領域不定変数（仮引数、ローカル変数など）に分類することができる。領域不定変数のアドレス領域は、関数コールの前後に、通常はスタック領域上に確保される。具体的には、関数コール時のスタックポインタ値からの相対アドレスで、領域不定変数の保存領域が指定される。なお、スタックポインタ値は、関数コール毎に変わるため、領域不定変数の保存領域は実際にＣＰＵが関数を実行するまで分からないことになる。よって、従来のシミュレーション連携システムでは領域不定変数を取り扱うことができなかった。
【０００６】
本発明は、領域不定変数を使用する制御ソフトウェアの検証を行うソフトウェア検証装置及びプログラムを提供するものである。
【課題を解決するための手段】
【０００７】
本発明によるソフトウェア検証装置は、装置に組み込まれるＣＰＵが実行する制御ソフトウェアの検証装置であって、制御ソフトウェアを実行してＣＰＵの動作を模擬するＣＰＵシミュレータと、装置のＣＰＵにより制御される機能の動作を模擬する外的要因シミュレータと、ＣＰＵシミュレータと外的要因シミュレータとの間で送受信される情報を伝達して、ＣＰＵシミュレータと外的要因シミュレータを連携動作させる連携手段と、を備えており、ＣＰＵシミュレータは、連携手段から通知された仮想アドレス空間のアドレスを含む通知対象アドレス範囲情報を有しており、制御ソフトウェアの実行によりアクセスするアドレスが、通知対象アドレス範囲情報に含まれるアドレスであると、アクセスするアドレスを連携手段に通知し、制御ソフトウェアの実行により関数コールが発生すると、該関数コールが発生したときスタックポインタ値および該関数コールにより呼び出される関数を示す情報と共に該関数コールの発生を連携手段に通知し、連携手段は、制御ソフトウェアに含まれる各関数で宣言される領域不定変数の種別を示す領域不定変数情報と、領域不定変数に割り当てられる仮想アドレス空間のアドレスとスタックポインタ値との関係を領域不定変数の種別ごとに示す仕様情報とを有し、ＣＰＵシミュレータから通知された関数コールで呼び出される関数で宣言される領域不定変数に割り当てられるアドレスを、通知されたスタックポインタ値、仕様情報および領域不定変数情報から計算し、計算したアドレスを前記ＣＰＵシミュレータに通知する、ことを特徴とする。
【０００８】
また、本発明によるソフトウェア検証装置は、装置に組み込まれるＣＰＵが実行する制御ソフトウェアの検証装置であって、制御ソフトウェアを解析して、領域不定変数の保存領域の確保命令を認識すると、該確保命令の通知命令を、該確保命令の前又は後ろに追加して、修正した制御ソフトウェアを出力する処理を行う前処理手段と、修正した制御ソフトウェアを実行してＣＰＵの動作を模擬するＣＰＵシミュレータと、装置のＣＰＵにより制御される機能の動作を模擬する外的要因シミュレータと、ＣＰＵシミュレータと外的要因シミュレータとの間で送受信される情報を伝達して、ＣＰＵシミュレータと外的要因シミュレータを連携動作させる連携手段と、を備えており、ＣＰＵシミュレータは、連携手段から通知された仮想アドレス空間のアドレスを含む通知対象アドレス範囲情報を有しており、制御ソフトウェアの実行によりアクセスするアドレスが、通知対象アドレス範囲情報に含まれるアドレスであると、連携手段にアクセスするアドレスを通知し、制御ソフトウェアの実行により通知命令を読み出すと、該通知命令を読み出したときのスタックポインタ値と、該通知命令の前又は後の確保命令の対象である領域不定変数の種別を示す情報と共に領域確保イベントを前記連携手段に通知し、連携手段は、領域不定変数に割り当てられる仮想アドレス空間のアドレスとスタックポインタ値との関係を領域不定変数の種別ごとに示す仕様情報を有し、ＣＰＵシミュレータから通知された領域確保イベントに含まれるスタックポインタ値および変数の種別と、仕様情報から、該領域確保イベントに対応する通知命令の前又は後の確保命令の対象である領域不定変数に割り当てられるアドレスを計算し、計算したアドレスをＣＰＵシミュレータに通知する、ことを特徴とする。
【発明の効果】
【０００９】
連携手段が領域不定変数に割り当てられたアドレスを計算してＣＰＵシミュレータに通知することで、シミュレーション連携システムにおいて領域不定変数を取り扱うことが可能となる。
【図面の簡単な説明】
【００１０】
【図１】一実施形態によるソフトウェア検証装置の機能ブロック図。
【図２】一実施形態によるソフトウェア検証装置のハードウェア構成を示す図。
【図３】一実施形態による定義情報を示す図。
【図４】一実施形態による検証処理のシーケンス図。
【図５】一実施形態による検証処理のシーケンス図。
【図６】管理情報、出力ログ及び通知対象アドレス範囲情報を示す図。
【図７】管理情報、出力ログ及び通知対象アドレス範囲情報を示す図。
【図８】管理情報、出力ログ及び通知対象アドレス範囲情報を示す図。
【図９】管理情報、出力ログ及び通知対象アドレス範囲情報を示す図。
【図１０】管理情報、出力ログ及び通知対象アドレス範囲情報を示す図。
【図１１】再起呼出が発生しているときの管理情報を示す図。
【図１２】タイミングチャート形式でのログ情報を示す図。
【図１３】一実施形態によるソフトウェア検証装置の機能ブロック図。
【図１４】一実施形態による検証処理のシーケンス図。
【図１５】管理情報を示す図。
【図１６】一実施形態による領域不定変数情報を示す図。
【発明を実施するための形態】
【００１１】
（第一実施形態）本発明においてソフトウェア検証装置は、コンピュータシステム２０１上でプログラムを実行することで実現でき、そのハードウェア構成を図２に示す。図２の本体部２０２のハードディスク２０２ｃには、ソフトウェア検証装置の各機能を実現するためのプログラムが格納される。中央処理部（ＣＰＵ）２０２ａは、プログラム及び各種データを主記憶部２０２ｂにロードして実行することで、コンピュータシステム２０１はソフトウェア検証装置として動作する。なお、表示装置２０３は、本体部２０２からの指示により画面表示を行う。また、キーボード２０４は、このコンピュータシステム２０１にユーザの指示や文字情報を入力するためのものである。さらに、マウス２０５は、表示装置２０３上の任意の位置を指定することによりその位置に表示されていたアイコン等に応じた指示を入力するためのものである。
【００１２】
図１は、本実施形態によるソフトウェア検証装置３６０の機能ブロック図である。ＣＰＵシミュレータ３１０は、制御ソフトウェアを実行してターゲットＣＰＵの動作を模擬するものである。また、外的要因シミュレータ３５０及び３５２は、ペリフェラル、つまり、ターゲットＣＰＵに制御される周辺機器や機能ブロックの機能の動作を模擬するものである。さらに、ソフトウェア検証装置３６０は、ＣＰＵシミュレータ３１０と外的要因シミュレータ３５０及び３５２との間で送受信される情報の伝達を仲介して、これらを連携動作させる連携部３３０を備えている。なお、ターゲットＣＰＵとは、コンピュータシステム２０１に搭載されているＣＰＵ２０２ａではなく、制御ソフトウェアが実際に使用される装置のＣＰＵである。また、図において、外的要因シミュレータ３５０及び３５２の数を２つとしているがこれは例示である。
【００１３】
ＣＰＵシミュレータ３１０の命令実行部３１１は、検証対象である制御ソフトウェアを実行して、メモリや装置制御用のレジスタに値の読み書きを行う。情報格納部３１６は、ターゲットＣＰＵの仮想アドレス空間を定義する情報を有している。仮想アドレス空間には、ターゲットＣＰＵの主メモリだけではなく、制御対象のハードウェアへの制御信号に対応する値を書き込み、ハードウェアの状態を示す値を保持するレジスタも含まれている。さらに、仮想アドレス空間には、ＣＰＵの動作状態を一時保存する場所のアドレスを保持するスタックポインタも格納される。命令実行部３１１は、制御ソフトウェアのアクセス命令に従い、仮想アドレス空間の対応領域にアクセスする。
【００１４】
命令実行部３１１は、特定の命令の実行時、ＩＦ部３１２経由で連携部３３０に、当該特定命令の実行をイベントとして通知する。ここで、特定の命令とは、例えば、仮想アドレス空間へのメモリアクセス、関数コール、関数リターン処理等である。なお、命令実行部３１１は、イベント通知後、連携部３３０から再開指示を受け取るまで、模擬処理を停止する。総てのメモリアクセスを連携部３３０に通知すると命令実行部３１１は、その都度処理を中断するため、模擬処理の実行速度が遅くなる。よって、情報格納部３１６は、連携部３３０に通知すべきメモリアクセスのアドレス範囲を示す通知対象アドレス範囲情報を保持している。つまり、ＣＰＵシミュレータ３１０は、通知対象アドレス範囲へのメモリアクセスが発生した場合のみ連携部３３０にメモリアクセスイベントを通知する。
【００１５】
連携部３３０は、ＣＰＵシミュレータ３１０と、外的要因シミュレータ３５０及び３５２とで仮想アドレス空間の値を共有するためのものである。連携部３３０の管理部３３５に含まれる管理情報判定部３４０は、ユーザが予め作成した定義情報に基づき、管理情報の初期値を生成する。なお、管理情報とは、各変数の仮想アドレスと、外的要因シミュレータ３５０及び３５２において使用される変数ＩＤとの対応関係を示す情報を含むものである。その後、管理情報判定部３４０は、ＣＰＵシミュレータからの関数コールイベントや関数リターンイベントの通知に応じて管理情報を更新する。なお、その際、算出部３３６が、領域不定変数に割り当てられるアドレスを算出する。出力部３６１は、管理情報の更新に伴いログを出力する。連携部３３０は、さらに、必要に応じて、外的要因シミュレータ３５０又は３５２に、ＣＰＵシミュレータ３１０が設定した値に対応する制御情報を通知する。ＩＦ部３３１は、ＣＰＵシミュレータ３１０とのインタフェース部であり、ＩＦ部３３８及び３３９は、それぞれ、外的要因シミュレータ３５０及び３５２とのインタフェースである。
【００１６】
続いて定義情報について説明する。定義情報には、アドレスが変わらないグローバル変数の情報を含む領域不変変数情報と、アドレスが不定であり、必要に応じて割り当てられる領域不定変数に関する情報を含む領域不定変数情報と、コンパイラの仕様を示すコンパイラ仕様情報が含まれている。図３に、領域不変変数情報、領域不定変数情報及びコンパイラ仕様情報の例を示す。
【００１７】
図３（ａ）は、領域不変変数情報である。なお、図３（ａ）において、Ｓｉｍ３１０、３５１、３５２は、それぞれ、ＣＰＵシミュレータ３１０、外的要因シミュレータ３５１、３５２を示している。図３（ａ）に示す様に、領域不変変数情報は、各変数について、その名前、サイズ、割り当てられているアドレス、変数ＩＤ及び通信方向を示す情報を含んでいる。なお、変数ＩＤとは、外的要因シミュレータ３５０、３５２で使用している識別子である。また、通信方向は、情報の方向を示すものであり、Ｉｎは入力のみを、Ｏｕｔは出力のみを行うことを示し、Ｉｎ／Ｏｕｔは入力も出力も行うことを示している。たとえば、変数ｇ１の通信方向はＣＰＵシミュレータ３１０がＩｎ、外的要因シミュレータ３５０がＯｕｔであり、外的要因シミュレータ３５１が変数ｇ１の値を更新すると、その値がＣＰＵシミュレータ３１０に伝えられることになる。通信方向は、２つのシミュレータ間のみならず、例えば、図３（ａ）の変数ｇ４の様に、３つ以上のシミュレータ間でも定義することができる。さらに、変数ｇ５のように、Ｏｕｔ定義のみを行うことも可能である。この場合、外的要因シミュレータ３５０が設定する変数ｇ５の値は連携部３３０へ伝達されるが、連携部３３０から他のシミュレータには伝達されない。これは、変数ｇ５の更新履歴をログとして出力するために使用する。さらに、変数ｇ７の様に他プロセスとの通信を行わない設定も可能である。
【００１８】
図３（ｂ）は、領域不定変数情報であり、関数名と、その関数の実行コードが格納されている仮想アドレス空間の先頭のアドレスを示す情報と、その関数に関連する領域不定変数についての情報を含んでいる。ここで、領域不定変数についての情報は、変数名、サイズ及び種別を示す情報を含んでいる。なお、種別情報とは、当該変数が、仮引数、スタティック変数、ローカル変数であるといった情報、つまり、当該変数がどの関数で有効であるかといった有効範囲を示す情報である。図３（ｃ）はコンパイラ仕様情報であり、関数コール時、その変数に対して割り当てられるメモリ領域、具体的には、スタックポインタ値に対するオフセット値又はオフセット値を特定するための情報が領域不定変数の種別ごとに格納される。
【００１９】
例えば、変数がローカル変数であると、スタックポインタ値に３を加えたアドレスから、その変数のサイズを格納するだけのアドレス領域が当該変数に割り当てられることがコンパイラ仕様から判定することができる。この様に、算出部３３６は、領域不定変数情報及びコンパイラ仕様情報を保持し、連携部３３０が、ＣＰＵシミュレータ３１０から関数コールイベントの通知を受けると、呼び出された関数で宣言される領域不定変数に割り当てられるアドレスを算出する。また、管理情報判定部３４０は、領域不定変数情報を保持しており、ＣＰＵシミュレータ３１０から関数コールイベントの通知を受けると、算出部３３６が算出した領域不定変数のアドレスに基づき管理情報を更新する。
【００２０】
関数コール処理の前後においては、関数コールに関する処理しか行われないため、領域不定変数に割り当てられるアドレスは、コンパイラ仕様により確定できる。したがって、ＣＰＵシミュレータ３１０からの関数コールイベントにより、領域不定変数に割り当てられるアドレスを動的に計算して管理情報を更新すると共に、計算したアドレスをＣＰＵシミュレータ３１０に通知することで領域不定変数の取り扱いが可能となる。
【００２１】
以下、図４及び図５のシーケンス図を用いてより具体的に説明する。なお、定義情報は、図３に示す通りであるものとする。シミュレーションの開始により、連携部３３０の管理情報判定部３３６は、Ｓ１において定義情報を読み込み、Ｓ２において管理情報を更新する。なお、Ｓ２においては、領域不変変数情報のみに基づき管理情報を更新する。したがって、Ｓ２の終了時点での管理情報は図６（ａ）の様になる。図に示す様に、連携部３３０は、領域不変変数情報に含まれる変数のうち、通信方向において入出力の定義が行われていない変数ｇ７以外の変数ｇ１〜ｇ６を管理情報に登録する。なお、値はこの時点では不定であるため、その旨を管理情報に設定する。また、図４のシーケンス図には示していないが、出力部３６１は、管理情報が更新されると、その内容をログとして出力する。図６（ｂ）はＳ２の処理で、出力部１が出力するログ情報を示している。なお、ログ情報において時間はその値が更新されたシミュレーション上の時間を示している。
【００２２】
続いて、連携部３３０は、Ｓ３において、管理情報に新たに追加された変数のうち、ＣＰＵシミュレータ３１０がアクセスする変数に対応するアドレスをＣＰＵシミュレータ３１０に通知する。つまり、本例では、変数ｇ１、ｇ２、ｇ４及びｇ５に対応するアドレスが通知される。なお、本例において、各アドレスには１バイトのデータが記憶されるものとする。また、ＣＰＵシミュレータ３１０が読み出しアクセスする変数、つまり、通信方向としてＩｎが定義されている変数については、ＣＰＵシミュレータ３１０に通知しない構成とすることもできる。ＣＰＵシミュレータ３１０は、Ｓ４において、連携部３３０からの通知に基づき通知対象アドレス範囲情報を更新する。図６（ｃ）はＳ４の処理の終了時点における通知対象アドレス範囲情報を示している。
【００２３】
続いて、連携部３３０は、Ｓ５において、ＣＰＵシミュレータ３１０に模擬処理の開始を指示する。ＣＰＵシミュレータ３１０は、検証対象ソフトウェアの関数コール命令を読み出すと、Ｓ６において、関数コールイベントの発生を連携部３３０に通知する。このとき、関数のアドレス及びスタックポインタ値も通知する。連携部３３０の算出部３３６は、ＣＰＵシミュレータ３１０から関数コールイベントの通知を受けると、Ｓ７において、呼び出された関数（第１の関数）で宣言される領域不定変数のアドレスを算出する。具体的には、通知された関数のアドレスが０ｘ１０３０であるため、領域不定変数情報より変数ｄ１及びｄ２が特定される。領域不定変数情報から変数ｄ１及びｄ２はローカル変数であり、コンパイラ仕様情報から、ローカル変数の開始アドレスは、スタックポインタ値からのオフセットが３である。したがって、算出部３３６は、領域不定変数情報で先に定義されている変数ｄ１の開始アドレスを、通知されたスタックポインタ値に３を加えた０ｘ４０２０と算出する。また、変数ｄ１のサイズは２バイトであるため、算出部３３６は、変数ｄ１の終了アドレスを０ｘ４０２１と算出する。よって、算出部３３６は、変数ｄ２の開始アドレスを、変数ｄ１の１つ後である０ｘ４０２２と算出し、変数ｄ１も２バイトであるため、その終了アドレスを０ｘ４０２３と算出する。
【００２４】
その後、連携部３３０の管理情報判定部３４０は、Ｓ８において、呼び出された関数で宣言される領域不定変数についての情報を管理情報３３７に登録し、また、ログへ出力する。図７（ａ）は、Ｓ８における管理情報であり、図７（ｂ）は、Ｓ８におけるログ情報である。図７（ａ）において、初めての関数コールであるため、ネスト値には０が設定される。また、通信方向については、ＣＰＵシミュレータ３１０内での取り扱いのため、ＣＰＵシミュレータ３１０のみにＯｕｔを設定する。さらに、変数の値は不定とし、変数種別を、ローカル変数を表す値とする。また、ネスト値が０である関数が実行中の関数であり、実行中の関数に含まれる領域不定変数の状態は有効に設定される。
【００２５】
その後、連携部３３０は、Ｓ９において、管理情報に追加したアドレスをＣＰＵシミュレータ３１０に通知し、ＣＰＵシミュレータ３１０は、Ｓ１０において、通知に基づき通知対象アドレス範囲情報を更新する。更新後の通知対象アドレス範囲を図７（ｃ）に示す。
【００２６】
Ｓ１１において、ＣＰＵシミュレータ３１０の命令実行部３１１は、アドレス０ｘ１ＦＦＦへのメモリアクセスを実行する。アドレス０ｘＩＦＦＦは、通知対象アドレス範囲に含まれていないため、このメモリアクセスは連携部３３０には通知されない。続いて、命令実行部３１１は、Ｓ１２において、アドレス０ｘ２０００へのメモリアクセスを実行する。アドレス０ｘ２０００は、通知対象アドレス範囲に含まれているため、ＣＰＵシミュレータ３１０の命令実行部３１１は、Ｓ１３において、このメモリアクセスを連携部３３０に通知する。連携部３３０は、ＣＰＵシミュレータ３１０からメモリアクセスイベントの通知を受けると管理情報を参照して、ＣＰＵシミュレータ３１０の通信方向を確認する。アドレス０ｘ２０００の通信方向は、Ｉｎであるため、ＣＰＵシミュレータ３１０のアクセスが読み出しである場合には、連携部３３０は、管理情報の対応するアドレスに設定されている値をＣＰＵシミュレータ３１０に返送する（図示せず）。なお、ＣＰＵシミュレータ３１０のアクセスが書き込みある場合、連携部３３０は何もしない。
【００２７】
続いて、ＣＰＵシミュレータ３１０の命令実行部３１１は、Ｓ１４において、アドレス０ｘ２０３０へのメモリアクセスを実行する。アドレス０ｘ２０３０は、通知対象アドレス範囲に含まれているため、命令実行部３１１は、Ｓ１５において、このメモリアクセスを連携部３３０に通知する。アドレス０ｘ２０３０の通信方向はＯｕｔであるため、ＣＰＵシミュレータ３１０のアクセスが書き込みである場合、連携部３３０は、Ｓ１６において、管理情報のＣＰＵシミュレータ３１０から通知されたアドレスに対応する値を通知された値で更新する。なお、ＣＰＵシミュレータ３１０のアクセスが読み出しである場合、連携部３３０は何もしない。なお、管理情報の更新により出力部３６１はログを出力する。以後、アドレス０ｘ４０２０、０ｘ４０２２、０ｘ５０２２への書き込みアクセスが発生したときの、管理情報、出力されるログ及び通知対象アドレス範囲情報をそれぞれ図８（ａ）、（ｂ）及び（ｃ）に示す。
【００２８】
続いて、ＣＰＵシミュレータ３１０の命令実行部３１１は、関数コール命令を読み出したことにより、Ｓ１７において、関数コールイベントの発生を連携部３３０に通知する。連携部３３０は、Ｓ１８において、通知された関数（第２の関数）のアドレス及びスタックポインタ値に基づき領域不定変数に割り当てられるアドレスを算出する。つまり、連携部３３０は、通知された関数のアドレスから、呼び出された関数が関数Ｅであると判定し、関数Ｅの領域不定変数がローカル変数ｅ１及びｅ２であることを認識する。さらに、連携部３３０は、ローカル変数ｅ１及びｅ２がそれぞれ２及び８バイトであり、通知されたスタックポインタ値が０ｘ４０００であることを認識する。よって、連携部３３０は、変数ｅ１のアドレスを０ｘ４００３〜０ｘ４００４と算出し、変数ｅ２のアドレスを０ｘ４００５〜０ｘ４００Ｃと算出する。
【００２９】
連携部３３０は、Ｓ１９において、まずＳ１８においてアドレスを計算した領域不定変数の情報を管理情報に加える。このとき、呼び出された関数のネスト値は０であり、その状態は有効とする。これに対して、既に管理情報に含まれている関数のネスト値を１だけ増加させ、これら関数は実行中ではなくなるため、これら関数に含まれる領域不定変数の状態を無効に変更する。なお、領域不定変数の種別により定まるスコープ範囲が、下位関数、つまり、呼び出された関数でも有効である場合には、状態を有効のままとする。図９（ａ）は、Ｓ１９の処理の終了時点における管理情報であり、図９（ｂ）は、Ｓ１９におけるログ情報である。
【００３０】
連携部３３０は、Ｓ２０において、状態が無効となった変数ｄ１及びｄ２のアドレスの削除と、Ｓ１９において追加された変数ｅ１及びｅ２のアドレスの追加をＣＰＵシミュレータ３１０に通知する。ＣＰＵシミュレータ３１０は、連携部３３０からの通知に基づき、Ｓ２１において、通知対象アドレス範囲情報を更新する。図９（ｃ）は、Ｓ２１の処理終了後の通知対象アドレス範囲情報である。
【００３１】
命令実行部３１１は、関数リターン命令を読み出したことにより、Ｓ２２において、関数リターンイベントの発生を連携部３３０に通知する。連携部３３０は、関数リターンイベントを受け取ると管理情報を更新する。具体的には、ネスト値が０である関数についての情報を管理情報から削除し、その他の総ての関数のネスト値を１だけ減少させる。また、１だけ減少させることによりネスト値が０となった関数の領域不定変数の状態を有効に変更する。図１０（ａ）は、Ｓ２３の処理の終了時点における管理情報であり、図１０（ｂ）は、Ｓ２３におけるログ情報である。また連携部３３０は、管理情報の更新に伴い、領域不定変数のアドレス割り当ての変更内容をＳ２４においてＣＰＵシミュレータ３１０に通知する。ＣＰＵシミュレータ３１０は、連携部３３０からの通知に基づき、Ｓ２５において、通知対象アドレス範囲情報を更新する。図１０（ｃ）は、Ｓ２１の処理終了後の通知対象アドレス範囲情報である。
【００３２】
以上の処理により、シミュレーション連携システムにおいて仮想アドレス空間の総てのアドレスへのアクセスを通知することなく、不定領域変数を取り扱うことが可能になる。また、ログ情報を出力することで、デバッグ効率を向上させることができる。
【００３３】
なお、上述した実施形態では、関数コールのたびに、呼び出された関数で宣言される領域不定変数を管理情報に登録している。これは、同一の関数の再起呼出でも同じである。ＣＰＵシミュレータ３１０は、同一の関数の再起呼出を行う場合、以前に呼出したときの情報を保持したまま、新たな呼出しに対する領域を新たに確保する。よって、連携部３３０においても、呼び出された関数が既に管理情報に含まれているか否かを判定せず、その都度新たに登録を行う。
【００３４】
図１１は、再起呼出が発生しているときの管理情報を示している。図１１は、関数Ｂが繰り返し呼び出されている状態を示しており、現在実行中の関数は、そのネスト値が０である関数Ｂである。この状態で、ＣＰＵシミュレータ３１０から関数リターンイベントを受信すると、ネスト値が０である関数Ｂの情報が削除される。また、その他の総ての関数のネスト値が１だけ減ぜられ、その結果、ネスト値が０となる関数Ｂが実行中の関数となり、その変数の状態が有効に変更される。
【００３５】
なお、上述した実施形態において出力部３６１は、表形式でログ情報を出力していたが、任意の形式で出力が可能である。図１２に、他の形態として、タイミングチャート形式でのログ情報を示す。また、上述した実施形態においては、時間情報と、有効又は無効を示す状態情報を含めているため、模擬処理終了後にログ情報を解析してグラフ化することができる。なお、模擬処理と並行してグラフ表示することも可能である。
【００３６】
なお、上述した実施形態において領域不定変数の通信方向については、ＣＰＵシミュレータ３１０からの出力として定義していた。しかしながら、図３（ａ）の領域不変変数と同様に、領域不定変数情報に通信方向及び外的要因シミュレータ３５０及び３５２における変数ＩＤを含めることで、外的要因シミュレータ３５０及び３５２が領域不定変数にアクセスすることが可能になる。さらに、ＣＰＵシミュレータ３１０が、領域不定変数を更新すると、その値の変更を外的要因シミュレータ３５０又は３５２に通知することが可能になる。図１６にその場合の領域不定変数情報を示す。なお、アドレス条件については第三実施形態にて説明する。
【００３７】
（第二実施形態）第一実施形態においては、予め作成した領域不定変数情報を連携部３３０が保持し、関数コールが発生すると、連携部３３０は領域不定変数情報に基づき呼び出された関数で宣言される領域不定変数が保存されるアドレスを算出していた。しかしながら、関数コールの度に領域不定変数のアドレスの算出を行うことは、処理負荷が高くなり得る。本実施形態は、連携部３３０での処理負荷が高くなることを防ぐものである。
【００３８】
図１３は、本実施形態によるソフトウェア検証装置の機能ブロック図である。図１３に示す様に、本実施形態のソフトウェア検証装置は、制御ソフトウェアを入力して、修正制御ソフトウェアをＣＰＵシミュレータ３１０に出力するソフトウェア前処理部７２０を第一実施形態の装置にさらに追加したものである。以下、第一実施形態との相違点を中心に説明する。
【００３９】
制御ソフトウェアには、関数コールの前後に行う領域不定変数の保存領域を確保するための命令が含まれている。ソフトウェア前処理部７２０は、制御ソフトウェアを読み込んで、領域不定変数の格納領域の確保命令を認識すると、確保命令の前後いずれかに連携部３３０への通知命令を追加して、修正制御ソフトウェアとして出力する。
【００４０】
ＣＰＵシミュレータ３１０は、メモリアクセス、関数コール及び関数リターンに加えて、修正制御ソフトウェアに追加された通知命令を読み出すと、そのときのスタックポインタ値と共に領域確保イベントを連携部３３０に通知する。このとき、当該通知命令の前後のいずれかにある確保命令の対象である領域不定変数のサイズ及び変数種別も併せて通知する。なお、領域確保前後のスタックポインタ値やコンパイラ仕様から、保存領域のサイズを算出することが可能であるため、領域確保のサイズを通知しない形態とすることもできる。
【００４１】
図１４は、本実施形態の検証処理のシーケンス図である。なお、定義情報に含まれる領域不変変数情報とコンパイラ仕様情報は、図３に示す通りであるものとする。シミュレーションの開始により、連携部３３０は、Ｓ３０において定義情報を読み込み、Ｓ３１において管理情報を更新する。このときの管理情報は、図６（ａ）と同じである。続いて、連携部３３０は、Ｓ３２において、管理情報に新たに追加された変数のうち、ＣＰＵシミュレータ３１０がアクセスする変数に対応するアドレスをＣＰＵシミュレータ３１０に通知する。つまり、本例では、変数ｇ１、ｇ２、ｇ４及びｇ５に対応するアドレスが通知される。アドレスの通知によりＣＰＵシミュレータ３１０は、Ｓ３３において、通知対象アドレス範囲情報を更新する。また、連携部３３０は、Ｓ３４において、ＣＰＵシミュレータ３１０に模擬処理の開始指示を行う。
【００４２】
Ｓ３５において命令実行部３１１がソフトウェア前処理部７２０により追加された通知命令を読み出すと、ＣＰＵシミュレータ３１０は、Ｓ３６において、領域確保イベントを連携部３３０に通知する。このとき、ＣＰＵシミュレータ３１０は、その時点のスタックポインタ値、当該通知命令の前後のいずれかにある確保命令の対象である領域不定変数の種別及びサイズも併せて通知する。連携部３３０は、領域確保イベントの通知を受けると、Ｓ３７において、管理情報に新規変数情報を追加する。図１５（ａ）は、Ｓ３７の処理の終了時点での管理情報である。なお、図１５においては、簡略化のためグローバル変数の記載を省略している。Ｓ３６の通知では、スタックポインタ値、変数の種別及びサイズしかわからないため、管理情報の関数名は“不明”とし、変数名も所定の規則により連携部３３０が付与する。図１５においては、その変数が通知された順序に合わせて、変数名には“１ｓｔ”を設定している。また、ＣＰＵシミュレータ３１０からの通知に基づき種別には“仮引数”を、サイズには“２”を設定している。さらに、通知されたスタックポインタ値及びコンパイラ仕様情報からアドレス値を算出して設定する。図１５（ａ）においては、アドレス０ｘ３ＦＦＡが設定されている。
【００４３】
ＣＰＵシミュレータ３１０は、関数コール命令を読み出すと、Ｓ３８において、関数コールイベントの発生を連携部３３０に通知する。このとき、関数のアドレス情報も併せて通知する。連携部３３０は、Ｓ３９において、関数コールイベントと共に通知された関数のアドレス情報を管理情報の関数名に登録する様に更新する。図１５（ｂ）にＳ３９の処理の終了時点における管理情報を示す。その後、連携部３３０は、Ｓ４０において、ＣＰＵシミュレータ３１０にアドレス通知を行う。図においては、Ｓ３７で追加したアドレスである０ｘ３ＦＦＡ〜０ｘ３ＦＦＢを通知し、これにより、ＣＰＵシミュレータ３１０は、Ｓ４１において通知対象アドレス範囲情報を更新する。なお、Ｓ４０のアドレス通知は、Ｓ３７の後、関数コールイベントの通知を待たずに行う形態であってもよい。
【００４４】
Ｓ４２において命令実行部３１１がソフトウェア前処理部７２０により追加された通知命令を読み出すと、ＣＰＵシミュレータ３１０は、Ｓ４３において、領域確保イベントを連携部３３０に通知する。連携部３３０は、領域確保イベントの通知を受けると、Ｓ４４において、管理情報に新規変数情報を追加する。図１５（ｃ）は、Ｓ４４の処理の終了時点での管理情報である。なお、関数は、直前に呼び出された関数を設定する。連携部３３０は、Ｓ４５において、管理情報に新たに登録された変数のアドレス通知を行い、ＣＰＵシミュレータ３１０は、Ｓ４６において、通知対象アドレス範囲情報を更新する。
【００４５】
命令実行部３１１が、再度、関数コール命令を読み出すと、Ｓ４７において、関数コールイベントの発生を連携部３３０に通知する。連携部３３０は、関数コールイベントの通知を受けると、Ｓ４８において、関数コール前の領域不定変数を無効にし、コール後の関数で定義される領域不定変数を有効として管理情報に追加する。その後、連携部３３０は、Ｓ４９において、無効とする変数のアドレスをＣＰＵシミュレータ３１０に通知し、ＣＰＵシミュレータ３１０は、Ｓ５０において、通知に基づき通知対象アドレス範囲情報を更新する。
【００４６】
以上、連携部に領域不定変数情報を保持させることなく、ＣＰＵシミュレータ３１０にアクセス通知対象アドレス範囲として指定可能となる。なお、修正制御ソフトウェアの生成は、模擬処理前に行う形態とすることも、模擬処理中に並行して行う形態とすることもできる。
【００４７】
（第三実施形態）本実施形態は、領域不定変数情報に、アドレス範囲についてのアドレス条件情報を追加し、アドレス条件情報が示す条件を満たす場合にのみ、管理情報に追加するものである。これにより、管理情報の更新回数を減らすことができ、ログ情報の出力も減らすことができる。図１６に本実施形態での領域不定変数情報を示す。
【００４８】
図１６において、変数ａ１には、“アドレス０ｘ２０００の値が１であり、かつ、アドレス０ｘ２０３０の値が２である”との条件が定義されており、この条件を満たす場合にのみ変数ａ１は管理情報に追加される。追加されたアドレスは、第一実施形態と同様に、通知対象アドレス範囲情報に追加させるために、ＣＰＵシミュレータ３１０に通知される。なお、変数ａ２の様に、複数の条件を設けることも可能である。変数ａ２には、３つの条件が設けられており、合致する条件に対応する通信方向で管理情報に追加されることになる。
【００４９】
管理情報判定部３４０は、関数コールイベント及びリターンイベントに加えて、各シミュレータによるメモリアクセス通知時にもアドレス条件を判定する。なお、メモリアクセス通知時には、管理情報が有効である変数と、実行中の関数で定義されている領域不定変数に対してのみ結線条件の判定を行う。なお、総てのメモリアクセスに対してアドレス条件の合致を判定することにより処理負荷が増大しすぎるのであれば、メモリアクセスイベントにおけるアドレス条件の判定を省略することができる。
【００５０】
尚、アドレス条件を変数ごとに定義したが、関数ごとに定義する構成とすることも可能である。これにより、アドレス条件の判定処理回数を変数ごとに条件を定義する場合と比較して削減できる。
【００５１】
（その他の実施形態）また、本発明は、以下の処理を実行することによっても実現される。即ち、上述した実施形態の機能を実現するソフトウェア（プログラム）を、ネットワーク又は各種記憶媒体を介してシステム或いは装置に供給し、そのシステム或いは装置のコンピュータ（またはＣＰＵやＭＰＵ等）がプログラムを読み出して実行する処理である。
【図１】
2013058177.tif 000003
【図２】
2013058177.tif 000004
【図３】
2013058177.tif 000005
【図４】
2013058177.tif 000006
【図５】
2013058177.tif 000007
【図６】
2013058177.tif 000008
【図７】
2013058177.tif 000009
【図８】
2013058177.tif 000010
【図９】
2013058177.tif 000011
【図１０】
2013058177.tif 000012
【図１１】
2013058177.tif 000013
【図１２】
2013058177.tif 000014
【図１３】
2013058177.tif 000015
【図１４】
2013058177.tif 000016
【図１５】
2013058177.tif 000017
【図１６】
2013058177.tif 000018