(57)【特許請求の範囲】
【請求項１】
プログラムデータ格納部に格納されている分析対象のプログラムから、繰り返し制御変数を変化させて特定のケースを探索して当該特定のケースにおいて特定の処理を実施するというパターンに合致する繰り返しブロックを抽出するステップと、
前記分析対象のプログラムにおいて、抽出された前記繰り返しブロック及び当該繰り返しブロックの直後のブロックを、真の場合に前記特定の処理を実施し且つ偽の場合に前記直後のブロックの処理を実施し且つ当該真偽に関する述語関数を含む二分岐構造に置換する変換処理を実施し、変換処理後のプログラムを変換後プログラム格納部に格納する変換処理ステップと、
前記二分岐構造に含まれる前記述語関数について論理制約を生成し、パスコンディションデータ格納部に格納するステップと、
前記変換後プログラム格納部に格納された前記変換処理後のプログラムのシンボリック実行時に、前記パスコンディションデータ格納部に格納されている前記述語関数を処理していることを検出すると、当該述語関数に対応付けられている論理制約から、前記述語関数の出現位置におけるパスコンディションを生成してシンボリック実行部の管理データに追加登録するステップと、
を、コンピュータに実行させるためのシンボリック実行支援プログラム。
【請求項２】
前記変換処理が、
前記述語関数の宣言を前記分析対象のプログラムに追加する処理と、
前記繰り返し制御変数で今回のケースを特定するためのカレントデータ設定文を、前記繰り返し制御変数を固定の値に設定したカレントデータ設定文に置換する処理と、
を含む請求項１記載のシンボリック実行支援プログラム。
【請求項３】
前記パターンが、前記特定の処理において繰り返し制御変数を使用していないという条件を含むパターンである
請求項１又は２記載のシンボリック実行支援プログラム。
【請求項４】
前記変換処理ステップが、
前記分析対象のプログラムから、前記繰り返し制御変数で今回のケースを特定するためのカレントデータ設定文と、抽出された前記繰り返しブロックに含まれる前記特定の処理のブロックと、抽出された前記繰り返しブロックの直後のブロックとを抽出し、対応付けて存在チェックテーブルに登録するステップと、
前記存在チェックテーブルに対応付けられているデータで前記二分岐構造を生成するステップと、
を含む請求項１乃至３のいずれか１つ記載のシンボリック実行支援プログラム。
【請求項５】
プログラムデータ格納部に格納されている分析対象のプログラムから、繰り返し制御変数を変化させて特定のケースを探索して当該特定のケースにおいて特定の処理を実施するというパターンに合致する繰り返しブロックを抽出するステップと、
前記分析対象のプログラムにおいて、抽出された前記繰り返しブロック及び当該繰り返しブロックの直後のブロックを、真の場合に前記特定の処理を実施し且つ偽の場合に前記直後のブロックの処理を実施し且つ当該真偽に関する述語関数を含む二分岐構造に置換する変換処理を実施し、変換処理後のプログラムを変換後プログラム格納部に格納する変換処理ステップと、
前記二分岐構造に含まれる前記述語関数について論理制約を生成し、パスコンディションデータ格納部に格納するステップと、
前記変換後プログラム格納部に格納された前記変換処理後のプログラムのシンボリック実行時に、前記パスコンディションデータ格納部に格納されている前記述語関数を処理していることを検出すると、当該述語関数に対応付けられている論理制約から、前記述語関数の出現位置におけるパスコンディションを生成してシンボリック実行部の管理データに追加登録するステップと、
を含み、コンピュータに実行されるシンボリック実行支援方法。
【請求項６】
プログラムデータ格納部に格納されている分析対象のプログラムから、繰り返し制御変数を変化させて特定のケースを探索して当該特定のケースにおいて特定の処理を実施するというパターンに合致する繰り返しブロックを抽出する処理対象特定部と、
前記分析対象のプログラムにおいて、抽出された前記繰り返しブロック及び当該繰り返しブロックの直後のブロックを、真の場合に前記特定の処理を実施し且つ偽の場合に前記直後のブロックの処理を実施し且つ当該真偽に関する述語関数を含む二分岐構造に置換する変換処理を実施し、変換処理後のプログラムを変換後プログラム格納部に格納する二分岐ブロック生成部と、
前記二分岐構造に含まれる前記述語関数について論理制約を生成し、パスコンディションデータ格納部に格納するパスコンディションテーブル生成部と、
前記変換後プログラム格納部に格納された前記変換処理後のプログラムのシンボリック実行時に、前記パスコンディションデータ格納部に格納されている前記述語関数を処理していることを検出すると、当該述語関数に対応付けられている論理制約から、前記述語関数の出現位置におけるパスコンディションを生成してシンボリック実行部の管理データに追加登録するパスコンディション動的追加部と、
を有するシンボリック実行支援装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本技術は、シンボリック実行技術に関する。
【背景技術】
【０００２】
シンボリック実行（symbolic execution）は、記号実行とも呼ばれ、例えばプログラムのテスト及び検証を行う際に用いられる。シンボリック実行についての基礎的な事項は、例えば、玉井哲雄、福永光一、「記号実行システム」、情報処理、pp18-28、1982/01/15などに詳しく述べられているので、そちらを参照されたい。
【０００３】
シンボリック実行は、プログラムを、そのプログラムに含まれる変数に具体的な数値を入力する代わりに、数値を代表するシンボルでプログラムを模擬的に実行し、その結果を評価する技術である。例えば図１に示すようなプログラムをシンボリック実行する場合を考える。このプログラムでは、（１）乃至（３）にｉｆ文が記述されている。また、変数ｘ及びｙがシンボリック実行におけるシンボルとして指定されているものとする。このようなプログラムをシンボリック実行すると、図２に模式的に示すような制御フローが得られる。図２において処理１乃至４を除く矩形ボックスは、シンボリック実行で代入文や条件文などを通過したときに満たすべき論理的な制約（すなわちパスコンディション）を表しており、シンボリック実行ではこのようなパスコンディションを代入文や条件文などを通過する毎に積み上げるといった処理を行う。図２の例では、ｚにｘ＋５を代入したところで（ｚ＝ｘ＋５）というパスコンディションが積まれ、（１）のｉｆ文で（ｚ＝ｘ＋５且つｚ＞＝１０）というパスコンディションと、（ｚ＝ｘ＋５且つｚ＜１０）というパスコンディションが積み上げられる。以下、（２）のｉｆ文でさらに２つのパスコンディションが積み上げられ、（３）のｉｆ文でさらに２つのパスコンディションが積み上げられる。
【０００４】
このようなシンボリック実行の後に、パスコンディションが充足可能か否かの判定を、例えばＳＡＴ（satisfiability）又はＳＭＴ（satisfiability modulo theory）ソルバを利用して行う。図２の例では、（２）の分岐の後に生成されるパスコンディション（ｚ＝ｘ＋５且つｚ＞＝１０且つｘ＜＝１０）は、充足不可能と判断され、処理２は実行されないことが分かる。なお、シンボリック実行は、ＪＰＦ（Java（登録商標） Path Finder）などのモデル検査エンジンと組み合わせて使用される場合もある。
【０００５】
このように、シンボリック実行では、条件分岐においてその充足可能な全ての実行パスを自動的に発生させて、プログラムの網羅的な実行を可能としている。しかし、その網羅性ゆえに組み合せ爆発を起こす可能性があり、特に実装言語特有のアルゴリズムによりシンボリック実行上では本来必要としない組み合せを多く生成してしまい、無駄な探索を繰り返してしまうという問題がある。
【０００６】
図３にそのようなプログラムの例を示す。図３は、与えられたｐｉｄと同一のｐｉｄを有する商品を探し出し、その在庫が数量ｑｎｔ以上であれば「在庫足りる」を出力し、在庫が数量ｑｎｔ未満であれば「在庫足りない」を出力し、さらに与えられたｐｉｄと同一のｐｉｄを有する商品がなければ「該当商品なし」を出力するプログラムである。このようなプログラムに対してシンボリック実行を行うと、図４に示すような制御フローとなる。なお、data.sizeが「１０」であるものと仮定している。図３のようなプログラムでは、図４に示すように、ｐｉｄが１件目でマッチする場合、ｐｉｄが２件目でマッチする場合、．．．ｐｉｄが１０件目でマッチする場合、そして、１０件目でもマッチしない場合といったように、全てのケースについてパスコンディションが積み上げられる。
【０００７】
このような場合、本来何件目でマッチするかは無関心であるにもかかわらず、シンボリック実行上では、データ集合の要素数分の場合分けに応じてパスコンディションが生成されるので、論理制約の無駄な組み合わせによる組み合わせ爆発を引き起こしてしまう。
【０００８】
このようなfor文などの繰り返し構造に起因する組み合わせ爆発に対して、従来、有界モデル検査（BLAST）などで用いられている、繰り返し構造部分の有界実行という手法が知られている。しかし一般に、最適な長さで繰り返し回数を固定化できないという問題がある。具体的には、プログラムの全ての繰り返し構造に対して、その内容にかかわらず、「ある固定回数以内」（例えば、forループは高々５回まで)というような有界化をするため、無駄なループが残り得る。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特開２００９−８７３５５号公報
【特許文献２】特開平１１−２７２５０３号公報
【発明の概要】
【発明が解決しようとする課題】
【００１０】
よって、本技術の目的は、シンボリック実行において、無駄なパスコンディションを生成せずに適切に実行パスを把握することができるようにするための技術を提供することである。
【課題を解決するための手段】
【００１１】
本シンボリック実行支援方法は、（Ａ）プログラムデータ格納部に格納されている分析対象のプログラムから、繰り返し制御変数を変化させて特定のケースを探索して当該特定のケースにおいて特定の処理を実施するというパターンに合致する繰り返しブロックを抽出するステップと、（Ｂ）分析対象のプログラムにおいて、抽出された繰り返しブロック及び当該繰り返しブロックの直後のブロックを、真の場合に特定の処理を実施し且つ偽の場合に直後のブロックの処理を実施し且つ当該真偽に関する述語関数を含む二分岐構造に置換する変換処理を実施し、変換処理後のプログラムを変換後プログラム格納部に格納する変換処理ステップと、（Ｃ）二分岐構造に含まれる述語関数について論理制約を生成し、パスコンディションデータ格納部に格納するステップと、（Ｄ）変換後プログラム格納部に格納された変換処理後のプログラムのシンボリック実行時に、パスコンディションデータ格納部に格納されている述語関数を処理していることを検出すると、当該述語関数に対応付けられている論理制約から、述語関数の出現位置におけるパスコンディションを生成してシンボリック実行部の管理データに追加登録するステップとを含む。
【発明の効果】
【００１２】
シンボリック実行において、無駄なパスコンディションを生成せずに適切に実行パスを把握することができるようになる。
【図面の簡単な説明】
【００１３】
【図１】図１は、プログラムの一例を示す図である。
【図２】図２は、図１のプログラムの制御フローを示す図である。
【図３】図３は、プログラムの一例を示す図である。
【図４】図４は、従来技術の問題を説明するための図である。
【図５】図５は、シンボリック実行支援装置の機能ブロック図である。
【図６】図６は、シンボリック実行支援装置の機能ブロック図である。
【図７】図７は、本実施の形態のメインフローを示す図である。
【図８】図８は、前処理の処理フローを示す図である。
【図９】図９は、分析対象プログラムの一例を示す図である。
【図１０】図１０は、抽出されるｆｏｒブロックの一例を示す図である。
【図１１】図１１は、抽出すべき繰り返しパターンを説明するための図である。
【図１２】図１２は、存在チェックテーブルへの登録について説明するための図である。
【図１３】図１３は、存在チェックテーブルの一例を示す図である。
【図１４】図１４は、前処理の処理フローを示す図である。
【図１５】図１５は、生成されるｉｆブロックの一例を示す図である。
【図１６】図１６は、述語関数の宣言の一例を示す図である。
【図１７】図１７は、変換後プログラムの一例を示す図である。
【図１８】図１８は、パスコンディションテーブルの一例を示す図である。
【図１９】図１９は、シンボリック実行を模式的に説明するための図である。
【図２０】図２０は、シンボリック実行によって把握される実行パスの一例を示す図である。
【図２１】図２１は、シンボリック実行時処理の処理フローを示す図である。
【図２２】図２２は、図１７に示したプログラムの制御フローの例を示す図である。
【図２３】図２３は、コンピュータの機能ブロック図である。
【発明を実施するための形態】
【００１４】
図５及び図６に本技術の実施の形態に係るシステムの機能ブロック図を示す。図５に、前処理段階で使用されるシンボリック実行支援装置の機能ブロック図を示す。シンボリック実行支援装置は、入力部１０１と、入力データ格納部１０２と、処理対象特定部１０３と、チェックパターン格納部１０４と、存在チェックテーブル格納部１０５と、二分岐構造生成部１０６と、変換後プログラム格納部１０７と、パスコンディションテーブル格納部１０８とを有する。
【００１５】
入力部１０１は、ユーザなどから分析対象のプログラムの指定及びシンボリック実行に係る変数の指定を受け付け、それらのデータを入力データ格納部１０２に格納する。チェックパターン格納部１０４は、本実施の形態における処理の対象となる繰り返しブロックを抽出するためのパターンについてのデータを格納する。処理対象特定部１０３は、ループ抽出部１０３１及びパターンチェック部１０３３を含み、入力データ格納部１０２及びチェックパターン格納部１０４に格納されているデータを用いて処理を行い、処理結果である存在チェックテーブルを生成して存在チェックテーブル格納部１０５に格納する。
【００１６】
二分岐構造生成部１０６は、ｉｆブロック生成部１０６１及びパスコンディションテーブル生成部１０６３を含み、入力データ格納部１０２、存在チェックテーブル格納部１０５に格納されているデータを用いて処理を行い、処理結果として変換後プログラムを生成して変換後プログラム格納部１０７に格納し、同じく処理結果としてパスコンディションテーブルを生成してパスコンディションテーブル格納部１０８に格納する。
【００１７】
次に、図６に、シンボリック実行時の構成を示す。シンボリック実行部２００は、既存のシンボリック実行を行うモジュールであり、分析対象のプログラムにおいて実行している関数を積む関数スタック２１１と、制御フローを記録するためのブランチ管理テーブル２１３とを管理している。ブランチ管理テーブル２１３は、ブランチポイント毎に、ブランチの条件が真の場合のパスコンディションと、偽の場合のパスコンディションとを登録するものとする。なお、シンボリック実行部２００は、様々なものが流通しており、例えばＪａｖａ（登録商標）  ＰａｔｈＦｉｎｄｅｒの拡張であるＳｙｍｂｏｌｉｃ  ＰａｔｈＦｉｎｄｅｒなどであってもよい。
【００１８】
シンボリック実行部２００は、変換後プログラム格納部１０７に格納されている変換後プログラムを処理する。このシンボリック実行部２００の実行中に、本実施の形態において導入されるパスコンディション動的追加部１５１は、パスコンディションテーブル格納部１０８に格納されているデータを用いて、シンボリック実行部２００に対して処理を行うようになっている。なお、パスコンディション動的追加部１５１及びシンボリック実行部２００が、シンボリック実行支援装置と一体である場合もあれば、パスコンディション動的追加部１５１及びシンボリック実行部２００とを含むシンボリック実行装置が別途用意される場合もある。
【００１９】
次に、図７乃至図２２を用いて図５及び図６に示したシステムの動作について説明する。本実施の形態では、最初に前処理を実施し（ステップＳ１）、前処理の結果を用いてシンボリック実行時処理を実施する（ステップＳ３）。
【００２０】
まず、図８乃至図２０を用いて前処理について説明する。まず、入力部１０１は、ユーザから分析対象のプログラム及びシンボリック実行に係る変数の指定を受け付け、分析対象のプログラムを取得して上記変数のデータと共に入力データ格納部１０２に格納する（図８：ステップＳ１１）。なお、分析対象のプログラムについては、当該プログラムを含むファイルを同一装置の記憶装置から読み出したり、ネットワークで接続されている他のコンピュータから取得したりする。
【００２１】
本実施の形態では、例えば図９に示すようなプログラムを処理する場合を考察する。図９は、プログラムの一部であるが、変数ｉｔｅｍ１乃至１０、ｐｉｄ１、ｑｎｔ１は、シンボル実行に係る変数であるものとする。また、ｐｕｒｃｈａｓｅメソッドが１回呼ばれ、商品ＩＤが入力されるｐｉｄ１及び数量が入力されるｑｎｔ１が渡される。さらに、ｐｕｒｃｈａｓｅメソッドは、基本的に、図３で示したプログラムである。
【００２２】
そして、処理対象特定部１０３は、入力データ格納部１０２に格納されている分析対象のプログラムを読み出し（ステップＳ１３）、処理対象特定部１０３のループ抽出部１０３１は、分析対象のプログラム内における繰り返しブロック（例えばｆｏｒブロック）を抽出し、例えばメインメモリなどの記憶装置に格納する（ステップＳ１５）。なお、言語によってはwhileなどを使う場合もあるので、分析対象のプログラムにおいて使用されているプログラム言語に応じて繰り返しブロックを検出する。図９のプログラムの場合には、図１０に示すようなｆｏｒブロックが抽出される。
【００２３】
そして、処理対象特定部１０３のパターンチェック部１０３３は、特定された繰り返しブロックのうち未処理の繰り返しブロックを１つ特定する（ステップＳ１７）。その後、パターンチェック部１０３３は、チェックパターン格納部１０４に格納されているチェックパターンのデータを用いて、特定された繰り返しブロックが、本実施の形態において取り扱い可能な繰り返しブロックのパターンに適合するか確認する（ステップＳ１９）。
【００２４】
本実施の形態では、特定のデータが存在するか否かをループを回しながら検査するようなパターンに適合するかを確認する。具体的には図１１に示すように、ｆｏｒループ内において、特定のデータか否かを判断する条件（ｉｆ文内の条件）を規定しているという条件と、繰り返し制御変数（ここではｉ）によって現在のデータをセットする文以外の処理に繰り返し制御変数ｉに関する手続が規定されていないという条件と、存在確認されるデータ集合のサイズと同じだけループが繰り返されるという条件とを含む。
【００２５】
これらの条件のいずれかを満たさない場合には、以下で述べるような単純な二分岐構造に直した場合に、論理的に正しくパスコンディションを積むことができるか不明であり、適合しないと判断するものとする。
【００２６】
特定された繰り返しブロックが上で述べたようなパターンに適合しない場合には、端子Ａを介して図１４のステップＳ３３に移行する。一方、特定された繰り返しブロックが上で述べたようなパターンに適合する場合には、パターンチェック部１０３３は、分析対象のプログラムから、繰り返しブロック内のｉｆ文の条件部分（すなわち特定のデータか否かを判断する条件。ｉｆ条件文と呼ぶ。）、繰り返し制御変数によって現在のデータをセットするカレントデータ設定文、ｉｆ条件文で真とされた場合の処理ブロックと、ｉｆ条件文で偽とされた場合の処理ブロックとを抽出し、それらを存在チェックテーブル格納部１０５内の存在チェックテーブルに登録する（ステップＳ２３）。処理は端子Ｂを介して図１４の処理に移行する。
【００２７】
例えば図１２に示すように、図１０に示したｆｏｒブロックに関連して、ｉｆ条件文Ｄと、カレントデータ設定文Ｅと、ｉｆ条件文Ｄが真の場合に実行され且つ繰り返し制御変数ｉの手続を含まない処理ブロックＦと、ｉｆ条件文Ｄが偽の場合に実行され且つｆｏｒブロックの直後のブロックＧとを抽出して、存在チェックテーブルに登録する。
【００２８】
図１３に、存在チェックテーブルの一例を示す。図１３の例では、ｉｆ条件文のための存在条件欄と、カレントデータ設定文のためのカレントデータ設定欄と、真の場合に実行される処理ブロック（真）の欄と、偽の場合に実行される処理ブロック（偽）の欄とが含まれ、図１２で示したように抽出されたＤ乃至Ｇのデータが登録される。
【００２９】
図１４の処理の説明に移行して、二分岐構造生成部１０６のｉｆブロック生成部１０６１は、存在チェックテーブル格納部１０５内の存在チェックテーブルに登録されているカレントデータ設定文の繰り返し制御変数ｉを所定の固定値に変更する（ステップＳ２５）。
【００３０】
これにより、対象とする配列やリストなどの集合データの検索範囲を１つの要素に代表させる。例えばｉ＝０として、図１３の例では、Item item = data.get(0)と変更する。但し、現在着目している繰り返しブロック全体が複数回呼ばれるような場合は、検索条件が同じ場合は同じ要素を利用し、違う場合は違う要素を利用するようにする。例えば、図９のプログラムの場合ｐｕｒｃｈａｓｅメソッドは１回だけ呼ばれるので、ｆｏｒブロックにおいても１つの条件ｐｉｄ１だけで検索される。これに対して、ｐｕｒｃｈａｓｅメソッドが２回呼ばれて、２回目にはｐｉｄ２という異なる条件が渡される場合には、ｉ＝０ではなく、ｉ＝１としてカレントデータ設定文を変更する。すなわち、Item item = data.get(1)と変更する。
【００３１】
そして、ｉｆブロック生成部１０６１は、繰り返しブロック及び繰り返しブロックの直後のブロックを、存在チェックテーブルに従ってｉｆブロックに変換して、変換後のプログラムを変換後プログラム格納部１０７に格納する（ステップＳ２７）。
【００３２】
具体的には、真又は偽となる述語関数を導入して、新たに導入するｉｆ条件文に当該述語関数を採用する。そして述語関数が真の場合には、存在チェックテーブルに登録されているカレントデータ設定文及び真の場合の処理ブロックを実行し、述語関数が偽の場合には、存在チェックテーブルに登録されている偽の場合の処理ブロックを実行するようなｉｆブロックを生成して、当該ｉｆブロックで、入力データ格納部１０２に格納されている分析対象のプログラムの処理対象のｆｏｒブロック及び当該ｆｏｒブロックの直後のブロックと置換する。なお、２以上のｆｏｒブロックが存在する場合には、２つ目以降のｆｏｒブロック等については、変換後プログラム格納部１０７に格納されており且つ直前に処理されたプログラムについて置換を行う。また、入力データ格納部１０２に格納されているシンボリック実行に係る変数のデータについても、変換後プログラム格納部１０７に格納しておく。
【００３３】
例えば、図１５に示すようなｉｆブロックが生成される。図１５の例では、＿ＥＸＩＳＴ１という述語関数が導入されている。このような述語関数については、＿ＥＸＩＳＴ＋番号というようなルールを予め決めておき、本ステップで決定すればよい。図１５の例では、＿ＥＸＩＳＴ１が真の処理ブロックには、存在チェックテーブルのカレントデータ設定の欄の内容と処理ブロック（真）の欄の内容が埋め込まれており、＿ＥＸＩＳＴ１が偽の処理ブロックには、存在チェックテーブルの処理ブロック（偽）の内容が埋め込まれている。
【００３４】
さらに、ｉｆブロック生成部１０６１は、ｉｆブロックの条件文で採用した述語関数を宣言するブロックを生成して、ｉｆブロックの前に追加する（ステップＳ２９）。例えば図１６に示すように、述語関数をダミー関数として宣言するブロックを生成する。
【００３５】
このような処理を実施した後、ｉｆブロック生成部１０６１は、処理後のプログラムを変換後プログラム格納部１０７に格納する。上で述べた例では、図１７に示すような変換後プログラムが生成されて、変換後プログラム格納部１０７に格納される。
【００３６】
また、二分岐構造生成部１０６のパスコンディションテーブル生成部１０６３は、ｉｆブロックの条件文で採用した述語関数とその論理制約とを、パスコンディションテーブル格納部１０８におけるパスコンディションテーブルに登録する（ステップＳ３１）。仮に導入した述語関数であるので、論理制約についても他の論理制約と区別できるように決定すればよい。例えば、述語関数＿ＥＸＩＳＴ１に対して論理制約＿ｅｘｉｓｔ１といったものでよい。
【００３７】
パスコンディションテーブルは、例えば図１８に示すようなテーブルである。関数名に対応付けて論理制約を登録するようになっている。
【００３８】
このようにすれば、プログラムの大まかな構造として図１９のようなプログラムが得られて、これに対してシンボリック実行すれば、図２０に示すような制御フローが把握される。すなわち、新たに導入したｉｆ文で、パスコンディション＿ｅｘｉｓｔ１の場合と、パスコンディションｎｏｔ（＿ｅｘｉｓｔ１）の場合とに分岐するものである。以下、それぞれに異なる処理、すなわちｂｌｏｃｋ１又はｂｌｏｃｋ２が実行される。
【００３９】
その後、処理対象特定部１０３は、全ての繰り返しブロックを処理したかを判断し（ステップＳ３３）、未処理の繰り返しブロックが存在する場合には端子Ｃを介してステップＳ１７に戻る。一方、全ての繰り返しブロックについて処理した場合には、元の処理に戻る。
【００４０】
このようにして、シンボリック実行を実施する前に行うべき前処理が完了する。このような変換を行うことによって、特定の条件を満たすデータの存在を確認するようなｆｏｒブロックで不必要にパスコンディションの組み合わせが増加する事態は避けられる。しかしながら、通常どおりシンボリック実行部２００がシンボリック実行を行っても、新たに導入したｉｆ条件文の述語関数については、シンボルとして取り扱われることはない。
【００４１】
従って、シンボリック実行時処理をパスコンディション動的追加部１５１が実行することによって、適切な位置に適切なパスコンディションを挿入するようにする。
【００４２】
図２１及び図２２を用いてシンボリック実行時処理について説明する。シンボリック実行部２００は、ユーザ等からの指示又は処理対象特定部１０３等からの指示に応じて、変換後プログラム格納部１０７に格納されている変換後プログラムの実行を開始する（ステップＳ４１）。シンボリック実行部２００は、既に知られた方法で変換後のプログラムをシンボル実行する。なお、シンボル実行時には、図６に示したように、変換後プログラムにおいて実行する関数を関数スタック２１１に積み、分岐点において当該分岐の条件が真の場合のパスコンディション及び偽のパスコンディションを、ブランチ管理テーブル２１３に登録するようになっているものとする。
【００４３】
そこで、シンボリック実行が終了するまで（ステップＳ４３）、パスコンディション動的追加部１５１は、以下の処理を実施する。パスコンディション動的追加部１５１は、上で述べた関数スタック２１１を監視して（ステップＳ４５）、関数スタック２１１に積まれた最新の関数名とパスコンディションテーブル格納部１０８内のパスコンディションテーブルにおける関数名の列に登録されている関数名とを比較する。そして、パスコンディション動的追加部１５１は、関数スタック２１１に積まれた最新の関数名とパスコンディションテーブル内の関数名とが一致するか判断する（ステップＳ４７）。関数スタック２１１に積まれた最新の関数名とパスコンディションテーブル内の関数名と一致しない場合にはステップＳ４３に戻る。
【００４４】
一方、関数スタック２１１に積まれた最新の関数名とパスコンディションテーブル内の関数名のいずれかと一致する場合には、パスコンディション動的追加部１５１は、パスコンディションテーブル格納部１０８内のパスコンディションテーブルにおいて、関数スタック２１１に積まれた最新の関数名と一致すると判断された関数名に対応付けて登録されている論理制約から、真及び偽のパスコンディションを生成して、ブランチポイントと共にブランチ管理テーブル２１３に登録する（ステップＳ４９）。この処理の後にステップＳ４３に戻る。
【００４５】
例えば、図１８のようなパスコンディションテーブルの場合、関数名＿ＥＸＩＳＴ１（）であるから、ブランチポイントは、ｉｆ（＿ＥＸＩＳＴ１（））と自動的に特定できる。さらに、対応する論理制約＿ｅｘｉｓｔ１が得られるので、ブランチ管理テーブル２１３の直前のレコードに含まれる真のパスコンディション又は偽のパスコンディションと＿ｅｘｉｓｔ１とを含む真のパスコンディションを生成し、同様にブランチ管理テーブル２１３の直前のレコードに含まれる真のパスコンディション又は偽のパスコンディションとｎｏｔ（＿ｅｘｉｓｔ１）とを含む偽のパスコンディションを生成し、ブランチポイントと共に、ブランチ管理テーブル２１３に追加登録する。
【００４６】
このようにブランチ管理テーブル２１３に、レコードを追加することによって、繰り返しブロックをｉｆブロックに変換した影響を反映させることができるようになる。すなわち、繰り返し構造による無駄なパスコンディションの組み合わせを回避することができ、シンプルに論理的に正しい形で制御フローを把握できるようになる。
【００４７】
例えば図９の繰り返しブロック及び直後のブロックだけに着目すれば、図２２に示すような制御フローが把握される。図３と比較すれば、該当データがある場合と該当データがない場合で分岐して、該当データがある場合には数量が足りる場合と足りない場合とに分岐するだけであるから、無駄な実行パスが除去されてシンプルに但し論理的には正しくプログラムの実行パスを表すことができるようになっている。
【００４８】
以上本技術の実施の形態について説明したが、本技術はこれに限定されるものではない。例えば、図５及び図６で示した機能ブロック図は一例であって、必ずしも実際のプログラムモジュール構成とは異なる場合がある。
【００４９】
処理フローについても処理結果が変わらない限り、ステップの順番を入れ替えたり、並列に実行するようにしても良い。
【００５０】
なお、上で述べたシンボリック実行支援装置等は、コンピュータ装置であって、図２３に示すように、メモリ２５０１とプロセッサ（ＣＰＵ２５０３）とハードディスク・ドライブ（ＨＤＤ）２５０５と表示装置２５０９に接続される表示制御部２５０７とリムーバブル・ディスク２５１１用のドライブ装置２５１３と入力装置２５１５とネットワークに接続するための通信制御部２５１７とがバス２５１９で接続されている。オペレーティング・システム（ＯＳ：Operating System）及び本実施例における処理を実施するためのアプリケーション・プログラムは、ＨＤＤ２５０５に格納されており、ＣＰＵ２５０３により実行される際にはＨＤＤ２５０５からメモリ２５０１に読み出される。必要に応じてＣＰＵ２５０３は、表示制御部２５０７、通信制御部２５１７、ドライブ装置２５１３を制御して、必要な動作を行わせる。また、処理途中のデータについては、メモリ２５０１に格納され、必要があればＨＤＤ２５０５に格納される。本技術の実施例では、上で述べた処理を実施するためのアプリケーション・プログラムはコンピュータ読み取り可能なリムーバブル・ディスク２５１１に格納されて頒布され、ドライブ装置２５１３からＨＤＤ２５０５にインストールされる。インターネットなどのネットワーク及び通信制御部２５１７を経由して、ＨＤＤ２５０５にインストールされる場合もある。このようなコンピュータ装置は、上で述べたＣＰＵ２５０３、メモリ２５０１などのハードウエアとＯＳ及び必要なアプリケーション・プログラムとが有機的に協働することにより、上で述べたような各種機能を実現する。
【００５１】
以上述べた本実施の形態をまとめると、以下のようになる。
【００５２】
本シンボリック実行支援方法は、（Ａ）プログラムデータ格納部に格納されている分析対象のプログラムから、繰り返し制御変数を変化させて特定のケースを探索して当該特定のケースにおいて特定の処理を実施するというパターンに合致する繰り返しブロックを抽出するステップと、（Ｂ）分析対象のプログラムにおいて、抽出された繰り返しブロック及び当該繰り返しブロックの直後のブロックを、真の場合に特定の処理を実施し且つ偽の場合に直後のブロックの処理を実施し且つ当該真偽に関する述語関数を含む二分岐構造に置換する変換処理を実施し、変換処理後のプログラムを変換後プログラム格納部に格納する変換処理ステップと、（Ｃ）二分岐構造に含まれる述語関数について論理制約を生成し、パスコンディションデータ格納部に格納するステップと、（Ｄ）変換後プログラム格納部に格納された変換処理後のプログラムのシンボリック実行時に、パスコンディションデータ格納部に格納されている述語関数を処理していることを検出すると、当該述語関数に対応付けられている論理制約から、述語関数の出現位置におけるパスコンディションを生成してシンボリック実行部の管理データに追加登録するステップとを含む。
【００５３】
このような処理を実施することによって、無駄なパスコンディションを生成せずに適切に実行パスを把握することができるようになる。
【００５４】
また、上で述べた変換処理が、述語関数の宣言を分析対象のプログラムに追加する処理と、繰り返し制御変数で今回のケースを特定するためのカレントデータ設定文を、繰り返し制御変数を固定の値に設定したカレントデータ設定文に置換する処理とを含むようにしてもよい。正しい文法の下に、シンボリック実行を行うことができるようになる。
【００５５】
また、上で述べたパターンは、特定の処理において繰り返し制御変数を使用していないという条件を含むパターンである場合もある。繰り返し制御変数を使用している場合には、単純な二分岐構造とは異なる場合があるためである。
【００５６】
さらに、上で述べた変換処理ステップが、分析対象のプログラムから、繰り返し制御変数で今回のケースを特定するためのカレントデータ設定文と、抽出された繰り返しブロックに含まれる特定の処理のブロックと、抽出された繰り返しブロックの直後のブロックとを抽出し、対応付けて存在チェックテーブルに登録するステップと、存在チェックテーブルに対応付けられているデータで二分岐構造を生成するステップとを含むようにしてもよい。このようにすれば適切な二分岐構造を生成することができるようになる。
【００５７】
なお、上で述べたような処理をコンピュータに実施させるためのプログラムを作成することができ、当該プログラムは、例えばフレキシブル・ディスク、ＣＤ−ＲＯＭ、光磁気ディスク、半導体メモリ（例えばＲＯＭ）、ハードディスク等のコンピュータ読み取り可能な記憶媒体又は記憶装置に格納される。なお、処理途中のデータについては、ＲＡＭ等の記憶装置に一時保管される。
【００５８】
以上の実施例を含む実施形態に関し、さらに以下の付記を開示する。
【００５９】
（付記１）
プログラムデータ格納部に格納されている分析対象のプログラムから、繰り返し制御変数を変化させて特定のケースを探索して当該特定のケースにおいて特定の処理を実施するというパターンに合致する繰り返しブロックを抽出するステップと、
前記分析対象のプログラムにおいて、抽出された前記繰り返しブロック及び当該繰り返しブロックの直後のブロックを、真の場合に前記特定の処理を実施し且つ偽の場合に前記直後のブロックの処理を実施し且つ当該真偽に関する述語関数を含む二分岐構造に置換する変換処理を実施し、変換処理後のプログラムを変換後プログラム格納部に格納する変換処理ステップと、
前記二分岐構造に含まれる前記述語関数について論理制約を生成し、パスコンディションデータ格納部に格納するステップと、
前記変換後プログラム格納部に格納された前記変換処理後のプログラムのシンボリック実行時に、前記パスコンディションデータ格納部に格納されている前記述語関数を処理していることを検出すると、当該述語関数に対応付けられている論理制約から、前記述語関数の出現位置におけるパスコンディションを生成して前記シンボリック実行部の管理データに追加登録するステップと、
を、コンピュータに実行させるためのシンボリック実行支援プログラム。
【００６０】
（付記２）
前記変換処理が、
前記述語関数の宣言を前記分析対象のプログラムに追加する処理と、
前記繰り返し制御変数で今回のケースを特定するためのカレントデータ設定文を、前記繰り返し制御変数を固定の値に設定したカレントデータ設定文に置換する処理と、
を含む付記１記載のシンボリック実行支援プログラム。
【００６１】
（付記３）
前記パターンが、前記特定の処理において繰り返し制御変数を使用していないという条件を含むパターンである
付記１又は２記載のシンボリック実行支援プログラム。
【００６２】
（付記４）
前記変換処理ステップが、
前記分析対象のプログラムから、前記繰り返し制御変数で今回のケースを特定するためのカレントデータ設定文と、抽出された前記繰り返しブロックに含まれる前記特定の処理のブロックと、抽出された前記繰り返しブロックの直後のブロックとを抽出し、対応付けて存在チェックテーブルに登録するステップと、
前記存在チェックテーブルに対応付けられているデータで前記二分岐構造を生成するステップと、
を含む付記１乃至３のいずれか１つ記載のシンボリック実行支援プログラム。
【００６３】
（付記５）
プログラムデータ格納部に格納されている分析対象のプログラムから、繰り返し制御変数を変化させて特定のケースを探索して当該特定のケースにおいて特定の処理を実施するというパターンに合致する繰り返しブロックを抽出するステップと、
前記分析対象のプログラムにおいて、抽出された前記繰り返しブロック及び当該繰り返しブロックの直後のブロックを、真の場合に前記特定の処理を実施し且つ偽の場合に前記直後のブロックの処理を実施し且つ当該真偽に関する述語関数を含む二分岐構造に置換する変換処理を実施し、変換処理後のプログラムを変換後プログラム格納部に格納する変換処理ステップと、
前記二分岐構造に含まれる前記述語関数について論理制約を生成し、パスコンディションデータ格納部に格納するステップと、
前記変換後プログラム格納部に格納された前記変換処理後のプログラムのシンボリック実行時に、前記パスコンディションデータ格納部に格納されている前記述語関数を処理していることを検出すると、当該述語関数に対応付けられている論理制約から、前記述語関数の出現位置におけるパスコンディションを生成して前記シンボリック実行部の管理データに追加登録するステップと、
を含み、コンピュータに実行されるシンボリック実行支援方法。
【００６４】
（付記６）
プログラムデータ格納部に格納されている分析対象のプログラムから、繰り返し制御変数を変化させて特定のケースを探索して当該特定のケースにおいて特定の処理を実施するというパターンに合致する繰り返しブロックを抽出する処理対象特定部と、
前記分析対象のプログラムにおいて、抽出された前記繰り返しブロック及び当該繰り返しブロックの直後のブロックを、真の場合に前記特定の処理を実施し且つ偽の場合に前記直後のブロックの処理を実施し且つ当該真偽に関する述語関数を含む二分岐構造に置換する変換処理を実施し、変換処理後のプログラムを変換後プログラム格納部に格納する二分岐ブロック生成部と、
前記二分岐構造に含まれる前記述語関数について論理制約を生成し、パスコンディションデータ格納部に格納するパスコンディションテーブル生成部と、
前記変換後プログラム格納部に格納された前記変換処理後のプログラムのシンボリック実行時に、前記パスコンディションデータ格納部に格納されている前記述語関数を処理していることを検出すると、当該述語関数に対応付けられている論理制約から、前記述語関数の出現位置におけるパスコンディションを生成して前記シンボリック実行部の管理データに追加登録するパスコンディション動的追加部と、
を有するシンボリック実行支援装置。
【符号の説明】
【００６５】
１０１  入力部    １０２  入力データ格納部
１０３  処理対象特定部    １０４  チェックパターン格納部
１０５  存在チェックテーブル格納部    １０６  二分岐構造生成部
１０７  変換後プログラム格納部    
１０８  パスコンディションテーブル格納部
１０３１  ループ抽出部    １０３３  パターンチェック部
１０６１  ｉｆブロック生成部    
１０６３  パスコンディションテーブル生成部
１５１  パスコンディション動的追加部
２００  シンボリック実行部
【図１】
0005440287.tif 000002
【図２】
0005440287.tif 000003
【図３】
0005440287.tif 000004
【図４】
0005440287.tif 000005
【図５】
0005440287.tif 000006
【図６】
0005440287.tif 000007
【図７】
0005440287.tif 000008
【図８】
0005440287.tif 000009
【図９】
0005440287.tif 000010
【図１０】
0005440287.tif 000011
【図１１】
0005440287.tif 000012
【図１２】
0005440287.tif 000013
【図１３】
0005440287.tif 000014
【図１４】
0005440287.tif 000015
【図１５】
0005440287.tif 000016
【図１６】
0005440287.tif 000017
【図１７】
0005440287.tif 000018
【図１８】
0005440287.tif 000019
【図１９】
0005440287.tif 000020
【図２０】
0005440287.tif 000021
【図２１】
0005440287.tif 000022
【図２２】
0005440287.tif 000023
【図２３】
0005440287.tif 000024