以下、図面を参照しながら、本開示の実施形態を説明する。
[1.構成]
図1に示すように、本実施形態のPC1は、ディスプレイ10,HDD20,制御部30,ROM40,RAM50,入力装置60等を備える。
ディスプレイ10は、制御部30等にて生成された画像を表示する。
入力装置60は、キーボード及びマウス等から構成され、ユーザから受け付けた操作に応じた信号を制御部30に出力する。
RAM50は、読み出し及び書き込みが可能な揮発性メモリであり、ROM40は、読み出し専用の不揮発性メモリであり、HDD20は、読み出し及び書き込み可能な不揮発性メモリである。ROM40及びHDD20には、制御部30が実行するプログラム等が予め記憶されている。
RAM50は、制御部30が実行するプログラムを一時的に保存するための記憶領域や、該プログラムに用いられるデータを一時的に保存するための記憶領域等として用いられる。
制御部30は、CPU等を有する。制御部30は、HDD20及びROM40に保存されているプログラムを実行する。具体的には、制御部30は、HDD20に保存されているOSや、OS上で動作するアプリケーション等をRAM50にロードし、これらを実行する。プログラムの実行中、制御部30は、必要に応じて入力装置60から信号の入力を受け付けたり、ディスプレイ10に画像を表示したり、RAM50及びHDD20へのデータの読み出しや書き込みを行ったりする。なお、制御部30は、複数のCPUを有していても良い。
また、PC1には、検証プログラムがインストールされている。検証プログラムは、モデル又はソースコードの検証を行うプログラムであり、OS上で動作するアプリケーションの1つである。検証プログラムは、HDD20に保存される。制御部30が検証プログラムを実行することで、PC1は、モデル又はソースコードの検証装置として動作する。つまり、HDD20及びRAM50が、検証プログラムを格納した非遷移的実体的記録媒体に該当する。また、制御部30がこの検証プログラムを実行することで、検証プログラムに対応する方法が実行される。
なお、検証プログラムの機能を、ハードウェアを用いて実現してもよい。つまり、検証プログラムに従い動作する制御部30により行われる処理を、多数の論理回路を含むデジタル回路又はアナログ回路、或いは、これらの組合せによって実現してもよい。
ここで、上述したモデルとは、モデル言語仕様に基づいて作成されるプログラムの一表現形態である。つまり、モデルは、ソースコードと同様、コンピュータの処理を記述したものである。しかし、モデルは、ソースコードに比べ処理の記述が簡易であり、人による可読性が高い。そして、モデルに基づき、該モデルと同一の処理を記述したソースコードが自動生成される。なお、モデルの一例として、Simulinkによって作成されるSimulinkモデルを挙げることができる。Simulinkモデルを、Matlab上で動作するReal Time Workshopに入力することにより、該モデルに対応するソースコードが生成される。なお、Simulink、Matlab、及び、Real Time Workshopは、登録商標である。
モデルは、ブロックと結線との組み合わせにより処理を記述したものである。ブロックは、特定の処理を示す機能単位である。一方、結線は、ブロック間のデータの入出力、及び、各ブロックが示す処理が行われる順序を示す。結線は、ブロックの間に配される。なお、結線はブロックに繋がっていても良い。また、結線は矢印として構成されており、矢印の向きによりデータが出力される向きが示される。つまり、ブロックは、結線を挟んで他のブロックと連なった状態で配される。そして、結線により、当該結線を挟むブロック同士のデータの入出力等が示される。
なお、検証装置は、車載装置等といった電子装置を制御する組み込みシステムに用いられるモデル及びソースコードの検証を行うことが考えられる。しかし、これに限定されることは無く、検証装置は、PC等の電子装置等、あらゆる用途のモデル及びソースコードの検証を行うことが考えられる。
[2.動作の概要について]
検証装置は、モデル又はソースコードの検証を行う。以後、例えばモデルやソースコード等のように、コンピュータによる処理を記述したものを、記述物と記載する。なお、検証装置は、モデル及びソースコード以外の記述物の検証を行っても良い。また、検証装置は、記述物のシミュレーションを実行する。すなわち、検証装置は、記述物により記述された全部又は一部の処理を実行し、出力値を得る。この時、該処理の入力値は、ユーザにより設定されても良いし、予め設定されていても良い。
検証装置は、組み込みシステムを含む様々な装置に用いられるモデル及びソースコードのシミュレーションを行う。モデルのシミュレーション(以後、モデルシミュレーションとも記載)を行う際、検証装置であるPC1の制御部30は、モデルにより記述された処理を把握し、該処理を行う。具体的には、制御部30は、モデルからソースコードを生成し、該ソースコードに従い処理を行う。モデルシミュレーションは、PC1に応じた態様で行われる。特に、制御部30等の高性能化、高機能化に伴い、モデルシミュレーションは高い精度で行われるケースが多い。
これに対し、ソースコードのシミュレーション(以後、コードシミュレーションとも記載)は、該ソースコードが用いられる装置に搭載されたコンピュータ等の動作を再現した状態で行われる。換言すれば、コードシミュレーションは、PC1に応じた態様ではなく、該ソースコードが用いられる装置に応じた態様で行われる。特に、組み込みシステムに用いられるコンピュータであるマイクロコントローラは、PC1のCPUと比べて性能等が劣るケースが多い。このため、コードシミュレーションは、モデルシミュレーションに比べ、低い精度で行われるケースが多い。
このため、本来同一であるべきモデルのシミュレーションの結果と、該モデルに基づき生成されたソースコードのシミュレーションの結果とは、相違する可能性がある。より詳しくは、これらのシミュレーションで得られる出力値は、相違する可能性がある。
さらに、同一のモデルから、同一機能を有する異なる装置に用いられる複数のソースコードが生成される場合が想定される。これらの装置は、例えば、搭載されるコンピュータや、コンピュータの周辺部位等の構成が相違している。このため、本来同一であるべきこれらのソースコードのシミュレーションの結果もまた、相違する可能性がある。
以後、記述物が用いられる装置や、該装置におけるコンピュータや、コンピュータの周辺部位等を、処理系とも記載する。モデルの処理系は、該モデルが示す処理のシミュレーションを行うPC等となる。また、モデルから生成されたソースコードの処理系は、該ソースコードが用いられる装置等となる。
また、モデルと、該モデルに基づき生成されたソースコードとは、同一の処理を示す記述物である。また、同一のモデルから生成された異なる装置に用いられる複数のソースコードも、同様である。これらの記述物には、各処理系のコンピュータにより行われる同一の処理が記述されている。以後、これらの記述物を、同一記述物と記載する。
そして、複数の同一記述物の各々における各記述は、対応関係を有している。各同一記述物における対応関係を有する記述は、同一の処理を示す。また、これらの同一記述物では、対応関係を有する各記述が示す処理は、同じ条件が充足された際に実行されるように記述されている。以後、複数の同一記述物におけるこのような対応関係を有する記述を、同一記述と記載する。
具体例を挙げると、Aブロックを含むモデルと、該モデルに基づき生成されたソースコードとにおいては、該ソースコードにおけるAブロックに相当する処理の記述は、Aブロックの同一記述に相当する。また、Aブロックを含むモデルに基づき生成された複数のソースコードにおいては、これらのソースコードにおけるAブロックに相当する処理の記述は、同一記述となる。
また、複数の同一記述物における同一記述が示す処理を行う各コンピュータは、通常、同一の動作を行う。しかし、例えば、これらの処理の入力値が特定の値である場合等に、これらの動作が相違する場合がある。換言すれば、これらの処理の出力値が一致しないか、又は、これらの処理の差分が許容範囲内でない場合がある。以後、同一の入力値により行われた複数の処理の出力値が一致する場合、又は、これらの出力値の差が許容範囲内である場合を、正常出力と記載し、そうでない場合を、異常出力と記載する。また、同一記述が示す処理を行う複数のコンピュータにおける相違する動作を(換言すれば、これらの処理で異常出力が生じることを)、異常相違動作と記載する。
そして、上述したように、同一記述物が用いられる各処理系は、相違点を有している。このため、これらの同一記述物における各同一記述は、該相違点に起因して、相違した部分を有する場合がある。そして、該相違した部分に起因して、これらの同一記述に従い処理を行う各処理系のコンピュータに異常相違動作が起こる場合がある。以後、このような異常相違動作を、処理系異常と記載する。また、処理系異常を起こす可能性のある記述を、問題記述と記載する。また、同一記述が示す処理にて処理系異常が起こる該処理の入力値を、異常入力値と記載する。また、処理系異常が起こったことを示す該処理の出力値を、異常出力値と記載する。
一方、処理系の相違に起因すること無く異常相違動作が生じる場合がある。具体例を挙げると、複数の同一記述のいずれかに誤りがあり、これらの同一記述が示す処理のアルゴリズムが異なる場合等には、異常相違動作が生じる可能性がある。以後、処理系異常ではない異常相違動作を、その他異常と記載する。また、その他異常を発生させる記述を、その他異常記述と記載する。
検証装置は、同一記述物の中から予め定められた問題記述を抽出する。また、該問題記述が示す処理に異常入力値を設定した状態で、該処理のシミュレーションが行われる。さらに、該シミュレーションの出力値に基づき、処理系異常が起こっているか否かが判定される。そして、抽出された問題記述のうち、実際に処理系異常を起こす問題記述が、処理系異常記述として特定される。
ここで、問題記述と同一の処理の記述を記述したものであって、該問題記述により生じる可能性のある処理系異常を抑制できる記述を、抑制記述と記載する。同一記述物から処理系異常記述が見つかった場合、検証装置は、該同一記述物における処理系異常記述、又は、他の同一記述物における処理系異常記述の同一記述を、該処理系異常記述に相当する問題記述に対応して予め定められた抑制記述に置き換える。
[3.処理系異常の具体例]
(1)DTCブロックの処理系異常
まず、変数のデータ型を変換する際に生じる処理系異常の具体例について説明する。図2に示すDTCブロック100は、Aブロック110から入力された固定小数点数の変数を浮動小数点数の変数に変換し、Bブロック111に出力する。なお、DTCブロック100は、モデルの作成を行うための開発ツールにより、ライブラリとして提供されても良い。
固定小数点数及び浮動小数点数とは、変数のデータ型の種類である。固定小数点数は、小数点が置かれる桁を固定した状態で小数の値を表す。固定小数点数の変数は、該変数に対応して予め勾配が定められており、該変数に保存されたデータが示す整数値と勾配との乗算により得られた小数の値が表される。一方、浮動小数点数は、指数表現により小数の値を表す。浮動小数点数は、固定長の仮数部及び指数部と、符号部とを有する。ここで、仮数部の値をx、指数部の値をyとする。また、予め定められた数(例えば10)をy乗した値を、Yとする。浮動小数点数の変数は、xとYとを乗算して得られた小数に、符号部が示す符号を付した値を表す。さらに、浮動小数点数は、複数の形式を有する。各形式は、データ長が異なっている。データ長の大きい形式ほど、仮数部及び指数部が長くなり、より高い精度で小数を表すことができる。具体的には、浮動小数点数の形式として、例えば、データ長が4バイトである単精度や、データ長が8バイトである倍精度等が設けられている。
図3に示すように、DTCブロック100は、ブロック101〜103を有する。ブロック101は、Aブロック110から入力された固定小数点数の変数(以後、入力変数と記載)に保存されているデータを、整数型の変数として一時的に保存する。なお、整数型とは、整数を表すデータ型である。また、ブロック102は、入力変数の勾配を特定し、勾配の値を、浮動小数点数の変数に一時的に保存する。そして、ブロック103は、ブロック101における整数型の変数が示す整数と勾配とを乗算する。これにより、入力変数を浮動小数点数に変換した出力変数が生成される。該出力変数は、Bブロック111に出力される。
ここで、ブロック102で勾配が保存される浮動小数点数の変数の形式についての記述は、処理系によって異なる場合がある。具体的には、モデルシミュレーションの為に生成されたソースコードでは、該形式は倍精度となるケースが多い。これに対し、マイクロコントローラを備える組み込みシステム等である処理系に用いられるソースコードでは、該形式は単精度となるケースが多い。
そして、異なる形式の浮動小数点数の変数を用いて表した場合に、これらの変数が表す値が完全に一致しない小数(以後、特異数)が存在する。一例として、16.384という小数を倍精度の変数に保存した場合、該変数は16.384を示す。しかし、16.384を単精度の変数に保存した場合、該変数は16.3840008を示す。勾配が16.384等の特異数である場合、ブロック102で浮動小数点数の変数に保存された勾配の値が、処理系によって異なる可能性がある。その結果、処理系によって、DTCブロック100の出力変数の値が相違する。
つまり、DTCブロック100、及び、DTCブロック100に基づき生成されたソースコードは、問題記述に相当する。このため、これらの記述は、問題記述として検証装置により抽出される可能性がある。また、該問題記述が示す処理は、固定小数点数である入力変数の勾配を入力値の1つとしているが、勾配が特異数である場合には、該処理にて処理系異常が生じる可能性がある。つまり、特異数である勾配が異常入力値となる。
このため、特異数である勾配を異常入力値として設定した状態で、一方の同一記述物における上記問題記述が示す処理と、他方の同一記述物における該問題記述の同一記述を示す処理のシミュレーションが行われる。これらのシミュレーションで得られた出力値が一致しない場合には、該問題記述により処理系異常が生じていることになる。このため、該問題記述は、処理系異常記述とみなされる。
なお、上記問題記述に対応して、該問題記述が示す処理のシミュレーションで処理系異常が起こったとみなすことができる出力値を、異常出力値として予め定めておいても良い。具体例を挙げると、ブロック102において、勾配が保存される浮動小数点数の変数の形式を単精度とする仕様の場合、該浮動小数点数の変数の形式が倍精度等である場合に得られる出力値を、異常出力値として定めても良い。そして、該シミュレーションにより得られた出力値が異常出力値である場合には、処理系異常が生じているとみなしても良い。
図4のDTC抑制モデル120は、DTCブロック100の抑制記述である。なお、DTC抑制モデル120に基づき生成されたソースコードは、DTCブロック100に基づき生成されたソースコードの抑制記述となる。DTC抑制モデル120は、Cブロック121と、Dブロック122と、乗算ブロック123とを有する。Cブロック121は、入力変数に保存されているデータを、整数型の変数として乗算ブロック123に出力する。Dブロック122は、入力変数の勾配を、浮動小数点数の変数として乗算ブロック123に出力する。また、乗算ブロック123は、入力された2つの変数の乗算を行い、得られた値をBブロック111に出力する。乗算ブロック123は、入力される変数のデータ型を指定する機能を有する。このため、乗算ブロック123に入力される勾配が保存される浮動小数点数の変数の形式は、固定される。したがって、上述した処理系異常を抑制できる。
DTCブロック100が処理系異常記述とみなされた場合、DTCブロック100はDTC抑制モデル120に置き換えられる。また、DTCブロック100に基づき生成されたソースコードが処理系異常記述とみなされた場合、該ソースコードは、DTC抑制モデル120に基づき生成されたソースコードに置き換えられる。
(2)浮動小数点数の変数の演算時における処理系異常
複数の浮動小数点数の変数の乗算及び除算の少なくとも一方を含む演算を行う場合にも、処理系異常が起こる可能性がある。このような演算の具体例として、図5に示す乗除算モデル130により示される乗除算が考えられる。A〜Cブロック131〜133は、それぞれ、乗除算ブロック134に対し、単精度の浮動小数点数の変数であるa,b,cを出力する。そして、乗除算ブロック134は、a×b/cという乗除算を行い、得られた値をDブロック135に出力する。
しかし、処理系によっては、乗除算モデル130から生成されたソースコードは、b及びcの双方又は一方の値が、倍精度の浮動小数点数の変数に保存される記述となる場合がある。換言すれば、該ソースコードは、b及びcの双方又は一方の形式が、倍精度に変換される記述となる場合がある。つまり、該ソースコードに記述された乗除算におけるb及びcの形式のパターンとして、以下の(A)〜(D)の4つが想定される。なお、singleとは単精度を、doubleとは倍精度を意味する。
(A)a×(single)b/(single)c
(B)a×(double)b/(single)c
(C)a×(single)b/(double)c
(D)a×(double)b/(double)c
そして、b,cの値が上述した特異数である場合には、(A)〜(D)の各パターンでの乗除算の出力値が相違する。一例として、aが32767であり、b,cが特異数である8.192である場合、(A)〜(D)の各パターンでの乗除算で得られる値は、以下のようになる。
(A)32767
(B)32766.996
(C)32767.002
(D)32766.998
つまり、乗除算ブロック134、又は、乗除算ブロック134に基づき生成されたソースコードに従った処理では、処理系異常が生じる可能性がある。このため、これらの記述は問題記述に相当する。
なお、浮動小数点数の変数の加算及び減算のうちの少なくとも一方を含む演算を行う記述においても、同様にして処理系異常が起こる可能性がある。このため、該記述も問題記述となる可能性がある。
そして、乗除算ブロック134、又は、乗除算ブロック134に基づき生成されたソースコードが問題記述として抽出されたとする。この場合、b,cに特異数である異常入力値が設定された状態で、該問題記述が示す処理のシミュレーションが行われる。
なお、該シミュレーションにおいて、a,b,cの値を32767,8.192,8.192とする入力値を、異常入力値とすることも考えられる。この場合、b,cは単精度の浮動小数点数であるため、上述した(B)〜(D)のうちのいずれかの出力値が得られた場合には、処理系異常が起こっていると考えられる。このため、このような場合には、該問題記述を処理系異常記述とみなすことができる。
また、検証装置は、複数の同一記述物における上記問題記述が示す処理のシミュレーションにより得られた各出力値が、一致するか否かを判定しても良い。そして、これらの出力値が一致しない場合には、これらの問題記述を処理系異常記述とみなしても良い。
そして、図6の乗除算モデル130は、図5の乗除算モデル130における乗除算ブロック134を、抑制記述に置き換えたものに相当する。図6における乗算ブロック140及び除算ブロック141は、図5における乗除算ブロック134の抑制記述である。なお、乗算ブロック140及び除算ブロック141に基づくソースコードは、乗除算ブロック134に基づくソースコードの抑制記述となる。乗算ブロック140は、A,Bブロック131,132の各々から入力されたa,bの乗算を行う。そして、得られた値は、除算ブロック141に出力される。また、除算ブロック141は、乗算ブロック140から入力された値を、Cブロック133から入力されたcにより除算する。そして、得られた値は、Dブロック135に出力される。
乗算ブロック140及び除算ブロック141は、入力される変数のデータ型を指定する機能を有する。このため、a×b/cという乗除算に用いられる変数のデータ型が固定される。したがって、処理系異常を回避できる。
乗除算ブロック134が処理系異常記述とみなされた場合、乗除算ブロック134は、乗算ブロック140及び除算ブロック141に置き換えられる。また、乗除算ブロック134に基づき生成されたソースコードが処理系異常記述とみなされた場合、該ソースコードは、乗算ブロック140及び除算ブロック141に基づき生成されたソースコードに置き換えられる。
(3)拡張命令による処理系異常
一部のコンピュータは、汎用的なコンピュータには設けられていない専用の命令を有する。なお、ここで言う命令とは、機械語により直接示されるCPUへの命令を意味する。以後、このような専用の命令を、拡張命令と記載する。特にマイクロコントローラは、拡張命令を有する場合がある。
そして、拡張命令の一例として、飽和加算命令が存在する。飽和加算命令によれば、ラップという現象を回避できる。ここで、ラップについて説明する。データ型が32ビットの符号付き整数型(以後、INT32型と記載)である変数mに加算を行うとする。なお、符号付き整数型とは、符号を示した状態で整数を表すデータ型である。mの値がINT32型の最大値である2147483647である場合に、汎用的な加算命令を用いてmに1を加算すると、mはオーバーフローする。この時、符号が反転し、mの値は−2147483648(以後、ラップ異常値と記載)となる。このように、オーバーフローの発生により符号の反転等が生じ、加算前の値と大きく乖離した演算結果が得られる現象を、ラップと記載する。なお、ラップは、変数のデータ長に関わらず、汎用的な命令により加算が行われた際に生じる可能性がある。
これに対し、飽和加算命令では、加算を行う変数のデータ型をよりデータ長の大きい同種のデータ型に変換した状態で、加算が行われる。具体的には、例えば、INT32型である変数mに加算を行う場合であれば、mを64ビットの符号付き整数型(以後、INT64型と記載)に変換した状態で加算が行われる。そして、加算結果は、変数mに保存される。そして、加算によりオーバーフローが生じた場合には、mにはINT32型の最大値が設定される。これにより、ラップが回避される。
ここで、図7のソースコード160、及び、図8のソースコード170は、INT32型の2つの変数の加減算を行う処理を記述したものである。ソースコード160,170は、同一記述となる。
ソースコード160におけるコード161は、飽和加算命令によりINT32型の2つの変数の加算を行うことを示す。一方、ソースコード170におけるコード171は、汎用的な加算命令を用いて、INT32型の2つの変数の加算を行うことを示す。
これらのソースコードに従い動作するコンピュータは、通常は同一の出力値を生成する。しかし、コード161,171が示す処理によりオーバーフローが生じる場合には、これらの処理では異なる出力値が生成される。つまり、処理系異常が起こる。このため、コード161,171は、問題記述に相当する。
なお、上述したように、飽和加算命令は、マイクロコントローラに設けられる場合がある。このため、ソースコード160は、組み込みシステム等に用いるためにモデルから生成される場合がある。一方、ソースコード170は、モデルシミュレーションのためにモデルから生成されたものであっても良い。無論、ソースコード170もまた、組み込みシステム等に用いるためにモデルから生成されたものであっても良い。
そして、コード161,171が問題記述として抽出されると、これらの問題記述が示す処理のシミュレーションが行われる。この時、これらの処理の入力変数には、異常入力値が設定される。
これらの異常入力値は、これらの問題記述が示す処理での加算によりオーバーフローが生じる値である。一例として、上述したINT32の最大値と1とを、異常入力値とすることが考えられる。この場合、飽和加算命令が用いられていれば、該シミュレーションの出力値は、INT32の最大値となる。一方、飽和加算命令が用いられていなければ、該シミュレーションの出力値は、上述したラップ異常値となる。
このため、各々の上記問題記述に基づくシミュレーションで得られた出力値が異なる場合には、該問題記述を処理系異常記述とみなしても良い。また、INT32の最大値とラップ異常値とのうちの一方を、異常出力値としても良い。そして、これらのシミュレーションの出力値が異常出力値である場合には、該問題記述を処理系異常記述とみなしても良い。
そして、図9のソースコード170は、図8のソースコードのコード171を、コード180〜182に置き換えたものである。図9のコード180〜182は、コード161,171の抑制記述である。
コード180,182は、サブルーチンである“ADD_FUN_REP”を示し、コード181は、“ADD_FUN_REP”をコールする処理を示す。“ADD_FUN_REP”は、ソースコード160におけるコード161が示すサブルーチンである“ADD_FUN”と同じの処理を記述したものである。つまり、該サブルーチンは、INT32型である2つの入力変数a,bを、入力引数とする。これらの入力変数a,bは、データ型が64ビットの符号付き整数型に変換された状態で加算される。そして、加算により得られた値はcに保存され、INT32型の変数として出力される。この時、cの値がINT32型の最大値以上である場合には、INT32型の最大値が加算結果として出力される。つまり、オーバーフロー発生時には、出力値がINT32型の最大値となり、ラップは発生しない。このため、コード161とコード180〜182とは、オーバーフローが生じる場合においても、コンピュータに同じ動作を行わせる。したがって、処理系異常を回避できる。
なお、コード180〜182は、“ADD_FUN_REP”をコールする記述となっている。しかし、サブルーチンをコールせずに“ADD_FUN_REP”が示す処理を記述したものを、抑制記述としても良い。そして、ソースコード170のコード171を、該抑制記述に置き換えても良い。
そして、コード161,171が処理系異常記述とみなされた場合、コード171がコード180〜182に置き換えられる。これにより、処理系異常が生じるのを抑制できる。
なお、ソースコード170,180を生成するブロックを、問題記述とみなすこともできる。このような場合には、検証装置は、同様にして、該ブロックをモデルからサーチし、シミュレーションを行うことで、該ブロックで処理系異常が起こるか否かを判定しても良い。そして、処理系異常が起こる場合には、同様にして、該モデルから生成されるソースコードの記述を、抑制記述に置き換えても良い。
[4.動作の詳細について]
(1)第1の検証処理について
次に、図10により、モデル又はソースコードを検証対象とし、検証対象から処理系異常記述を検出する第1の検証処理について説明する。なお、本処理は、ユーザからの指示に応じて開始される。また、本処理は、検証装置の制御部30により実行される。また、第1の検証処理が示す方法は、モデル又はソースコードの検証方法の一例に相当する。
S200では、検証装置は、検証対象から予め定められた問題記述をサーチする。該サーチは、検証対象に対応して設けられた検証用データを用いて行われる。
検証用データから、検証対象における問題記述を特定可能となっている。具体例を挙げると、検証用データは、問題記述となるソースコードの文字列や、モデルのブロックや、ブロックと結線との組み合わせ等を示しても良い。なお、検証用データが示す問題記述と同一の記述のみならず、該問題記述に類似する記述も、問題記述とみなしても良い。また、検証用データは、例えば、問題記述が示す処理(換言すれば、アルゴリズム)等を示しても良い。このような場合には、該処理と、検証対象の記述が示す処理と比較することで、問題記述がサーチされる。また、検証用データは、問題記述についての異常入力値、異常出力値、及び、抑制記述を示す。なお、検証用データは、ユーザにより作成されたものであっても良い。また、検証装置は、問題記述、異常入力値、異常出力値、及び、抑制記述の入力をユーザから随時受け付け、ユーザからの入力に基づき、問題記述のサーチ等を行っても良い。
そして、検証装置は、検証対象の中から問題記述をサーチする。なお、検証対象がソースコードである場合には、一例として、ソースコードの先頭から最後尾に向かってサーチを行っても良い。また、検証対象がモデルである場合には、一例として、該モデルの入力側から出力側に向かってサーチを行っても良い。
サーチにより問題記述が抽出されると(S205:Yes)、検証装置は、その時点でサーチを一旦終了し、S210に移行する。なお、この時、検証装置は、問題記述の記録処理を行っても良い。具体的には、記録処理では、例えば、検証対象における対象となる記述に目印(例えば、コメント等)を付しても良いし、該記述の位置を記録しても良い。一方、新たな問題記述を抽出すること無く検証対象のサーチが終了すると(S205:No)、検証装置は、S230に移行する。
S210では、検証装置は、抽出された問題記述が示す処理のシミュレーションを行う。この時、検証用データが示す該問題記述の異常入力値が、該処理の入力値として設定される。そして、シミュレーションにより得られた該処理の出力値が、検証用データが示す該問題記述の異常出力値と一致する場合には、該問題記述により処理系異常が起こるとみなされる。つまり、該問題記述は、処理系異常記述とみなされる。検証装置は、処理系異常が起こる場合には(S215:Yes)、S220に移行し、処理系異常が起こらない場合には(S215:No)、S200に移行する。
S220では、検証装置は、検証用データに基づき、検証対象の処理系異常記述を、該処理系異常記述に相当する問題記述についての抑制記述に置き換え、S225に移行する。
S225では、検証装置は、検証対象における抑制記述について上述した記録処理を行い、S200に移行する。
なお、S215、又は、S225から移行したS200では、検証装置は、検証対象における問題記述のサーチが行われていない部分についてのサーチを再開する。そして、検証装置は、同様にしてS205以降の処理を行う。
一方、サーチ終了後に移行するS230では、検証装置は、処理系異常の発生箇所をユーザに通知する。より詳しくは、検証装置は、検証対象における抑制記述を、検証対象における抑制記述以外の他の記述とは異なる態様で表示しても良い。具体例を挙げると、検証対象において抑制記述に目印が付されている場合には、検証装置は、検証対象を表示し、目印と共に抑制記述を表示しても良い。この時、検証装置は、抑制記述を強調表示しても良い。なお、強調表示とは、例えば、対象となる記述を他の記述とは異なる色で表示したり、対象となる記述の背景に固有の色を付したりすることを意味する。また、抑制記述に目印が付されていない場合においても、検証装置は、例えば、抑制記述を強調表示した状態で検証対象を表示しても良い。また、検証装置は、例えば、抑制記述、又は、抑制記述及びその周辺の記述を、検証対象から抽出して表示したり、テキストデータ等として保存したりしても良い。そして、検証装置は、本処理を終了する。
なお、検証装置は、第1の検証処理において、検出した処理系異常記述を抑制記述に置き換える処理を省略すると共に、該処理系異常記述についての記録処理を行っても良い。そして、検証装置は、S230において、処理系異常記述を他の記述とは異なる態様で表示することで、処理系異常の発生箇所をユーザに通知しても良い。具体例を挙げると、検証装置は、検証対象を表示し、目印と共に処理系異常記述を表示しても良い。また、例えば、検証装置は、処理系異常記述を強調表示した状態で検証対象を表示しても良い。また、例えば、検証装置は、処理系異常記述、又は、該処理系異常記述及びその周辺の記述を、検証対象から抽出して表示したり、テキストデータ等として保存したりしても良い。
また、検証装置は、S230において、第1の検証処理にて抽出された問題記述をユーザに通知しても良い。換言すれば、処理系異常記述の発生箇所を通知する場合と同様にして、検証対象における該問題記述を、該問題記述以外の他の記述とは異なる態様で表示しても良い。
(2)第2の検証処理について
次に、図11により、2つの検証対象から処理系異常記述を検出する第2の検証処理について説明する。2つの検証対象とは、同一記述物であるモデル及びソースコードであっても良いし、同一記述物である2つのソースコードであっても良い。なお、本処理は、ユーザからの指示に応じて開始される。また、本処理は、検証装置の制御部30により実行される。また、第2の検証処理が示す方法は、モデル又はソースコードの検証方法の一例に相当する。
S300では、検証装置は、Back To Backテスト(以後、BTBテストと記載)を実施し、S305に移行する。BTBテストでは、各検証対象が示す処理全体のシミュレーションが、1回又は複数回にわたって行われる。各回のシミュレーションでは、各検証対象が示す処理に同じ入力値が設定される。そして、入力値が同じであるシミュレーションにより各処理から得られた出力値が比較される。なお、第2の検証処理では、後述するS335にて、1回又は複数回にわたって検証対象に対し抑制記述の置き換えが行われる。S300でのBTBテストは、該置き換えがなされた最新の検証対象に対して行われる。
S305では、検証装置は、後述するS335にて検証対象に対する抑制記述の置き換えが行われていない場合には(S305:Yes)、S310に移行する。
ここで、最後に行われたS335にて抑制記述の置き換えが行われた検証対象を、最新置換検証対象と記載する。また、最新置換検証対象にて最後に置き換えられた抑制記述を、最新抑制記述と記載する。
S335にて検証対象に対する置き換えがなされた場合、検証装置は、BTBテストの結果から、最新置換検証対象における最新抑制記述が示す処理の出力値と、他方の検証対象における最新抑制記述の同一記述が示す処理の出力値とを特定する。そして、検証装置は、入力値が同一である場合に得られたこれらの処理の出力値が、常に、上述した正常出力となるか否かを判定する。
そして、検証装置は、これらの出力値が常に正常出力の場合(S305:Yes)、S310に移行する。一方、否定判定の場合(S305:No)、最新置換検証対象において処理系異常記述を抑制記述に置き換えたにも関わらず、最新置換検証対象に基づく処理で異常相違動作が起こることになる。このため、検証装置は、該処理でその他異常が起こるとみなし、S345に移行する。
S310では、検証装置は、BTBテストの結果が正常であるか否かを判定する。具体的には、入力値が同一である場合の各検証対象のシミュレーションで得られた出力値が、常に正常出力である場合には、BTBテストの結果は正常とみなされる。そして、検証装置は、肯定判定が得られた場合には(S310:Yes)、S355に移行し、否定判定が得られた場合には(S310:No)、S315に移行する。
S315では、検証装置は、第1の検証処理のS200と同様にして、対応する検証用データを用いて各検証対象から問題記述をサーチする。ここで、検証装置は、サーチにより抽出された記述を直ちに問題記述としても良いが、次のようにして問題記述を抽出しても良い。
すなわち、サーチにより一方の検証対象から抽出された問題記述を、問題記述の可能性のある記述(以後、問題記述候補と記載)とみなしても良い。また、検証装置は、他方の検証対象から問題記述候補の同一記述を抽出し、問題記述候補が示す処理と、該同一記述が示す処理とが一致するかどうかを判定しても良い。そして、これらの処理が一致しない場合には、問題記述候補、及び、該問題記述候補の同一記述を、問題記述とみなしても良い。
なお、2つの検証対象が共にソースコードである場合、ソースコードの記述を比較することで上記判定を行っても良い。また、一方の検証対象がモデルである場合、検証装置は、モデルにおける問題記述候補、又は、該問題記述候補の同一記述から、該記述が示す処理のモデルシミュレーションに用いられるソースコードを生成しても良い。そして、同様にしてソースコードの記述を比較することで、上記判定を行っても良い。
一方の検証対象から問題記述が抽出されると(S320:Yes)、検証装置は、その時点でサーチを一旦終了し、S325に移行する。この時、検証装置は、問題記述についての記録処理を行っても良い。一方、新たな問題記述を抽出すること無く双方の検証対象のサーチが終了した場合には、処理系異常ではなく、その他異常が生じていると考えられる。このような場合(S320:No)、検証装置は、S350に移行する。
S325では、検証装置は、一方の検証対象から抽出された問題記述が示す処理のシミュレーションを行う。そして、S210と同様にして、該問題記述により処理系異常が生じるか否かを判定する。なお、検証装置は、異常入力値を入力値とした状態で、問題記述が示す処理、及び、他方の検証対象における該問題記述の同一記述が示す処理のシミュレーションを行っても良い。そして、得られた2つの出力値が一致しない場合には、これらの処理で処理系異常が起こるとみなしても良い。検証装置は、処理系異常が生じている場合には(S330:Yes)、S335に移行し、そうでない場合には(S330:No)、S315に移行する。
S330から移行したS315では、検証装置は、各検証対象における問題記述のサーチが行われていない部分に対するサーチを再開する。そして、検証装置は、同様にしてS320以降の処理を行う。
S335では、検証装置は、第1の検証処理のS220と同様にして、検証対象における処理系異常記述を抑制記述に置き換える。続くS340では、検証装置は、S225と同様にして、検証対象における抑制記述についての記録処理を行い、S300に移行する。
次に、S345の処理について説明する。S345は、最新置換検証対象の処理系異常記述を抑制記述に置き換えられたにも関わらず、該抑制記述が示す処理で異常相違動作が起こる場合に移行する。抑制記述がその他異常記述に該当する可能性は低いと考えられる。このため、該抑制記述が示す処理の入力値を生成する処理で、その他異常が生じているとみなされる。したがって、最新置換検証対象における該入力値を生成する処理の記述、又は、他方の検証対象における該記述の同一記述が、その他異常記述とみなされる。
ここで、一方の検証対象における抑制記述と、他方の検証対象における該抑制記述の同一記述を、置換箇所とする。また、最後に行われた置き換えにより生じた置換箇所を、最新置換箇所と記載する。一方、該置き換えよりも前に行われた置き換えにより生じた置換箇所を、先行置換箇所と記載する。
まず、抑制処理の置き換えが1回のみ行われた場合について検討する。このような場合、各検証対象における、置換箇所が示す処理への入力値を生成する処理の記述(以後、入力側記述と記載)が、その他異常記述とみなされる。次に、複数回にわたって抑制処理の置き換えが行われた場合について検討する。このような場合、各検証対象における、最新置換箇所が示す処理に対する入力側記述から、先行置換箇所が示す処理の出力値を生成する処理の記述を除いたもの(以後、中間記述と記載)が、その他異常記述とみなされる。そして、検証装置は、その他異常記述の記録処理を行い、S355に移行する。
同様に、S350においても、検証装置は、各検証対象におけるその他異常記述の記録処理を行う。具体的には、検証対象に対する抑制記述の置き換えが一度も行われていない場合、各検証対象全体がその他異常記述とみなされる。一方、検証対象に対する抑制記述の置き換えが行われた場合、各検証対象における、最新置換箇所が示す処理からの出力値を入力値として行われる処理で、その他異常が生じていると考えられる。このため、各検証対象における該処理の記述(以後、出力側記述と記載)が、その他異常記述とみなされる。そして、検証装置は、S355に移行する。
S355では、検証装置は、第1の検証処理におけるS230と同様にして、処理系異常の発生箇所をユーザに通知する。なお、S230と同様にして、抽出された問題記述をユーザに通知しても良い。また、検証装置は、処理系異常の発生箇所を通知するのと同様の方法で、その他異常記述をユーザに通知する。具体的には、検証装置は、例えば、その他異常記述を強調表示した状態で検証対象を表示しても良い。また、検証装置は、例えば、その他異常記述、又は、その他異常記述及びその周辺の記述を、検証対象から抽出して表示したり、テキストデータ等として保存したりしても良い。そして、検証装置は、本処理を終了する。
(3)第2の検証処理の具体例について
ここで、第2の検証処理の内容について、具体例を挙げて説明する。
図12の検査対象モデル400は、A〜Hブロック401〜403,405〜407,409,410と、乗除算ブロック404と、DTCブロック408とを有する。なお、乗除算ブロック404は、図5の乗除算ブロック134と同様のブロックであり、問題記述に相当する。また、DTCブロック408は、図2のDTCブロック100と同様のブロックであり、問題記述に相当する。
検査対象モデル400と、検査対象モデル400から生成されたソースコートとを検証対象とし、第2の検証処理が行われるとする。また、これらの検証対象では、乗除算ブロック404が示す処理、及び、これから生成されたソースコードが示す処理と、DTCブロック408が示す処理、及び、これから生成されたソースコードが示す処理とにおいて、処理系異常が生じているとする。
検査対象モデル400では、A〜Cブロック401〜403にて当該検査対象モデル400への入力値が入力され、Hブロック410にて、当該検査対象モデル400の出力値が出力される。つまり、A〜Cブロック401〜403が入力側、Hブロック410が出力側となる。このため、第2の検証処理では、A〜Cブロック401〜403からHブロック410に向かって問題記述がサーチされる。
したがって、第2の検証処理が行われると、最初に、乗除算ブロック404が問題記述として抽出される。乗除算ブロック404は処理系異常記述に該当するため、図13に示すように、乗除算ブロック404は、抑制記述である乗除算抑制ブロック420に置き換えられる。なお、乗除算抑制ブロック420は、図6の乗算ブロック140及び除算ブロック141と同様のモデルである。
その後、乗除算ブロック404の置き換えがなされた検査対象モデル400に対し、再度BTBテストが実施される。該BTBテストにより、乗除算抑制ブロック420の出力値が正常出力とならないことが判明した場合には、S345にて、乗除算抑制ブロック420についての上述した入力側記述であるA〜Cブロック401〜403が、その他異常記述とみなされる。そして、S355にて、処理系誤差の発生箇所として乗除算抑制ブロック420が強調表示されると共に、その他異常の発生箇所としてA〜Cブロック401〜403が強調表示される。その後、第2の検証処理が終了する。
一方、乗除算抑制ブロック420の出力値が正常出力となったとしても、検査対象モデル400にはDTCブロック408が含まれているため、BTBテストの結果は正常にはならない。このため、乗除算抑制ブロック420が置換された検査対象モデル400から、再度、問題記述がサーチされる。この時、Dブロック405から出力側に向かってサーチがされる。
そして、DTCブロック408が問題記述として抽出される。DTCブロック408は処理系異常記述に該当するため、図14に示すように、DTCブロック408は、抑制記述であるDTC抑制ブロック430に置き換えられる。なお、DTC抑制ブロック430は、図4のDTC抑制モデル120と同様のモデルである。
その後、再度BTBテストが実施される。該BTBテストにより、DTC抑制ブロック430が正常出力とならないことが判明した場合には、S345にて、DTC抑制ブロック430についての上述した中間記述であるD〜Fブロック405〜407が、その他異常記述とみなされる。そして、S355では、処理系誤差の発生箇所として、乗除算抑制ブロック420及びDTC抑制ブロック430が強調表示されると共に、その他異常の発生箇所として、D〜Fブロック405〜407が強調表示される。その後、第2の検証処理が終了する。
一方、DTC抑制ブロック430の出力値が正常出力であり、BTBテストの結果も正常であったとする。この場合、S355では、処理系誤差の発生箇所として、乗除算抑制ブロック420及びDTC抑制ブロック430が強調表示される。その後、第2の検証処理が終了する。なお、この時、検査対象モデル400には、その他誤差記述は含まれていないことになる。このため、その他異常の発生箇所の強調表示はなされない。
また、DTC抑制ブロック430の出力値は正常出力だが、BTBテストの結果は正常でなかったとする。この場合、DTC抑制ブロック430が置換された検査対象モデル400から、再度、問題記述がサーチされる。この時、Gブロック409から出力側に向かってサーチがなされる。
しかし、G,Hブロック409,410は問題記述に該当しないため、サーチを行っても問題記述は抽出されない。この場合、S350にて、DTC抑制ブロック430についての上述した出力側記述であるG,Hブロック409,410が、その他異常記述とみなされる。そして、S355では、処理系誤差の発生箇所として、乗除算抑制ブロック420及びDTC抑制ブロック430が強調表示されると共に、その他異常の発生箇所として、G,Hブロック409,410が強調表示される。その後、第2の検証処理が終了する。
[5.効果]
本実施形態によれば、以下の効果を奏する。
(1)本実施形態の第1及び第2の検証処理によれば、モデルやソースコード等の記述物である検証対象から問題記述が抽出された後、該問題記述が示す処理の出力値が算出される。そして、該出力値に基づき、該問題記述で実際に処理系異常が起こることが判明した場合には、該問題記述が処理系異常記述として検出される。このため、ユーザが検証対象の記述を解析しなくても、確実に、検証対象から処理系異常記述を検出することが可能となる。したがって、記述物の検証を行う際の作業負担を軽減できる。
(2)また、第1及び第2の検証処理では、検証対象から抽出された問題記述が、検証対象における他の記述とは異なる態様で表示される。このため、検証対象における問題記述を容易に把握できる。
(3)また、第2の検証処理においては、一方の検証対象から、問題記述である可能性のある問題記述候補が抽出される。また、問題記述候補が示す処理と、他方の検証対象における問題記述候補の同一記述が示す処理とが一致するかどうかが判定される。そして、これらの処理が一致しない場合には、問題記述候補、及び、該問題記述候補の同一記述が、問題記述とみなされる。このため、より高い精度で問題記述が抽出される。
(4)また、第1及び第2の検証処理によれば、検証対象における処理系異常記述が、抑制記述に置き換えられる。これにより、検証対象に基づく処理で、処理系異常が生じなくなる。このため、置き換え後の検証対象が示す処理のシミュレーションを行うことで、該処理でその他異常が発生するか否かや、その他異常が発生する箇所を容易に検出可能となる。したがって、より容易に、検証対象からその他異常記述を見つけ出すことが可能となる。
(5)また、第1及び第2の検証処理では、検証対象において置き換えられた抑制記述が、検証対象における他の記述とは異なる態様で表示される。このため、検証対象における抑制記述を容易に把握できる。
(6)また、第2の検証処理によれば、BTBテストと並行して処理系異常記述の検出がなされる。そして、処理系異常記述の検出結果と、BTBテストにより得られた各検証対象全体が示す処理の出力値とに基づき、検証対象からその他異常記述が検出される。このため、検証対象からその他異常記述を容易に見つけ出すことが可能となる。
(7)また、第2の検証処理では、検証対象におけるその他異常記述が、検証対象における他の記述とは異なる態様で表示される。このため、検証対象におけるその他異常記述を容易に把握できる。
[6.他の実施形態]
以上、本開示の実施形態について説明したが、本開示は上述の実施形態に限定されることなく、種々変形して実施することができる。
(1)本実施形態では、検証プログラムに従い動作するPC1である検証装置により、第1及び第2の検証処理が実行される。しかしながら、検証プログラムと同様の機能を有する複数のプログラムをPC1にて実行させることで、PC1を検証装置として動作させ、第1及び第2の検証処理を実行しても良い。
(2)また、第2の検証処理では、2つの検証対象の記述全体から、処理系異常記述及びその他異常記述が検出される。しかしながら、これらの検証対象の一部に相当する同一記述を対象記述としても良い。そして、2つの検証対象の記述全体に替えて、これらの検証対象における各対象記述から、同様にして処理系異常記述及びその他異常記述を検出しても良い。すなわち、本実施形態と同様にして、BTBテストにより2つの検証対象における各対象記述が示す処理のシミュレーションを行いながら、これらの対象記述から、処理系異常記述及びその他異常記述を検出しても良い。
(3)また、第2の検証処理において、検証装置は、検証対象に対する抑制記述の置き換えを行った後、さらに、各検証対象における置換箇所を含む記述である対象記述を設定しても良い。なお、各検証対象に設定された対象記述は、同一記述となる。そして、これらの対象記述が示す処理のシミュレーションを行い、これらの処理の出力が異常出力となる場合には、対象記述にその他異常記述が含まれるとみなしても良い。
(4)本実施形態における1つの構成要素が有する複数の機能を、複数の構成要素によって実現したり、1つの構成要素が有する1つの機能を、複数の構成要素によって実現したりしてもよい。また、複数の構成要素が有する複数の機能を、1つの構成要素によって実現したり、複数の構成要素によって実現される1つの機能を、1つの構成要素によって実現したりしてもよい。また、本実施形態の構成の一部を省略してもよい。また、本実施形態の構成の少なくとも一部を、他の本実施形態の構成に対して付加又は置換してもよい。なお、特許請求の範囲に記載した文言から特定される技術思想に含まれるあらゆる態様が本開示の実施形態である。
(5)上述した検証装置の他、当該検証装置を構成要素とするシステムや、当該検証装置としてPC1を動作させる検証プログラムを記録した半導体メモリ等の非遷移的実態的記録媒体等、種々の形態で本開示を実現することもできる。
[7.特許請求の範囲との対応]
本実施形態における第1の検証処理のS200が抽出部,抽出手順の一例に、S210が問題記述算出部,問題記述算出手順の一例に、S210,S215が検出部,検出手順の一例に、S220が置換部の一例に、S230が問題表示部,抑制表示部の一例に相当する。
また、第2の検証処理の検証対象が対象記述の一例に、S300が対象記述算出部に、S305〜S330,S345,S350が判定部に、S355が異常表示部に相当する。また、S315が抽出部,抽出手順の一例に、S325が問題記述算出部,問題記述算出手順の一例に、S325,S330が検出部,検出手順の一例に、S335が置換部の一例に、S355が問題表示部,抑制表示部の一例に相当する。