(57)【要約】【課題】検査対象の直接改変を不要にするとともに、探索する状態空間を絞り込んで状態の爆発を防止し、現実的な時間内での検査を可能にする。【解決手段】ルール型検査仕様記憶部は、実行系列における検査ブロックの開始位置及び終了位置を指示する記述である差し込み位置指示情報を有する検査仕様を記憶する。差し込み実行部は、前記差し込み位置指示情報に記述された内容に対応する位置に、検査ブロックの開始位置を指定する情報である検査ブロック開始位置情報、及び検査ブロックの終了位置を指定する情報である検査ブロック終了位置情報を挿入して差し込み後検査対象を生成する。検査実行部は前記検査ブロック開始位置情報及び前記検査ブロック終了位置情報によって囲まれた範囲である検査ブロック内を探索する状態空間として、モデル検査を実行する。【選択図】図１
2015011445.tif 000002
【特許請求の範囲】
【請求項１】
モデル検査の対象となるコードである検査対象を記憶する第１の記憶手段と、
実行系列における検査ブロックの開始位置及び終了位置を指示する記述である差し込み位置指示情報を有する検査仕様を記憶する第２の記憶手段と、
前記差し込み位置指示情報に記述された内容に対応する位置に、検査ブロックの開始位置を指定する情報である検査ブロック開始位置情報、及び検査ブロックの終了位置を指定する情報である検査ブロック終了位置情報を挿入して、差し込み後検査対象を生成する第１の実行手段と、
前記差し込み後検査対象を読み取り、前記検査ブロック開始位置情報及び前記検査ブロック終了位置情報によって囲まれた範囲である検査ブロック内を探索する状態空間として、モデル検査を実行する第２の実行手段と
を有するモデル検査装置。
【請求項２】
前記検査仕様は、前記検査ブロック内のコードに挿し込むコードを指定する記述である差し込み内容指定情報をさらに有する、請求項１に記載のモデル検査装置。
【請求項３】
前記差し込み内容指定情報は、その実行結果がエラーの場合は検査失敗とみなされるコードである表明文を含んでいる、請求項２に記載のモデル検査装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本明細書に記載の実施の形態は、モデル検査装置に関する。
【背景技術】
【０００２】
モデル検査は、デッドロック、ライブロック、リソース競合などの排他制御系の問題を検出できる強力な技術である。デッドロックとは、２つ以上のプロセスが資源開放を待ち、結果としてどの処理も先に進めなくなっている状態をいい、ライブロックとは、資源獲得の処理が進行しているにも関わらず、どのプロセスも資源が獲得できない状態をいう。モデル検査は、検査対象が取りうる状態（状態空間）を網羅的に探索して上記のような問題の有無を調べる技術である。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２００９−１３４３６０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
モデル検査は、現実には以下の要因から運用面のハードルが高いという問題がある。特に大規模なモデルを検査対象にした際にここで挙げる問題が顕著に表れる。
（１）検査対象の改変  
モデル検査を実行する場合、検査対象の一部を検査するためであっても、検査対象全体を改変する必要があったため、手間が掛かってしまう。すなわち、検査したい範囲が元々の状態空間のごく一部であるにも関わらず、検査のために多くの変更が必要となるのである。単純化のための変更が多岐に亘り、手間がかかる煩雑な作業になる
また、単純化された範囲と、その意図（検査対象本来の振る舞いなのか、モデル検査装置の探索範囲を絞りたいのか）が非常に分かりにくいという問題があった。さらに単純化により本来の実行系列が失われる虞があった。
（２）状態爆発  
実用的なソフトウェアやアプリケーションは取りうる状態が非常に多いため、探索する状態空間が大きすぎて、モデル検査装置にかけても現実的な時間内に検査が終わらないという問題があった。
【０００５】
本発明の一の実施の形態は、検査対象の直接改変を不要にするとともに、探索する状態空間を限定し、特定の範囲だけを網羅的に探索することで状態の爆発を防止し、現実的な時間内での検査を可能にする技術を提供することを目的とする。
【課題を解決するための手段】
【０００６】
本発明の一の実施の形態はモデル検査装置として提案される。モデル検査装置は、第１の記憶手段と、第２の記憶手段と、第１の実行手段と、第２の実行手段とを有する。
【０００７】
第１の記憶手段は、モデル検査の対象となるコードである検査対象を記憶する。第２の記憶手段は、実行系列における検査ブロックの開始位置及び終了位置を指示する記述である差し込み位置指示情報を有する検査仕様を記憶する。第１の実行手段は、前記差し込み位置指示情報に記述された内容に対応する位置に、検査ブロックの開始位置を指定する情報である検査ブロック開始位置情報、及び検査ブロックの終了位置を指定する情報である検査ブロック終了位置情報を挿入して、差し込み後検査対象を生成する。第２の実行手段は、前記差し込み後検査対象を読み取り、前記検査ブロック開始位置情報及び前記検査ブロック終了位置情報によって囲まれた範囲である検査ブロック内を探索する状態空間として、モデル検査を実行する。
【図面の簡単な説明】
【０００８】
【図１】第１の実施の形態に係るモデル検査装置の構成例を示す機能ブロック図
【図２】ルール型検査仕様のデータ構成例を示す図
【図３】差し替え内容指定部が表明を含む態様の、ルール型検査仕様のデータ構成例を示す図
【図４】検査対象の例を示す図
【図５】図４に示した検査対象から生成された差し込み後検査対象の例を示す図
【図６】図５で使用した記号の意味を示した図
【図７】図５に示した差し込み後検査対象において形成された検査ブロックを示す図
【図８】検査対象が作る状態空間が、各実行系列の検査ブロック内のコードが作る状態空間に限定される例を示す図
【図９】モデル検査装置１の主たる動作の一例を示したフローチャート
【図１０】差し込み後検査対象生成処理の一例を示したフローチャート
【図１１】モデル検査実行処理の一例を示したフローチャート
【図１２】第１の実施の形態の実施例の構成例を示した機能ブロック図
【図１３】実施例におけるルール型検査仕様の例を示す図
【図１４】実施例におけるバイトコードの例を示す図
【図１５】バイトコードをアスペクトコンパイラが変換して出力した検査対象バイトコードの例を示す図
【図１６】実施したテストの内容を示す図
【図１７】図１６に示したテストの結果を示す図
【発明を実施するための形態】
【０００９】
以下、図面を参照して本発明の実施の形態に係るモデル検査装置を説明する。  
［０．用語の定義］  
本明細書で使用する用語の定義を述べる。
【００１０】
［０．１．モデル検査］  
「モデル検査」とは、検査対象の取りうる状態を網羅的に探索して、デッドロック/ライブロックなどの並列処理特有の問題を検出する技術をいう。
【００１１】
［０．２．モデル検査装置（モデル検査器）］  
「モデル検査装置（モデル検査器）」とは、上記モデル検査技術を実装したツール、又はそのツールを実装した装置をいう。
【００１２】
［０．３．実行系列(Sequence)］  
「実行系列(Sequence)」とは、並列して動作することができる処理（コード）の流れをいう。モデル検査では複数の実行系列のあらゆる実行順が考慮される。
【００１３】
［０．４．原子化］  
「原子化」とは直列に実行される一連の処理のブロックをまとめて１つの処理とみなすこと.をいう。原子化された処理ブロックの実行中は他のプロセスが割り込むことはできないものとして扱われる。
【００１４】
［０．５．プロセス］  
「プロセス」とは、実行系列を実行する主体をいう。
【００１５】
［０．６．検査対象］  
「検査対象」とは、並列実行可能な複数の実行系列、それらを実行するプロセスの集合、及び複数のプロセスから参照される可能性のある変数の集合をいう。
【００１６】
［０．７．状態］  
「状態」とは、各プロセスの実行位置のスナップショットとその時の変数の値をいう。
【００１７】
［０．８．状態］  
「状態空間」とは、検査対象が取りうる全ての状態の集合をいう。状態空間の規模は、並列して実行されるプロセスの数と、実行系列の規模、変数の取りうる値の範囲、プロセス間の通信量に従って増大する。
【００１８】
［０．９．探索範囲］  
「探索範囲」とは、モデル検査装置が上記の状態空間の中で実際に探索して問題の有無を確認する範囲をいう。探索範囲は状態空間の部分空間である。一般的なモデル検査装置はPartial Order Reductionという技術を実装しており、問題を取りこぼさない範囲で探索範囲を狭める処理を行う。
【００１９】
［０．１０．状態爆発］  
「状態爆発」とは、モデル検査装置が探索する状態空間の規模が巨大すぎて現実的な時間内に検証が終わらない状態をいう。
【００２０】
［０．１１．ルール型検査仕様］  
「ルール型検査仕様」とは、検査対象とは独立して定義された、検査範囲と検査内容を指示するための記述（コード）をいう。「ルール型検査仕様」は、差し込み位置指定部と、差し替え内容部によって構成される。
【００２１】
［０．１２．差し込み位置指定部］  
「差し込み位置指定部」とは、実行系列の一部を代替処理に置き換える際の、置き換え箇所を指定するルールをいう。ルールベースで記述し、１つのルールで実行系列中の複数の該当箇所に作用させる。
【００２２】
［０．１３．差し替え内容］  
「差し替え内容」とは、差し込み位置で指定した実行系列中の部分領域を上書き（置換）する具体的な内容をいう。例えば、「差し替え内容」はDo nothing、簡略化した代替処理、或いは元の処理をそのまま呼び出すコードなどである。
【００２３】
［０．１４．表明文］  
「表明文」とは、アサーションコード（Assert.equals, Assert.true）をいう。「表明文」は差し替え内容の一部として書かれる。モデル検査装置が探索中にこの表明文に相当するコードを実行し、その実行結果がエラーの場合は検査失敗とみなされる。
【００２４】
［０．１５．差し込み装置］  
「差し込み装置」とは、ルール型検査仕様を検査対象に挿し込む装置をいう。「差し込み装置」は、ルール型検査仕様の差し込み位置指定部で指定された実行系列上の特定の箇所に差し替え内容を差し込む処理を行う。また、「差し込み装置」は、モデル検査装置をプロセススコープで制御するコード（例：ENTER_EXPLORE. EXIT_EXPLORE）で差し替え内容を囲い込む。
【００２５】
［０．１６．ENTER_EXPLORE］  
「ENTER_EXPLORE」は、モデル検査装置に探索開始を指示する制御コードである。
【００２６】
［０．１７．EXIT_EXPLORE］  
「EXIT_EXPLORE」とは、モデル検査装置に探索終了を指示する制御コードである。
【００２７】
［０．１８．探索モード］  
「探索モード」とは、モデル検査装置がもつ、検査対象が取りうる状態の網羅的な探索を行うかどうかの設定をいう。探索モードは、プロセススコープで管理する。探索モードがOFFであると、他のプロセスに制御が移る（状態が変わる）可能性があってもモデル検査装置は考慮しない。探索モードがONであると、他のプロセスに制御が移る可能性がある場合、あらゆる可能性をモデル検査装置は考慮する。
【００２８】
［０．１９．検査ブロック］  
「検査ブロック」とは、ENTER_EXPLOREとEXIT_EXPLOREで囲い込まれた実行系列中のコードの集まりをいう。本特許で使用するモデル検査装置の探索範囲を実行系列別に分解して見たものに相当する。
【００２９】
［０．２０．ソフトウェアモデル検査］  
「ソフトウェアモデル検査」とは、ソースコードをコンパイルして得た実行可能なバイトコードを対象にしたモデル検査技術をいう。
【００３０】
［０．２１．ソフトウェアモデル検査装置］  
「ソフトウェアモデル検査装置」とは、上記ソフトウェアモデル検査技術を実装したツール、若しくはそのようなツールを搭載した装置をいう。
【００３１】
［０．２１．JPF］  
「JPF」とは、Java Path Finderをいい、ソフトウェアモデル検査装置の１種である。「JPF」は、Javaバイトコードを対象に、検査対象の取りうる状態を網羅的に探索する。元々はJavaソースコードをpromelaコードに変換していたが、状態爆発で行き詰まったため、現在はバックトラック機能をもったJVMそのもののスタブとして実装されている。
【００３２】
［０．２２．Java, javac］  
「Java」とは、プログラミング言語の一種をいい, 「javac」はそのコンパイラをいう。
【００３３】
［０．２３．JVM］  
「JVM」とは、Java仮想マシンをいい, Javaプログラムを実行する環境である。
【００３４】
［０．２４．アスペクト指向プログラミング］  
「アスペクト指向プログラミング」とは、ソースコードを横断的な側面から捉えて共通処理を挿し込むプログラミング技術をいう。本発明では、ルール型検査仕様を記述するために利用する。
【００３５】
［０．２５．アスペクトコンパイラ］  
「アスペクトコンパイラ」とは、上記アスペクト指向プログラミング技術を実装するコンパイラをいう。本発明では差し込み装置として利用される。
【００３６】
［０．２６．AspectJ , ajc］  
「AspectJ」とはJava向けのアスペクトコンパイラの一種をいい、「ajc」とは、AspectJのコンパイラをいう。ajcでコンパイルしたプログラムはJVM上で実行できる。
【００３７】
［１．第１の実施の形態］  
本発明の第１の実施の形態について説明する。本発明の第１の実施の形態は、モデル検査装置として提案される。
モデル検査装置は、デッドロック、ライブロック、リソース競合などの排他制御系の問題を検出する技術であるモデル検査を実行する装置である。このモデル検査装置は、コンピュータ、ワークステーションなどの情報処理装置であって、この情報処理装置は、演算処理装置（ＣＰＵ）、主メモリ（ＲＡＭ）、読み出し専用メモリ（ROM）、入出力装置（Ｉ／Ｏ）、及び必要な場合にはハードディスク装置等の外部記憶装置を具備している装置である。
【００３８】
［１．１．第１の実施の形態に係るモデル検査装置の構成例］  
図１に第１の実施の形態に係るモデル検査装置の構成例を示す機能ブロック図を掲げる。なお、機能ブロック図中に示す構成要素は、モデル検査装置の機能を機能ごとにまとめてブロックとして捉えたものであり、モデル検査装置が各構成要素に対応する基板、装置、回路、部品などの物理的構成要素を備えていなければならないことを意味するわけではない。また、「接続されている」とは、データ、情報、命令などの送受信、受け取り、受け渡しなどが可能な状態になっていることをいい、互いに配線で連結されているような物理的な接続に限られる意味ではない。本明細書中の他の機能ブロック図の説明についても同様である。
【００３９】
図１に示すモデル検査装置１は、検査対象記憶部１０と、この検査対象記憶部１０に接続された差し込み実行部２０と、この差し込み実行部２０へ接続するルール型検査仕様記憶部３０と、差し込み実行部２０に接続された差し込み後検査対象記憶部４０と、この差し込み後検査対象記憶部４０に接続された検査実行部５０とを有している。以下にモデル検査装置１の各構成要素について説明する。検査対象記憶部１０は第１の記憶手段に相当し、差し込み実行部２０は第１の実行手段に相当し、ルール型検査仕様記憶部３０は第２の記憶手段に相当し、検査実行部５０は第２の実行手段に相当する。
【００４０】
［１．１．１．検査対象記憶部］  
検査対象記憶部１０は、モデル検査の対象であるコードを記憶する機能を有する。コードは後述する差し込み実行部２０によりルール型検査仕様に基づいた、上記コードの変更が可能なものであればどのようなものでも良い。本実施の形態では、検査対象記憶部１０は、コンパイラがソースコードを実行可能な形式に変換したコードであるバイトコードであるものとして説明する。
【００４１】
［１．１．２．ルール型検査仕様記憶部］  
ルール型検査仕様記憶部３０は、ルール型検査仕様を記憶する機能を有する。ルール型検査仕様は、差し込み実行部２０に実行系列における検査ブロックの開始位置及び終了位置を指示する記述である。図２に、ルール型検査仕様のデータ構成例を示す図を掲げる。ルール型検査仕様２００は、差し込み位置指定部２０１と差し替え内容指定部２０２とを有する。差し込み位置指定部２０１は、検査対象中の命令文、関数などの記述の中で、検査ブロックの開始位置及び終了位置とした記述を指定するコード（記述）である。差し替え内容指定部２０２は、差し込み位置指定部２０１によって特定された検査ブロック内のコードに挿し込むオリジナル・コード、置き換えコード（該当する部分を空処理に置き換えるコードを含む）を指定する記述である。
【００４２】
なお、差し替え内容指定部２０２は、「表明文」を含んでいても良い。「表明文」とは、システムの状態をチェックするコードで，モデル記述の中に埋め込まれるプログラマが調べたい性質を表明文として挿入すればよい。図３に、差し替え内容指定部２０２が表明文２０３を含む態様のルール型検査仕様２００のデータ構成例を示す。
【００４３】
［１．１．３．差し込み実行部］  
差し込み実行部２０は、ルール型検査仕様記憶部３０に記憶されたルール型検査仕様２００を参照して、ルール型検査仕様２００の差し込み位置指定部２０１の内容に一致する検査対象の位置（箇所）に、検査ブロックの開始位置を指定する情報である検査ブロック開始位置情報、及び検査ブロックの終了位置を指定する情報である検査ブロック終了位置情報を、検査対象に挿入し、この検査ブロックの開始位置及び終了位置によって囲まれた範囲である検査ブロック内に、ルール型検査仕様２００の差し替え内容指定部２０２で指定されている内容を挿入し、若しくは置換して、差し込み後検査対象を生成する機能を有する。
【００４４】
図４に検査対象の例を模式的に示す図を掲げる。この検査対象４００は実行系列１から実行系列NまでのN個の実行系列を有している。但し、図４では、実行系列３から実行系列N−1については図示を省略した。
【００４５】
実行系列１は、処理J＿A1から処理J＿A7までの7個の処理を含んでいる。処理J＿A1以前に行われる処理及びJ＿A5以降に行われる処理については図示を省略している。実行系列１において、処理J＿A1実行後に処理J＿A2に移行する。処理J＿A2実行後は分岐して処理J＿A３又は処理J＿A６に進む。処理J＿A３実行後は処理J＿A４、処理J＿A５の順に進む。一方、処理J＿A６実行後は処理J＿A７、処理J＿A５の順に進む。
【００４６】
実行系列２は、処理J＿B1から処理J＿B６までの６個の処理を含んでいる。処理J＿B1以前に行われる処理及びJ＿B5以降に行われる処理については図示を省略している。実行系列２において、処理J＿B1実行後、処理J＿B2、処理J＿B３、処理J＿B４の順に移行する。処理J＿B４実行後は分岐して処理J＿B５又は処理J＿B６に進む。処理J＿B６の実行後は処理J＿B２に戻る。
【００４７】
実行系列Nは、処理J＿N1から処理J＿N7までの7個の処理を含んでいる。処理J＿N1以前に行われる処理及びJ＿N5以降に行われる処理については図示を省略している。実行系列Nにおいて、処理J＿N1実行後、処理J＿N2、処理J＿N３の順に移行する。処理J＿N３実行後は分岐して処理J＿N４又は処理J＿N６に進む。処理J＿N４実行後は処理J＿N５に進む。一方、処理J＿N６実行後は処理J＿N７に進み、処理J＿N７実行後は分岐して処理J＿N2又は処理J＿N6に戻る。
【００４８】
次に、図４に示した検査対象４００に対して、差し込み実行部２０が生成した差し込み後検査対象５００の例を示す。図５は図４に示した検査対象４００から生成された差し込み後検査対象５００の例を示す図である。また、図６に、図５で使用している記号の意味を示す。
【００４９】
図６に示す差し込み後検査対象５００の実行系列１において、処理J_A1の後に検査ブロック開始位置情報である制御コード「ENTRY_EXPLORE」が挿し込まれているとともに、処理J_A５の前に検査ブロック終了位置情報である制御コード「EXIT_EXPLORE」が挿し込まれている。その他の処理については削除、置換などは行われていない。
【００５０】
実行系列２において、処理J_B1の後に検査ブロック開始位置情報である制御コード「ENTRY_EXPLORE」が挿し込まれているとともに、処理J_B５の前に検査ブロック終了位置情報である制御コード「EXIT_EXPLORE」が挿し込まれている。その他の処理については削除、置換などは行われていない。
【００５１】
実行系列Nにおいて、処理J_N1の後に検査ブロック開始位置情報である制御コード「ENTRY_EXPLORE」が挿し込まれているとともに、処理J_N５の前に検査ブロック終了位置情報である制御コード「EXIT_EXPLORE」が挿し込まれている。また、元の実行系列Nに含まれていた処理J_N２、処理J_N３、処理J_N４、処理J_N６、処理J_N７は、置き換えコード、表明、置き換えコードに置換されている。
【００５２】
図７に、図５に示した差し込み後検査対象５００において形成された検査ブロックを示す。実行系列１、実行系列２、実行系列Nのそれぞれに検査ブロックBLOCK_1、BLOCK_2、BLOCK_Nが形成されている。図示しなかった他の実行系列２から実行系列N−１においても同様に検査ブロックが形成され、後述する検査実行部５０はこれら検査ブロックによって形成される状態空間に探索の範囲を限定してモデル検査を実行することになる。
【００５３】
［１．１．４．差し込み後検査対象記憶部］  
差し込み後検査対象記憶部４０は、差し込み実行部２０によって生成された差し込み後検査対象を記憶する機能を有する。
【００５４】
［１．１．５．検査実行部］  
検査実行部５０は、差し込み後検査対象記憶部４０から差し込み後検査対象を読み出し、差し込み実行部２０によって指定された探索範囲である前記検査ブロック開始位置情報及び前記検査ブロック終了位置情報によって囲まれた範囲を探索する状態空間として、モデル検査を実行し、検査条件を満たさないシステムの動作シーケンスの例を検査結果出力６０（反例）として出力する機能を有する。
【００５５】
検査実行部５０には、従来のモデル検査装置に比べて、探査モードという新たな設定をプロセススコープで追加されている。検査実行部５０は、探索モードを切り替える制御コード（ENTER_EXPLORE, EXIT_EXPLORE）を読み取り、この制御コードに応じて動作することができる。
検査実行部５０は、各プロセス（実行系列）の初期の探索モードをOFFに設定しておく。  
【００５６】
検査実行部５０は、差し込み後検査対象を読み取っていき、ENTER_EXPLOREを検出すると、これをトリガにして各プロセスの探索モードにONにし、探索範囲内での探索を実行する。また、検査実行部５０は、さらに差し込み後検査対象を読み取っていき、EXIT_EXPLOREコードを検出すると、探索モードをOFFに戻す。これにより、検査実行部５０の探索範囲を各実行系列の検査ブロック内のコードが作る状態空間に限定することができる。検査実行部５０が探索する状態空間は、差し込み後検査対象５００全体が作る状態空間ではなく、各実行系列の検査ブロックBLOCK_1、BLOCK_2、…、BLOCK_N内のコードが作る状態空間に限定される様子を図８に示した。
【００５７】
なお、探索モードは、検査対象が取りうる状態の網羅的な探索を行うかどうかの設定である。探索モードがOFF状態であれば、検査実行部５０は他のプロセスに制御が移る（状態が変わる）可能性があっても考慮しない。一方、探索モードがON状態であると、他のプロセスに制御が移る可能性がある場合、検査実行部５０はあらゆる可能性を考慮する。
【００５８】
また、検査ブロックは、ENTER_EXPLORE、EXIT_EXPLOREで囲い込まれた実行系列中のコードの固まりであり、検査実行部５０が、検査対象が取りうる状態を網羅的に探索する範囲である。
【００５９】
［２．モデル検査装置の動作］  
次にモデル検査装置１の動作を説明する。図９にモデル検査装置１の主たる動作の一例を示したフローチャートを示す。
まず、モデル検査装置１は、検査対象の入力を受け付け、検査対象を検査対象記憶部１０に記憶させる（S10）。  
次にモデル検査装置１は、ルール型検査仕様の入力を受け付け、ルール型検査仕様をルール型検査仕様記憶部３０に記憶させる（S20）。
【００６０】
次にモデル検査装置１、より詳しくは差し込み実行部２０は、検査対象及びルール型検査仕様を読み取り、差し込み後検査対象を生成する処理である差し込み後検査対象生成処理を実行する（S30）。差し込み後検査対象生成処理の結果として生成された差し込み後検査対象は、差し込み後検査対象記憶部４０に記憶される。
【００６１】
次にモデル検査装置１、より詳しくはモデル検査実行部５０は、差し込み後検査対象を読み取り、差し込み後検査対象に含まれる各実行系列の検査ブロックを探索範囲とする探索を実行し、探索結果を生成するモデル検査実行処理を実行する（S40）。
【００６２】
次にモデル検査装置１、より詳しくはモデル検査実行部５０はステップS40で生成された探索結果を出力する（S50）。
以上でモデル検査装置１による検査対象のモデル検査が終了する。
【００６３】
［２．１．差し込み後検査対象生成処理］  
前述の図９に示したステップS30である差し込み後検査対象生成処理について詳述する。図１０は、差し込み後検査対象生成処理の一例を示したフローチャートである。
【００６４】
差し込み後検査対象生成処理では、モデル検査装置１、より詳しくは差し込み実行部２０は検査対象から一行（若しくは一命令文）を読み込む（S110）。次にモデル検査装置１、より詳しくは差し込み実行部２０は直前のステップS110において読み込んだデータが、ルール型検査仕様２００の差し込み位置指定部２０１で記述されている内容と一致するか否かを判定する（S120）。
【００６５】
ステップS110において読み込んだデータが、ルール型検査仕様２００の差し込み位置指定部２０１で記述されている内容と一致しないと判定した場合（S120、No）、モデル検査装置１、より詳しくは差し込み実行部２０は後述するステップS150に進む。一方、ステップS120において、ステップS110において読み込んだデータが、ルール型検査仕様２００の差し込み位置指定部２０１で記述されている内容と一致すると判定した場合（S120、Yes）、モデル検査装置１、より詳しくは差し込み実行部２０は検査ブロック開始位置情報及び検査ブロック終了位置情報を当該差し込み位置指定部２０１で指定された箇所に挿入する（S130）。
【００６６】
次にモデル検査装置１、より詳しくは差し込み実行部２０は直前のステップS120で一致すると判定したルール型検査仕様２００の差し替え内容指定部２０２に記述された内容を、前記検査ブロック開始位置情報及び検査ブロック終了位置情報の間に含まれる領域である検査ブロック内に挿入若しくは置換する（S140）。なお、差し替え内容指定部２０２に記述された内容に表明が含まれている場合は、ここで表明が検査対象に書き込まれる。
【００６７】
次にモデル検査装置１、より詳しくは差し込み実行部２０は検査対象内の全ての行（命令文など）を読み取ったか否かを判定する（S160）。検査対象内の全ての行（命令文など）を読み取っていないと判定した場合（S160, No）、モデル検査装置１、より詳しくは差し込み実行部２０は検査対象から新たな一行を読み込み、ステップS120に処理を移行する（S170）。一方、検査対象内の全ての行（命令文など）を読み取ったと判定した場合（S160, Yes）、モデル検査装置１、より詳しくは差し込み実行部２０は、検査ブロック開始位置情報及び検査ブロック終了位置情報、及び差し替え内容指定部２０２に記述された内容が書き込まれた検査対象を差し込み後検査対象として出力（S160）し、その後差し込み実行処理を終了する。  
以上で差し込み後検査対象生成処理の説明を終了する。
【００６８】
［２．２．モデル検査実行処理］  
前述の図９に示したステップS40であるモデル検査実行処理について詳述する。図１１は、モデル検査実行処理の一例を示したフローチャートである。  
モデル検査実行処理(S40）において、モデル検査装置１、より詳しくは検査実行部５０は、差し込み後検査対象から命令（コード）を一行読み込む（S210）。次にモデル検査装置１、より詳しくは検査実行部５０は、直前のステップS210で読み込んだ命令（コード）が検査ブロック開始位置情報か否かを判定する（S220）。ステップS210で読み込んだ命令（コード）が検査ブロック開始位置情報ではないと判定した場合（S220, No）、モデル検査装置１、より詳しくは検査実行部５０はステップS210に戻り、差し込み後検査対象から新たな命令（コード）を一行読み込む（S210）。一方、ステップS210で読み込んだ命令（コード）が検査ブロック開始位置情報であると判定した場合（S220, Yes）、モデル検査装置１、より詳しくは検査実行部５０は現プロセスの探索モードをONに切り替え（S230）、差し込み後検査対象から次の一行を読み込む（S240）。次にモデル検査装置１、より詳しくは検査実行部５０は状態を記憶する（S250）。次にモデル検査装置１、より詳しくは検査実行部５０は、問題を検出したか否かを判定する（S260）。問題を検出したと判定した場合（S260、Yes）、モデル検査装置１、より詳しくは検査実行部５０は検査結果を生成し（S310）、モデル検査実行処理を終了する。この場合、モデル検査実行処理は異常終了となる。一方、ステップS260において問題を検出しなかったと判定した場合（S260、No）、モデル検査装置１、より詳しくは検査実行部５０は制御を他のプロセス（実行系列）に切り替える（S270）。なお、図１１では示していないが、プロセスごとに本ワークフロー（モデル検査実行処理）が存在し、プロセスの切り換え後は前回中断した位置(基本的にステップS270 ,ただし初めて実行するプロセスはステップS210)から、そのプロセスについてのモデル検査実行処理を再開する。選択肢が複数存在する場合はバックトラック機能により、検査実行部５０は全選択肢について実行パスを探索する。
【００６９】
次にモデル検査装置１、より詳しくは検査実行部５０は、直前のステップS240で読み込んだ命令（コード）が検査ブロック終了位置情報か否かを判定する（S280）。ステップS240で読み込んだ命令（コード）が検査ブロック終了位置情報ではないと判定した場合（S280, No）、モデル検査装置１、より詳しくは検査実行部５０はステップS240に戻り、モデル検査実行処理を続行する。一方、ステップS240で読み込んだ命令（コード）が検査ブロック終了位置情報であると判定した場合（S280, Yes）、モデル検査装置１、より詳しくは検査実行部５０は現プロセスの探索モードをOFFに切り替える（S290）。
【００７０】
次にモデル検査装置１、より詳しくは検査実行部５０は差し込み後検査対象に含まれる、指定された全ての探索範囲の探索を終えたか否かを判定する（S300）。指定された全ての探索範囲の探索を終えていないと判定した場合（S300 , No）、モデル検査装置１、より詳しくは検査実行部５０はステップS210に戻りモデル検査実行処理を続行する。一方、指定された全ての探索範囲の探索を終えたと判定した場合（S300, Yes）、モデル検査装置１、より詳しくは検査実行部５０は検査結果を生成し（S310）、モデル検査実行処理を終了する。  
以上でモデル検査実行処理の説明を終了する。
【００７１】
［３．実施例］  
第１の実施の形態の実施例を説明する。図１２は第１の実施の形態の実施例の構成例を示した機能ブロック図である。実施例に係るモデル検査装置１＿１は、テストコード或いはソースコードを記憶するソースコード記憶部１２１と、ソースコード記憶部１２１に接続されたJavaコンパイラ（javac）１２２と、Javaコンパイラ（javac）１２２に接続されたバイトコード記憶部１２３と、バイトコード記憶部１２３に接続されたアスペクトコンパイラ(ajc）１２４と、このアスペクトコンパイラ１２４へ接続された検査用アスペクト記憶部１２５と、このアスペクトコンパイラ１２４が接続している検査対象バイトコード記憶部１２６と、この検査対象バイトコード記憶部１２６に接続している改良型ジャバパスファインダ（Java Path Finder ; JPF）１２７とを有している。
【００７２】
ジャバコンパイラ１２２は、ソースコード又はテストコードをコンパイルしてバイトコードを生成し、このバイトコードはバイトコード記憶部１２３に記憶される。バイトコード記憶部１２３は検査対象記憶部１０に対応する構成要素である。検査用アスペクト記憶部１２５はルール型検査仕様記憶部３０に対応する構成要素である。検査用アスペクト記憶部１２５は、ルール型検査仕様２００に相当する検査用アスペクトを記憶する。検査用アスペクトは、差し込み位置指定部２０１に相当する置き換えルールと、差し替え内容指定部２０２に相当する置き換え内容と、表明文を有している。
【００７３】
アスペクトコンパイラ１２４は、バイトコードを改良型ジャバパスファインダ１２７が検査可能なコードに変換するとともに、検査用アスペクトを参照して、検査ブロック開始位置情報に相当する制御コード、検査ブロック終了位置開始情報に相当する制御コード、置き換え内容、表明文を前記コードに挿入して、検査対象バイトコードを生成する。生成された検査対象バイトコードは検査対象バイトコード記憶部１２６に記憶される。
【００７４】
改良型ジャバパスファインダ１２７は、スレッド単位の原始性制御を行い、検査ブロックの検出を行い、検査ブロックによって限定された状態空間を探索して、検査結果１２８を出力する。
【００７５】
図１３に実施例におけるルール型検査仕様２００の例を示す。この例では、ルール型検査仕様２００は差し込み位置指定部２０１に相当するコードと、差し替え内容指定部２０２に相当するコードとを有しており、この差し替え内容指定部２０２は表明文を含んでいる。この例ではexecutionとaroundにより、中身の完全な置き換えを指示している。図１４にバイトコードの例を示す。このバイトコード１４００のコード群１４０１が前記の差し替え内容指定部２０２に置き換えられる部分となる。図１５にバイトコード１４００をアスペクトコンパイラ１２４が変換して出力した検査対象バイトコードの例を示す。検査対象バイトコード１５００に含まれているコード１５０１において、改良型ジャバパスファインダ１２７はメソッドajc$around$as3_VerifyAspect$2$204afd7a(new  RecordSaver.AjcClosure1(arrayOfObject));のInvokeコード/ReturnコードをENTER_EXPLORE, EXIT_EXPLOREと解釈することにより、検査ブロックによる状態空間の限定が行われる。
【００７６】
本実施例のテスト結果を述べる。本発明者は図１６に示すような、それぞれが適用観点が異なる８種類のテストを実施した。なお、「xxx_Threadpool」は、スレッドプールを使用するテストコードを使用すること意味し、「xxx_軽量版」は、スレッドプールによる実装をThread#start, #joinに置き換えたテストコードを使用することを意味する。
【００７７】
図１７に、上記図１６に示したテストの結果を示す。ここで「改良型１」は、改良型ジャバパスファインダ１２７としてシステムスコープで原子性を強制する機能を、探索範囲を指定する目的に使用したJPFを使用したことを示す。また「改良型２」は、改良型ジャバパスファインダ１２７としてスレッドスコープで切り替える探索モードを実装したJPFを使用したことを示す。図１７中、「中断」と表示されている状態数、検査時間の欄はテスト実行開始後３０分待っても検査結果出力が行われないので検査を中断したことを示している。
【００７８】
このテスト結果から、本実施例によれば検査実行者などが検査対象を直接改変する作業を行うこと無く、探索する状態空間を絞り込んで状態の爆発を防止し、現実的な時間内での検査を可能にできることが確認できた。
【００７９】
［４．本実施の形態の利点］  
本実施形態に係るモデル検査装置によれば、検査対象と独立して記述したルール型検査仕様により、検査実行者が検査対象に直接手を加えること無く、探索範囲を制御するコードと検査内容を検査対象に埋め込むことができ、その結果探索する状態空間をさらに限定して目的の検査を実行することが可能となる。
【００８０】
［５．まとめ、その他］  
以上、本発明の実施の形態を説明したが、本発明はこれらに限定されるものではなく、発明の趣旨を逸脱しない範囲内において、種々の変更、追加、組み合わせ等が可能である。
【符号の説明】
【００８１】
１・・・モデル検査装置；  １０・・・検査対象記憶部；  ２０・・・差し込み実行部；  ３０・・・ルール型検査仕様記憶部；  ４０・・・差し込み後検査対象記憶部；  ５０・・・検査実行部；  ２００・・・ルール型検査仕様；  ２０１・・・差し込み位置指定部；  ２０２・・・差し替え内容指定部；  ２０３・・・表明文；
【図１】
2015011445.tif 000003
【図２】
2015011445.tif 000004
【図３】
2015011445.tif 000005
【図４】
2015011445.tif 000006
【図５】
2015011445.tif 000007
【図６】
2015011445.tif 000008
【図７】
2015011445.tif 000009
【図８】
2015011445.tif 000010
【図９】
2015011445.tif 000011
【図１０】
2015011445.tif 000012
【図１１】
2015011445.tif 000013
【図１２】
2015011445.tif 000014
【図１３】
2015011445.tif 000015
【図１４】
2015011445.tif 000016
【図１５】
2015011445.tif 000017
【図１６】
2015011445.tif 000018
【図１７】
2015011445.tif 000019