(57)【特許請求の範囲】
【請求項１】
コンピュータが実行するプログラム分析方法であって、
第１のデータストアからデータを読み出す読み出し命令と、第２のデータストアにデータを書き込む書き込み命令とを含み、前記書き込み命令は前記読み出し命令の読み出し結果に依存するプログラムを取得し、
前記プログラムの実行パスを追跡し、前記実行パス中の前記読み出し命令の実行それぞれに対し、前記第１のデータストアからの何回目の読み出しであるかを示す第１のカウント値を付与し、また、前記実行パス中の前記書き込み命令の実行それぞれに対し、前記第２のデータストアへの何回目の書き込みであるかを示す第２のカウント値を付与し、
前記第１のカウント値および前記第２のカウント値を用いて、前記第２のデータストアへの複数回の書き込みそれぞれが前記第１のデータストアからの複数回の読み出しのうち何回目の読み出しの読み出し結果に依存するかを示す回数対応情報を生成し、
複数の処理の種類それぞれに対して読み出しと書き込みの間の依存パターンを示すパターン情報を参照して、前記回数対応情報から前記プログラムの処理の種類を判定する、
プログラム分析方法。
【請求項２】
前記プログラムの他の実行パスを更に追跡し、
前記回数対応情報は、前記実行パスにおける読み出しと書き込みの間の依存関係と、前記他の実行パスにおける読み出しと書き込みの間の依存関係とを合成して生成する、
請求項１記載のプログラム分析方法。
【請求項３】
前記実行パスの追跡では、前記読み出し命令により読み出されるデータを格納する第１の変数に、前記第１のカウント値を含むシンボルを割り当て、前記書き込み命令により書き込まれるデータを格納する第２の変数の値を、前記シンボルを含む式で表現し、
前記回数対応情報は、前記式と前記第２のカウント値を対応付けることで生成する、
請求項１記載のプログラム分析方法。
【請求項４】
前記パターン情報は、Ｎ回目（Ｎは１以上の整数）の書き込みがＮ回目の読み出しの読み出し結果に依存する第１の依存パターンと、前記Ｎ回目の書き込みが前記Ｎ回目の読み出しより後の読み出しの読み出し結果に依存することがある第２の依存パターンとを、前記複数の処理の種類のうちの異なる処理の種類に対応させる、
請求項１記載のプログラム分析方法。
【請求項５】
第１のデータストアからデータを読み出す読み出し命令と第２のデータストアにデータを書き込む書き込み命令とを含み、前記書き込み命令は前記読み出し命令の読み出し結果に依存するプログラムと、
複数の処理の種類それぞれに対して読み出しと書き込みの間の依存パターンを示すパターン情報とを記憶する記憶部と、
前記プログラムの実行パスを追跡し、前記実行パス中の前記読み出し命令の実行それぞれに対し、前記第１のデータストアからの何回目の読み出しであるかを示す第１のカウント値を付与し、また、前記実行パス中の前記書き込み命令の実行それぞれに対し、前記第２のデータストアへの何回目の書き込みであるかを示す第２のカウント値を付与し、
前記第１のカウント値および前記第２のカウント値を用いて、前記第２のデータストアへの複数回の書き込みそれぞれが前記第１のデータストアからの複数回の読み出しのうち何回目の読み出しの読み出し結果に依存するかを示す回数対応情報を生成し、
前記パターン情報を参照して、前記回数対応情報から前記プログラムの処理の種類を判定する演算部と、
を有するプログラム分析装置。
【請求項６】
コンピュータに、
第１のデータストアからデータを読み出す読み出し命令と、第２のデータストアにデータを書き込む書き込み命令とを含み、前記書き込み命令は前記読み出し命令の読み出し結果に依存するプログラムを取得し、
前記プログラムの実行パスを追跡し、前記実行パス中の前記読み出し命令の実行それぞれに対し、前記第１のデータストアからの何回目の読み出しであるかを示す第１のカウント値を付与し、また、前記実行パス中の前記書き込み命令の実行それぞれに対し、前記第２のデータストアへの何回目の書き込みであるかを示す第２のカウント値を付与し、
前記第１のカウント値および前記第２のカウント値を用いて、前記第２のデータストアへの複数回の書き込みそれぞれが前記第１のデータストアからの複数回の読み出しのうち何回目の読み出しの読み出し結果に依存するかを示す回数対応情報を生成し、
複数の処理の種類それぞれに対して読み出しと書き込みの間の依存パターンを示すパターン情報を参照して、前記回数対応情報から前記プログラムの処理の種類を判定する、
処理を実行させる分析プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はプログラム分析方法、プログラム分析装置および分析プログラムに関する。
【背景技術】
【０００２】
コンピュータに実行させるプログラムは、人間がその仕様や処理目的を理解しやすいように記載されているとは限らない。一方で、過去に作成されたプログラムを分析することによって、その仕様や処理目的を把握せざるを得ない場合がある。例えば、長期間運用された情報処理システムについては、設計当時の文書が十分に残っていないことがあり、その情報処理システムの内部構造に詳しい関係者が組織に不在であることもある。よって、既存の情報処理システムの保守や交換を行う際、その情報処理システムで使用されているプログラムを分析して仕様や処理目的を理解することがある。
【０００３】
プログラムの分析に関して、例えば、プログラムの理解を支援するコンポーネント分離システムが提案されている。提案のコンポーネント分離システムは、プログラムのデータフローを解析し、プログラムを入力処理コンポーネントと出力処理コンポーネントと業務処理コンポーネントとに分離する。入力処理コンポーネントはファイルからデータを読み出す処理を含み、出力処理コンポーネントはファイルにデータを書き込む処理を含む。
【０００４】
また、静的解析によってプログラムの入出力仕様を抽出するプログラム解析装置が提案されている。提案のプログラム解析装置は、プログラムから変数を抽出し、命令文を追跡することで変数の間の関連性を抽出する。プログラム解析装置は、ある命令文の前における関連性と当該命令文の後における関連性とを比較し、関連性の変化の情報を生成する。
【０００５】
また、バッチ処理プログラムの業務的意味の理解を支援するバッチ処理プログラム分析装置が提案されている。提案のバッチ処理プログラム分析装置は、バッチ処理プログラムの静的解析により、データを読み出す入力ファイルのファイル名とデータを書き込む出力ファイルのファイル名とを抽出し、入力ファイル数と出力ファイル数の比を算出する。バッチ処理プログラム分析装置は、入力ファイル数と出力ファイル数と業務処理パターン名とを対応付けた基本モデルを参照して、算出した比に応じた業務処理パターン名をバッチ処理プログラムに付与する。例えば、入力ファイル数と出力ファイル数が１：１である場合に業務処理パターン名が「抽出」と判定され、入力ファイル数と出力ファイル数が２：１である場合に業務処理パターン名が「更新」と判定される。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開平６−２３６２６１号公報
【特許文献２】特開平９−２６８９７号公報
【特許文献３】特開２０１２−６８９４６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
プログラムの記載のうち、ファイルなどのデータストアからデータを読み出す読み出し処理やデータストアにデータを書き込む書き込み処理に関する記載は、プログラムによって実現される処理の種類を判定する上で有用な情報となり得る。しかし、上記の特許文献３に記載された技術のように静的解析によって得られる情報だけでは、処理の種類を精度よく判定することが難しい場合があるという問題がある。
【０００８】
例えば、特許文献３に記載された技術では、入力ファイル数と出力ファイル数の比が特定の比になっているプログラムに対して、特定の業務処理パターン名が付与される。しかしながら、プログラムでは同じ入力ファイルからの読み出し処理が複数回行われることがあり、同じ出力ファイルへの書き込み処理が複数回行われることがある。入力ファイル数や出力ファイル数が同じプログラムであっても、複数回の読み出し処理と複数回の書き込み処理の態様が異なれば処理の種類が異なる可能性がある。
【０００９】
１つの側面では、本発明は、プログラムの処理の種類を判定する精度が向上するプログラム分析方法、プログラム分析装置および分析プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１０】
１つの態様では、コンピュータが実行するプログラム分析方法が提供される。第１のデータストアからデータを読み出す読み出し命令と、第２のデータストアにデータを書き込む書き込み命令とを含み、書き込み命令は読み出し命令の読み出し結果に依存するプログラムを取得する。プログラムの実行パスを追跡し、実行パス中の読み出し命令の実行それぞれに対し、第１のデータストアからの何回目の読み出しであるかを示す第１のカウント値を付与し、また、実行パス中の書き込み命令の実行それぞれに対し、第２のデータストアへの何回目の書き込みであるかを示す第２のカウント値を付与する。第１のカウント値および第２のカウント値を用いて、第２のデータストアへの複数回の書き込みそれぞれが第１のデータストアからの複数回の読み出しのうち何回目の読み出しの読み出し結果に依存するかを示す回数対応情報を生成する。複数の処理の種類それぞれに対して読み出しと書き込みの間の依存パターンを示すパターン情報を参照して、回数対応情報からプログラムの処理の種類を判定する。
【００１１】
また、１つの態様では、記憶部と演算部とを有するプログラム分析装置が提供される。また、１つの態様では、コンピュータに実行させる分析プログラムが提供される。
【発明の効果】
【００１２】
１つの側面では、プログラムの処理の種類を判定する精度が向上する。
【図面の簡単な説明】
【００１３】
【図１】第１の実施の形態のプログラム分析装置の例を示す図である。
【図２】プログラム分析装置のハードウェア例を示すブロック図である。
【図３】プログラムの第１の例を示す図である。
【図４】ロジックテーブルの第１の例を示す図である。
【図５】プログラムの第２の例を示す図である。
【図６】プログラムの第２の例を示す図（続き）である。
【図７】プログラムの第３の例を示す図である。
【図８】ファイルサイズテーブルと入出力回数テーブルの例を示す図である。
【図９】入出力変数へのシンボルの割り当て例を示す図である。
【図１０】ロジックテーブルの第２の例を示す図である。
【図１１】ロジックテーブルの第３の例を示す図である。
【図１２】入出力式テーブルの例を示す図である。
【図１３】一般化入出力式テーブルの例を示す図である。
【図１４】入出力式一般化の他の例を示す図である。
【図１５】判定ルールテーブルの例を示す図である。
【図１６】判定結果テーブルの例を示す図である。
【図１７】処理種類判定の他の例を示す図である。
【図１８】分析結果画面の表示例を示す図である。
【図１９】プログラム分析装置の機能例を示すブロック図である。
【図２０】プログラム分析の手順例を示すフローチャートである。
【図２１】シンボリック実行の手順例を示すフローチャートである。
【図２２】シンボリック実行の手順例を示すフローチャート（続き）である。
【図２３】入出力値割り当ての手順例を示すフローチャートである。
【図２４】入出力式一般化の手順例を示すフローチャートである。
【発明を実施するための形態】
【００１４】
以下、本実施の形態を図面を参照して説明する。
［第１の実施の形態］
第１の実施の形態を説明する。
【００１５】
図１は、第１の実施の形態のプログラム分析装置の例を示す図である。
第１の実施の形態のプログラム分析装置１０は、プログラムの入出力処理を分析し、入出力処理のパターンからそのプログラムによって行われる処理の種類を判定する。分析対象のプログラムは、プログラミング言語で記述されたソースコードでもよいし、実行可能なオブジェクトコードなどソースコード以外のものでもよい。例えば、プログラム分析装置１０は、既存の情報処理システムの仕様を理解することを目的として、過去に作成されたプログラムの処理の種類を判定するときに用いることができる。プログラム分析装置１０は、クライアントコンピュータでもよいしサーバコンピュータでもよい。
【００１６】
プログラム分析装置１０は、記憶部１１および演算部１２を有する。記憶部１１は、分析対象のプログラム２０およびパターン情報１３を記憶する。記憶部１１は、ＲＡＭ（Random Access Memory）などの揮発性の半導体メモリでもよいし、ＨＤＤ（Hard Disk Drive）やフラッシュメモリなどの不揮発性の記憶装置でもよい。
【００１７】
演算部１２は、記憶部１１に記憶されたプログラム２０を分析し、プログラム２０の処理の種類を判定する。演算部１２は、ＣＰＵ（Central Processing Unit）やＤＳＰ（Digital Signal Processor）などのプロセッサでもよい。また、演算部１２は、ＡＳＩＣ（Application Specific Integrated Circuit）やＦＰＧＡ（Field Programmable Gate Array）などの特定用途の電子回路を含んでもよい。プロセッサは、ＲＡＭなどのメモリ（記憶部１１でもよい）に記憶されたプログラムを実行する。プロセッサが実行するプログラムには、以下に説明する処理を記載した分析プログラムが含まれる。複数のプロセッサの集合を、「マルチプロセッサ」または単に「プロセッサ」と言うこともある。
【００１８】
プログラム２０は、データストア（第１のデータストア）からデータを読み出す読み出し命令２１を含む。また、プログラム２０は、データストア（第２のデータストア）にデータを書き込む書き込み命令２２を含む。データストアは、例えば、プログラム２０が管理するメモリ領域の外にデータを保持する場所である。データストアは、不揮発性の記憶装置上のファイル、データベース、プログラム間で受け渡されるデータを格納するキュー、ネットワーク経由で送信されるデータを格納する通信バッファなどであってもよい。読み出し命令２１の実行は、プログラム２０の外部からのデータの取得である入力処理に相当すると言える。書き込み命令２２の実行は、プログラム２０の外部へのデータの出力である出力処理に相当すると言える。通常、第１のデータストアと第２のデータストアは、異なるデータストア（例えば、異なるファイル）である。
【００１９】
プログラム２０では、書き込み命令２２は読み出し命令２１の読み出し結果に依存する。例えば、読み出し命令２１により第１のデータストアから読み出されたデータ自体または読み出されたデータを用いて算出されたデータが、書き込み命令２２により第２のデータストアに書き込まれる。プログラム２０では、１つの実行パスの中で、読み出し命令２１が複数回実行されるなどにより第１のデータストアからのデータの読み出しが複数回行われることがある。また、プログラム２０では、１つの実行パスの中で、書き込み命令２２が複数回実行されるなどにより第２のデータストアへのデータの書き込みが複数回行われることがある。ただし、読み出しと書き込みとが１対１に対応するとは限らない。読み出したデータが所定の条件を満たす場合のみ書き込みが行われることもある。
【００２０】
パターン情報１３は、複数の処理の種類と複数の依存パターンとを対応付けた情報である。複数の処理の種類それぞれには、例えば、「複写」や「抽出」など人間がその処理の種類を理解しやすいような名称が付されている。複数の依存パターンそれぞれは、読み出しと書き込みの間の依存関係の類型である。複数の依存パターンの中に、１回の読み出しにつき１回の書き込みが行われるという依存パターンが含まれてもよい。また、複数の依存パターンの中に、１回または２回以上の読み出しにつき１回の書き込みが行われるという依存パターンが含まれてもよい。パターン情報１３は、分析前に用意されている。
【００２１】
演算部１２は、プログラム２０の実行パスを追跡する。実行パスは、プログラム２０をその記載に従って実行した場合に通過する命令の列であり、プログラム２０の記載を静的に分析する静的分析によって得られる情報とは異なる。演算部１２は、例えば、シンボリック実行（記号実行）の技術を利用して実行パスを追跡する。シンボリック実行では、演算部１２は、プログラム２０への入力値を格納する変数に、具体的な数値や具体的な文字に代えて定数を示す抽象的なシンボル（記号値）を割り当てる。プログラム２０で更新される変数の値は、シンボルを含む式として表されることがある。シンボルを用いてプログラム２０の命令を擬似的に実行することで、具体的な値を次々に入力してプログラム２０を繰り返し実行する場合よりも、プログラム２０の実行パスを効率的に追跡できる。
【００２２】
演算部１２は、実行パスの追跡において、実行パス中の読み出し命令２１の実行それぞれに対し、第１のデータストアからの何回目の読み出しであるかを示すカウント値（第１のカウント値）を付与する。また、演算部１２は、実行パスの追跡において、実行パス中の書き込み命令２２の実行それぞれに対し、第２のデータストアへの何回目の書き込みであるかを示すカウント値（第２のカウント値）を付与する。
【００２３】
一例として、第１の実行パスを考える。第１の実行パスでは、先頭から終点に向かって次のような順序で命令が実行されるとする。まず、読み出し命令２１の実行が検出されると、１回目の読み出しであることを示す第１のカウント値２３ａが付与される。次に、書き込み命令２２の実行が検出されると、１回目の書き込みであることを示す第２のカウント値２４ａが付与される。次に、読み出し命令２１の実行が検出されると、２回目の読み出しであることを示す第１のカウント値２３ｂが付与される。次に、書き込み命令２２の実行が検出されると、２回目の書き込みであることを示す第２のカウント値２４ｂが付与される。次に、読み出し命令２１の実行が検出されると、３回目の読み出しであることを示す第１のカウント値２３ｃが付与される。次に、書き込み命令２２の実行が検出されると、３回目の書き込みであることを示す第２のカウント値２４ｃが付与される。
【００２４】
また、一例として、第２の実行パスを考える。第２の実行パスでは、先頭から終点に向かって次のような順序で命令が実行されるとする。まず、読み出し命令２１の実行が検出されると、１回目の読み出しであることを示す第１のカウント値２５ａが付与される。次に、読み出し命令２１の実行が検出されると、２回目の読み出しであることを示す第１のカウント値２５ｂが付与される。次に、書き込み命令２２の実行が検出されると、１回目の書き込みであることを示す第２のカウント値２６ａが付与される。次に、読み出し命令２１の実行が検出されると、３回目の読み出しであることを示す第１のカウント値２５ｃが付与される。次に、読み出し命令２１の実行が検出されると、４回目の読み出しであることを示す第１のカウント値２５ｄが付与される。次に、書き込み命令２２の実行が検出されると、２回目の書き込みであることを示す第２のカウント値２６ｂが付与される。
【００２５】
演算部１２は、第１のカウント値および第２のカウント値を用いて、回数対応情報を生成する。回数対応情報は、第２のデータストアへの複数回の書き込みそれぞれが、第１のデータストアからの複数回の読み出しのうち何回目の読み出しの読み出し結果に依存しているかを示す。例えば、演算部１２は、ある第１のカウント値を付与した読み出しの読み出し結果が何れの書き込みに使用されているかを、実行パスを追跡することで特定する。そして、演算部１２は、当該第１のカウント値と特定した書き込みに付与された第２のカウント値とを対応付けることで、回数対応情報を生成する。
【００２６】
シンボリック実行の技術を利用する場合、演算部１２は、第１のカウント値を含むシンボルを、読み出し命令２１によって読み出されるデータを格納する読み出し変数に割り当ててもよい。その場合、書き込み命令２２によって書き込まれるデータを格納する書き込み変数の値が、上記シンボルを含む式で表現されることがある。これにより、式の中のシンボルに含まれる第１のカウント値と、その書き込み変数の値を使用する書き込みに対して付与された第２のカウント値とを対応付けることができる。
【００２７】
例えば、上記の第１の実行パスの例について、演算部１２は回数対応情報１４を生成する。回数対応情報１４は、第２のカウント値２４ａが第１のカウント値２３ａに対応し、第２のカウント値２４ｂが第１のカウント値２３ｂに対応し、第２のカウント値２４ｃが第１のカウント値２３ｃに対応することを示す。これは、１回目の書き込みが１回目の読み出しの読み出し結果に依存し、２回目の書き込みが２回目の読み出しの読み出し結果に依存し、３回目の書き込みが３回目の読み出しの読み出し結果に依存することを示す。
【００２８】
また、例えば、上記の第２の実行パスの例について、演算部１２は回数対応情報１５を生成する。回数対応情報１５は、第２のカウント値２６ａが第１のカウント値２５ｂに対応し、第２のカウント値２６ｂが第１のカウント値２５ｄに対応することを示す。これは、１回目の書き込みが２回目の読み出しの読み出し結果に依存し、２回目の書き込みが４回目の読み出しの読み出し結果に依存することを示す。
【００２９】
そして、演算部１２は、パターン情報１３を参照して、生成した回数対応情報からプログラム２０の処理の種類を判定する。例えば、演算部１２は、パターン情報１３に記載された複数の依存パターンの中から、生成した回数対応情報が該当する依存パターンを選択し、選択した依存パターンに対応付けられた処理の種類を選択する。複数の依存パターンのうちの２以上の依存パターンに、生成した回数対応情報が該当してもよい。その場合、該当する２以上の依存パターンに対応する２以上の処理の種類が選択される。
【００３０】
例えば、演算部１２は、回数対応情報１４から処理の種類１６を選択する。回数対応情報１４は、Ｎ回目（Ｎは１以上の整数）の書き込みがＮ回目の読み出しに依存すること、すなわち、１回の読み出しにつき１回の書き込みが行われることを示している。そこで、例えば、処理の種類１６として「複写」が選択される。また、演算部１２は、回数対応情報１５から処理の種類１７を選択する。回数対応情報１５は、Ｎ回目の書き込みがＮ回目の読み出しより後の読み出しに依存することがあること、すなわち、２回以上の読み出しにつき１回の書き込みが行われることがあることを示している。そこで、例えば、処理の種類１７として「抽出」が選択される。
【００３１】
プログラム分析装置１０は、判定した処理の種類を示す情報を任意の方法で出力することができる。例えば、プログラム分析装置１０は、処理の種類を示す情報を、プログラム分析装置１０が備えるディスプレイやプリンタなどの出力デバイスに出力してもよい。また、プログラム分析装置１０は、処理の種類を示す情報を、プログラム分析装置１０が備えるメモリまたは不揮発性の記憶装置に保存してもよい。また、プログラム分析装置１０は、処理の種類を示す情報を、他の装置に送信してもよい。
【００３２】
第１の実施の形態のプログラム分析装置１０によれば、プログラム２０の実行パスが追跡され、読み出し命令２１の実行それぞれに対して第１のカウント値が付与され、書き込み命令２２の実行それぞれに対して第２のカウント値が付与される。第１のカウント値と第２のカウント値を用いて、複数回の書き込みそれぞれが複数回の読み出しのうち何回目の読み出しの読み出し結果に依存するかを示す回数対応情報が生成される。そして、パターン情報１３を参照して、回数対応情報からプログラム２０の処理の種類が判定される。
【００３３】
これにより、使用するデータストアの数などプログラム２０の静的解析によって得られる情報のみからプログラム２０の処理の種類を判定する場合よりも、入出力処理を詳細に分析でき、処理の種類を高い精度で判定することができる。例えば、データの読み出しとデータの書き込みとを１対１に行うプログラムと、複数回のデータの読み出しにつき１回のデータの書き込みが発生するプログラムとを区別することができる。よって、プログラム２０の仕様や処理目的などの理解が容易となる。
【００３４】
［第２の実施の形態］
次に、第２の実施の形態を説明する。
第２の実施の形態のプログラム分析装置１００は、シンボリック実行によってプログラムの入出力処理を分析し、当該プログラムの処理種類を判定する。
【００３５】
図２は、プログラム分析装置のハードウェア例を示すブロック図である。
プログラム分析装置１００は、プロセッサ１０１、ＲＡＭ１０２、ＨＤＤ１０３、画像信号処理部１０４、入力信号処理部１０５、媒体リーダ１０６および通信インタフェース１０７を有する。プログラム分析装置１００の上記ユニットは、バス１０８に接続されている。なお、プログラム分析装置１００は、第１の実施の形態のプログラム分析装置１０に対応する。プロセッサ１０１は、第１の実施の形態の演算部１２に対応する。ＲＡＭ１０２またはＨＤＤ１０３は、第１の実施の形態の記憶部１１に対応する。
【００３６】
プロセッサ１０１は、プログラムの命令を実行する演算回路を含むプロセッサである。プロセッサ１０１は、例えば、ＣＰＵである。プロセッサ１０１は、ＨＤＤ１０３に記憶されたプログラムおよびデータの少なくとも一部をＲＡＭ１０２にロードし、ロードされたプログラムを実行する。なお、プロセッサ１０１が複数のプロセッサコアを備えてもよいし、プログラム分析装置１００が複数のプロセッサを備えてもよい。以下で説明する処理を、複数のプロセッサまたはプロセッサコアを用いて並列に実行してもよい。
【００３７】
ＲＡＭ１０２は、プロセッサ１０１が実行するプログラムや演算に用いるデータを一時的に記憶する揮発性の半導体メモリである。なお、プログラム分析装置１００は、ＲＡＭ以外の種類のメモリを備えてもよいし、複数個のメモリを備えてもよい。
【００３８】
ＨＤＤ１０３は、ＯＳ（Operating System）やミドルウェアやアプリケーションソフトウェアなどのソフトウェアのプログラム、および、データを記憶する不揮発性の記憶装置である。プログラムには、分析プログラムが含まれる。なお、プログラム分析装置１００は、フラッシュメモリやＳＳＤ（Solid State Drive）などの他の種類の記憶装置を備えてもよいし、複数の不揮発性の記憶装置を備えてもよい。
【００３９】
画像信号処理部１０４は、プロセッサ１０１からの命令に従って、プログラム分析装置１００に接続されたディスプレイ１１１に画像を出力する。ディスプレイ１１１としては、ＣＲＴ（Cathode Ray Tube）ディスプレイ、液晶ディスプレイ（ＬＣＤ：Liquid Crystal Display）、プラズマディスプレイ、有機ＥＬ（ＯＥＬ：Organic Electro-Luminescence）ディスプレイなど、任意の種類のディスプレイを用いることができる。
【００４０】
入力信号処理部１０５は、プログラム分析装置１００に接続された入力デバイス１１２から入力信号を取得し、プロセッサ１０１に出力する。入力デバイス１１２としては、マウスやタッチパネルやタッチパッドやトラックボールなどのポインティングデバイス、キーボード、リモートコントローラ、ボタンスイッチなどを用いることができる。また、プログラム分析装置１００に、複数の種類の入力デバイスが接続されていてもよい。
【００４１】
媒体リーダ１０６は、記録媒体１１３に記録されたプログラムやデータを読み取る読み取り装置である。記録媒体１１３として、例えば、磁気ディスク、光ディスク、光磁気ディスク（ＭＯ：Magneto-Optical disk）、半導体メモリなどを使用できる。磁気ディスクには、フレキシブルディスク（ＦＤ：Flexible Disk）やＨＤＤが含まれる。光ディスクには、ＣＤ（Compact Disc）やＤＶＤ（Digital Versatile Disc）が含まれる。
【００４２】
媒体リーダ１０６は、例えば、記録媒体１１３から読み取ったプログラムやデータを、ＲＡＭ１０２やＨＤＤ１０３などの他の記録媒体にコピーする。読み取られたプログラムは、例えば、プロセッサ１０１によって実行される。なお、記録媒体１１３は、可搬型記録媒体であってもよく、プログラムやデータの配布に用いられることがある。また、記録媒体１１３やＨＤＤ１０３を、コンピュータ読み取り可能な記録媒体と言うことがある。
【００４３】
通信インタフェース１０７は、ネットワーク１１４に接続され、ネットワーク１１４を介して他の装置と通信を行うインタフェースである。通信インタフェース１０７は、スイッチなどの通信装置とケーブルで接続される有線通信インタフェースでもよいし、基地局と無線リンクで接続される無線通信インタフェースでもよい。
【００４４】
次に、シンボリック実行によるプログラムの分析について説明する。
シンボリック実行では、プログラムへの入力値を格納する変数に、具体的な値に代えて定数を示す抽象的なシンボル（記号値）を割り当てる。プログラムに含まれる命令文が、シンボルを用いて擬似的に実行される。プログラムにおいて更新される変数の値は、シンボルを含む式として表されることがある。プログラムの記載に従って実行パスを追跡するため、シンボリック実行はプログラムの静的解析とは異なる。
【００４５】
プログラムに条件分岐文が含まれている場合、シンボルは任意の定数を表すため、分岐方向を１つに絞り込めないことがある。具体的な値によって分岐条件の判定がＹＥＳになることもＮＯになることもある場合、その条件分岐文を分割点として実行パスを分割する。すなわち、その分岐条件の判定がＹＥＳになる場合の実行パスと、その分岐条件の判定がＮＯになる場合の実行パスの両方が存在するものとして取り扱う。
【００４６】
図３は、プログラムの第１の例を示す図である。
プログラム１４１は、分析対象のプログラムの一例である。プログラム１４１は、変数「性別」の値として２文字の文字列を受け取り、２つのメッセージを表示する。プログラム１４１は、１３行目に１つ目の条件分岐文を含み、１９行目に２つ目の条件分岐文を含む。１３行目の条件分岐文では、変数「性別」の値が「男性」であるか判定される。変数「性別」の値が「男性」である場合にはメッセージ「男性である」が表示され、そうでない場合にはメッセージ「男性でない」が表示される。また、１９行目の条件分岐文では、変数「性別」の値が「女性」であるか判定される。変数「性別」の値が「女性」である場合にはメッセージ「女性である」が表示され、そうでない場合にはメッセージ「女性でない」が表示される。そして、プログラム１４１が終了する。
【００４７】
プログラム１４１には３つの実行パスが存在する。変数「性別」の値に応じて、これら３つの実行パスのうちの何れか１つが実行される。変数「性別」の値が「男性」である場合、１３行目の分岐条件はＹＥＳと判定され、１９行目の分岐条件はＮＯと判定される。この実行パスでは、表示されるメッセージは「男性である」と「女性でない」になる。変数「性別」の値が「女性」である場合、１３行目の分岐条件はＮＯと判定され、１９行目の分岐条件はＹＥＳと判定される。この実行パスでは表示されるメッセージは「男性でない」と「女性である」になる。変数「性別」の値が「男性」でも「女性」でもない場合、１３行目の分岐条件と１９行目の分岐条件の両方がＮＯと判定される。この実行パスでは、表示されるメッセージは「男性でない」と「女性でない」になる。
【００４８】
プログラム１４１は直列の２つの条件分岐文を含むため、分岐条件の内容を無視すれば、実行パスの候補は４つ存在する。しかし、変数「性別」の値が「男性」であることと変数「性別」の値が「女性」であることは矛盾するため、１３行目の分岐条件と１９行目の分岐条件の両方がＹＥＳと判定されることはない。よって、４つの実行パスの候補のうち、実行される可能性のある有効な実行パスは３つである。
【００４９】
条件分岐文において、ある分岐方向（ＹＥＳ方向またはＮＯ方向）に進むための条件を満たす変数の値が少なくとも１つ存在するとき、その分岐方向は「充足可能である」と言うことがある。一方、ある分岐方向に進むための条件を満たす変数の値が存在しないとき、その分岐方向は「充足可能でない」と言うことがある。
【００５０】
プログラム１４１において、１３行目の条件分岐文では変数「性別」の値は制約されていないため、２つの分岐方向は共に充足可能である。一方、１９行目の条件分岐文における充足可能性は、１３行目の条件分岐文で選択した分岐方向に依存する。１３行目のＹＥＳ方向を選択した場合、１９行目のＹＥＳ方向は充足可能でなくなりＮＯ方向のみ充足可能となる。１３行目のＮＯ方向を選択した場合、１９行目の２つの分岐方向は共に充足可能である。よって、有効な実行パスは３つであると判断できる。
【００５１】
ここで、プログラム１４１をシンボリック実行する例を説明する。プログラム分析装置１００は、プログラム１４１に対する入力を示す変数「性別」に、具体的な文字ではなく任意の定数を示す抽象的なシンボル（記号値）を割り当てる。ここでは、変数名と同じ「性別」をシンボルとして用いる。プログラム分析装置１００は、シンボルを用いてプログラム１４１の命令を擬似的に実行していく。
【００５２】
プログラム１４１の始点から１３行目の条件分岐文の前までは、実行パスの分岐は存在しない。１３行目の条件分岐文について、この時点ではその実行パスが選択される条件（パス条件）は存在せず、２つの分岐方向は共に充足可能である。よって、プログラム分析装置１００は、１３行目の条件分岐文において実行パスを分割し、一方の実行パスを選択する。ここでは、プログラム分析装置１００はＹＥＳ方向の実行パスを選択したとする。
【００５３】
次に、１９行目の条件分岐文について、この時点におけるパス条件はシンボル「性別」が「男性」であることであるため、ＹＥＳ方向は充足可能でなくＮＯ方向は充足可能である。よって、プログラム分析装置１００はＮＯ方向を選択する。その後、この１番目の実行パスは終了する。プログラム分析装置１００は、１番目の実行パスのパス条件を、シンボル「性別」が「男性」でありかつシンボル「性別」が「女性」でないと判定する。また、プログラム分析装置１００は、１番目の実行パスの処理結果（パス出力）を、メッセージ＝「男性である」および「女性でない」と判定する。
【００５４】
１番目の実行パスが終了すると、プログラム分析装置１００は、実行パスの直近の分割点まで戻り、未選択の実行パスを選択する。ここでは、プログラム分析装置１００は、１３行目の条件分岐文まで戻ってＮＯ方向の実行パスを選択する。
【００５５】
１９行目の条件分岐文について、この時点におけるパス条件はシンボル「性別」が「男性」でないことであるため、ＹＥＳ方向とＮＯ方向の何れも充足可能である。よって、プログラム分析装置１００は、１９行目の条件分岐文において実行パスを更に分割し、一方の実行パスを選択する。ここでは、プログラム分析装置１００はＹＥＳ方向の実行パスを選択したとする。その後、この２番目の実行パスは終了する。プログラム分析装置１００は、２番目の実行パスのパス条件を、シンボル「性別」が「男性」でなくかつシンボル「性別」が「女性」であると判定する。また、プログラム分析装置１００は、２番目の実行パスのパス出力を、メッセージ＝「男性でない」および「女性である」と判定する。
【００５６】
２番目の実行パスが終了すると、プログラム分析装置１００は、１９行目の条件分岐文まで戻ってＮＯ方向の実行パスを選択する。その後、この３番目の実行パスは終了する。プログラム分析装置１００は、３番目の実行パスのパス条件を、シンボル「性別」が「男性」でなくかつシンボル「性別」が「女性」でないと判定する。また、プログラム分析装置１００は、３番目の実行パスのパス出力を、メッセージ＝「男性でない」および「女性でない」と判定する。未選択の実行パスが存在しないためシンボリック実行が終了する。
【００５７】
なお、プログラム分析装置１００は、実行パスの分割点において、その時点のパス条件や各変数の値などを保存しておく。プログラム分析装置１００は、１つの実行パスが終了して分割点までバックトラックしたとき、保存しておいたパス条件や各変数の値などを引き継いで、未選択の分岐方向に対応する他の実行パスの探索を続ける。
【００５８】
図４は、ロジックテーブルの第１の例を示す図である。
プログラム分析装置１００は、プログラム１４１のシンボリック実行の結果として、ロジックテーブル１４２を生成する。プログラム分析装置１００は、生成したロジックテーブル１４２を、プログラム分析装置１００が備えるディスプレイに表示する。
【００５９】
ロジックテーブル１４２は、プログラム１４１に対する入力とプログラム１４１からの出力との関係（ロジック）を示す。ロジックテーブル１４２は、パス番号、パス条件およびパス出力の項目を有する。パス番号の項目には、シンボリック実行によって検出された実行パスの識別番号が記載される。パス条件の項目には、実行パスが選択されるための入力の条件が記載される。パス出力の項目には、実行パスによる出力が記載される。パス条件およびパス出力は、シンボルを用いて表されることがある。
【００６０】
前述のように、１番目の実行パスのパス条件は、「性別が男性である」かつ「性別が女性でない」ことである。これは、「性別が男性である」と簡約化できる。１番目の実行パスのパス出力は、メッセージ「男性である」および「女性でない」である。２番目の実行パスのパス条件は、「性別が男性でない」かつ「性別が女性である」ことである。これは、「性別が女性である」と簡約化できる。２番目の実行パスのパス出力は、メッセージ「男性でない」および「女性である」である。３番目の実行パスのパス条件は、「性別が男性でない」かつ「性別が女性でない」ことである。３番目の実行パスのパス出力は、メッセージ「男性でない」および「女性でない」である。
【００６１】
なお、条件分岐文における充足可能性の判断やパス条件の簡約化には、数式処理技術を利用することができる。プログラム分析装置１００は、ＳＭＴ（Satisfiability Modulo Theories）ソルバやＳＡＴ（Satisfiability）ソルバを用いてもよい。パス条件は、例えば、シンボルを含む式をシンボルについて解くことで簡約化できる。
【００６２】
次に、ファイル入力およびファイル出力を行うプログラムについて説明する。
図５は、プログラムの第２の例を示す図である。
プログラム１２１は、プログラム１４１とは異なる分析対象のプログラムの例である。プログラム１２１は、手続きを記載したモジュールとして、ＣＮＴＬ−ＳＥＣセクションおよびＩＮＩＴ−ＳＥＣセクションを含む。また、プログラム１２１は、後述するように、ＲＥＡＤ−ＳＥＣセクション、ＭＡＩＮ−ＳＥＣセクション、ＥＤＩＴ−ＳＥＣセクション、ＷＲＩＴＥ−ＳＥＣセクションおよびＦＩＮ−ＳＥＣセクションを含む。
【００６３】
ＣＮＴＬ−ＳＥＣセクションは、プログラム１２１が開始されると、まずＩＮＩＴ−ＳＥＣセクションを呼び出し、次にＲＥＡＤ−ＳＥＣセクションを呼び出す。ＣＮＴＬ−ＳＥＣセクションは、変数「ＥＮＤ−ＦＬＧ」の値が「ＥＮＤ」になるまでＭＡＩＮ−ＳＥＣセクションを繰り返し呼び出す。最後に、ＣＮＴＬ−ＳＥＣセクションは、ＦＩＮ−ＳＥＣセクションを呼び出してプログラム１２１を終了させる。
【００６４】
ＩＮＩＴ−ＳＥＣセクションは、補助記憶装置に記憶されたファイル「ＩＮ−ＦＩＬＥ」とファイル「ＯＵＴ−ＦＩＬＥ」を開く。また、ＩＮＩＴ−ＳＥＣセクションは、比較値として「１２３４５６７８」を設定する。
【００６５】
図６は、プログラムの第２の例を示す図（続き）である。
ＲＥＡＤ−ＳＥＣセクションは、ファイル「ＩＮ−ＦＩＬＥ」から１行のデータを読み出す。読み出すデータがある場合、すなわち、ファイルポインタがファイルの末尾にまだ到達しておらず戻り値がＥＯＦ（End of File）でない場合、読み出したデータは長さ８文字の変数「ＩＮ−ＤＡＴＡ１」に格納される。読み出すデータがない場合、すなわち、ファイルポインタが既にファイルの末尾に到達しており戻り値がＥＯＦである場合、変数「ＥＮＤ−ＦＬＧ」の値が「ＥＮＤ」に更新される。
【００６６】
ＭＡＩＮ−ＳＥＣセクションは、ＥＤＩＴ−ＳＥＣセクションを呼び出し、次にＷＲＩＴＥ−ＳＥＣセクションを呼び出し、最後にＲＥＡＤ−ＳＥＣセクションを呼び出す。
ＥＤＩＴ−ＳＥＣセクションは、変数「ＯＵＴ−ＤＡＴＡ１」の値を空白に更新する。次に、ＥＤＩＴ−ＳＥＣセクションは、変数「ＩＮ−ＤＡＴＡ１」の値が、ＩＮＩＴ−ＳＥＣセクションにより設定された比較値と一致するか判断する。変数「ＩＮ−ＤＡＴＡ１」の値が比較値と一致する場合、ＥＤＩＴ−ＳＥＣセクションは、変数「ＯＵＴ−ＤＡＴＡ１」の値を変数「ＩＮ−ＤＡＴＡ１」の値に更新する。変数「ＩＮ−ＤＡＴＡ１」の値が比較値と一致しない場合、変数「ＯＵＴ−ＤＡＴＡ１」の値は更新されない。
【００６７】
ＷＲＩＴＥ−ＳＥＣセクションは、変数「ＯＵＴ−ＤＡＴＡ１」の値をファイル「ＯＵＴ−ＦＩＬＥ」の末尾に追記する。ＦＩＮ−ＳＥＣセクションは、ファイル「ＩＮ−ＦＩＬＥ」とファイル「ＯＵＴ−ＦＩＬＥ」を閉じる。
【００６８】
このプログラム１２１によれば、ファイル「ＩＮ−ＦＩＬＥ」から１行のデータが読み出され、読み出されたデータが比較値と一致すれば、読み出されたデータをファイル「ＯＵＴ−ＦＩＬＥ」に書き込む。一方、読み出されたデータが比較値と一致しなければ、読み出されたデータに代えて空白をファイル「ＯＵＴ−ＦＩＬＥ」に書き込む。この入出力処理が、ファイル「ＩＮ−ＦＩＬＥ」の行数だけ繰り返される。ファイル「ＩＮ−ＦＩＬＥ」にＮ行のデータが含まれる場合、ファイル「ＯＵＴ−ＦＩＬＥ」にＮ行のデータが書き込まれる。すなわち、ファイル「ＩＮ−ＦＩＬＥ」からのデータの読み出しとファイル「ＯＵＴ−ＦＩＬＥ」へのデータの書き込みとは１対１に対応する。
【００６９】
図７は、プログラムの第３の例を示す図である。
プログラム１２１ａは、プログラム１２１と異なる分析対象のプログラムの例である。プログラム１２１ａは、プログラム１２１と類似する。ただし、プログラム１２１ａは、５７行目、５９行目、６９行目および７２行目がプログラム１２１と異なる。
【００７０】
プログラム１２１ａのＭＡＩＮ−ＳＥＣセクションは、まずＥＤＩＴ−ＳＥＣセクションを呼び出す。次に、ＭＡＩＮ−ＳＥＣセクションは、変数「ＷＲＩＴＥ−ＦＬＧ」の値が「ＯＮ」であるか判断する。変数「ＷＲＩＴＥ−ＦＬＧ」の値が「ＯＮ」である場合、ＭＡＩＮ−ＳＥＣセクションはＷＲＩＴＥ−ＳＥＣセクションを呼び出す。変数「ＷＲＩＴＥ−ＦＬＧ」の値が「ＯＮ」でない場合、ＷＲＩＴＥ−ＳＥＣセクションは呼び出されない。最後に、ＭＡＩＮ−ＳＥＣセクションはＲＥＡＤ−ＳＥＣセクションを呼び出す。
【００７１】
プログラム１２１ａのＥＤＩＴ−ＳＥＣセクションは、変数「ＯＵＴ−ＤＡＴＡ１」の値を空白に更新する。また、ＥＤＩＴ−ＳＥＣセクションは、変数「ＷＲＩＴＥ−ＦＬＧ」の値を空白に更新する。次に、ＥＤＩＴ−ＳＥＣセクションは、変数「ＩＮ−ＤＡＴＡ１」の値が、ＩＮＩＴ−ＳＥＣセクションにより設定された比較値と一致するか判断する。変数「ＩＮ−ＤＡＴＡ１」の値が比較値と一致する場合、ＥＤＩＴ−ＳＥＣセクションは、変数「ＯＵＴ−ＤＡＴＡ１」の値を変数「ＩＮ−ＤＡＴＡ１」の値に更新すると共に、変数「ＷＲＩＴＥ−ＦＬＧ」の値を「ＯＮ」に更新する。変数「ＩＮ−ＤＡＴＡ１」の値が比較値と一致しない場合、変数「ＯＵＴ−ＤＡＴＡ１」の値は更新されず、変数「ＷＲＩＴＥ−ＦＬＧ」の値も更新されない。
【００７２】
このプログラム１２１ａによれば、ファイル「ＩＮ−ＦＩＬＥ」から１行のデータが読み出され、読み出されたデータが比較値と一致すれば、読み出されたデータをファイル「ＯＵＴ−ＦＩＬＥ」に書き込む。一方、読み出されたデータが比較値と一致しなければ、ファイル「ＯＵＴ−ＦＩＬＥ」にデータは書き込まれない。この入出力処理が、ファイル「ＩＮ−ＦＩＬＥ」の行数だけ繰り返される。ファイル「ＩＮ−ＦＩＬＥ」にＮ行のデータが含まれる場合、ファイル「ＯＵＴ−ＦＩＬＥ」に書き込まれるデータはＮ行以下である。すなわち、ファイル「ＩＮ−ＦＩＬＥ」からのデータの読み出しとファイル「ＯＵＴ−ＦＩＬＥ」へのデータの書き込みとは１対１に対応しない。
【００７３】
ここで、プログラム分析装置１００は、プログラムに記載されたファイル入出力を分析し、ファイル入出力のパターンから当該プログラムの処理種類を判定する。処理種類は、人間にとって理解容易な名称が付された類型であり、プログラムの仕様、処理目的、業務上の意味などに相当してもよい。このとき、プログラム分析装置１００は、上記のプログラム１２１の処理種類とプログラム１２１ａの処理種類とを区別できるようにする。
【００７４】
プログラム１２１の入出力処理は、入力ファイルに含まれる複数の行と出力ファイルに含まれる複数の行とが１対１に対応するため、入力ファイルから出力ファイルへのデータの「複写」であると言うことができる。一方、プログラム１２１ａの入出力処理は、入力ファイルに含まれる複数の行の一部が出力ファイルに含まれる行と対応するため、入力ファイルからのデータの「抽出」であると言うことができる。
【００７５】
ただし、プログラム１２１，１２１ａは共に、入力ファイルからデータを読み出し、読み出したデータに基づいて出力ファイルにデータを書き込むものである。プログラム１２１，１２１ａの静的解析では、実行パスを追跡するわけではないので、同一の入力ファイルからの複数回の読み出しと同一の出力ファイルに対する複数回の書き込みとの間の関係を検出することは難しい。一方、様々な入力ファイルのサンプルを用いてプログラム１２１，１２１ａを繰り返し実行する動的解析では、分析負荷が高くなり、また、複数回の読み出しと複数回の書き込みとの間の関係を網羅的に検出することが難しい。
【００７６】
そこで、第２の実施の形態のプログラム分析装置１００は、シンボリック実行を利用して実行パスを抽出し、実行パスの中で複数回の書き込みそれぞれが複数回の読み出しのうちの何回目の読み出しのデータを使用しているか特定する。プログラム分析装置１００は、特定した書き込みの回数と読み出しの回数との間の関係から、処理種類を判定する。
【００７７】
図８は、ファイルサイズテーブルと入出力回数テーブルの例を示す図である。
プログラム分析装置１００は、シンボリック実行の開始前に、ファイルサイズテーブル１２２を生成する。ファイルサイズテーブル１２２は、プログラム名、入力ファイル名および最大行数の項目を有する。プログラム名の項目には、分析対象のプログラムの識別名が記載される。例えば、プログラム１２１のプログラム名は「ＳＡＭＰＬＥ１」であり、プログラム１２１ａのプログラム名は「ＳＡＭＰＬＥ２」である。入力ファイル名の項目には、プログラムによってデータが読み込まれる入力ファイルのファイル名が記載される。プログラム１２１，１２１ａの入力ファイル名は「ＩＮ−ＦＩＬＥ」である。
【００７８】
最大行数の項目には、入力ファイルにおいてデータが記載されている行の最大値が記載される。シンボリック実行では、具体的な入力ファイルを使用せずプログラムの命令文を擬似的に実行するため、入力ファイルの行数も不定となる。ファイル読み出し文を実行すると、データが読み出された場合とデータが読み出されなかった場合（戻り値がＥＯＦである場合）とに実行パスが分割される。ここで、入力ファイルからの読み出しの停止条件がＥＯＦを検出したことである場合、無限長の実行パスが生成されてシンボリック実行が停止しない。そこで、入力ファイル毎に最大行数を指定しておくこととする。
【００７９】
ある入力ファイルの最大行数がＬ（Ｌは１以上の整数）である場合、ファイル読み出し文の実行回数がＬ回までは、そのファイル読み出し文の戻り値がシンボルかまたはＥＯＦになる。ファイル読み出し文の実行回数がＬ回を超えると、そのファイル読み出し文の戻り値がＥＯＦのみになる。例えば、ある入力ファイルの最大行数が２である場合、２回までのファイル読み出し文の実行ではデータが読み出される可能性がある一方、３回以降のファイル読み出し文の実行ではデータが読み出されない。この場合、シンボリック実行により、入力ファイルに１行のデータが含まれている場合の実行パスと、入力ファイルに２行のデータが含まれている場合の実行パスとがプログラムから抽出される。
【００８０】
ファイルサイズテーブル１２２の最大行数は、プログラム分析装置１００のユーザが指定することができる。ユーザが最大行数を指定しなかった場合、プログラム分析装置１００は所定の既定値を最大行数として使用してもよい。
【００８１】
プログラム分析装置１００は、シンボリック実行を開始すると、入出力回数テーブル１２３を生成する。入出力回数テーブル１２３は、プログラム名、ファイル名および回数の項目を有する。プログラム名の項目には、分析対象のプログラムの識別名が記載される。ファイル名の項目には、プログラムによってデータが読み込まれる入力ファイルのファイル名や、データが書き込まれる出力ファイルのファイル名が記載される。プログラム１２１，１２１ａの出力ファイルのファイル名は「ＯＵＴ−ＦＩＬＥ」である。
【００８２】
回数の項目には、ファイル読み出し文やファイル書き込み文などの入出力文によってファイルにアクセスされた回数が記載される。入力ファイルについては、その入力ファイルからデータを読み出すファイル読み出し文の実行回数が記載される。出力ファイルについては、その出力ファイルにデータを書き込むファイル書き込み文の実行回数が記載される。シンボリック実行の開始時点における入出力回数テーブル１２３の回数の初期値は０である。シンボリック実行が行われている間、ファイル読み出し文が実行される毎に、アクセス対象の入力ファイルに対応する回数が１だけ増加する。また、ファイル書き込み文が実行される毎に、アクセス対象の出力ファイルに対応する回数が１だけ増加する。
【００８３】
図９は、入出力変数へのシンボルの割り当て例を示す図である。
ここでは、プログラム１２１のシンボリック実行において、ファイル「ＩＮ−ＦＩＬＥ」に２行のデータが含まれている場合の実行パスを追跡する例を考える。この実行パスでは、４６行目のファイル読み出し文によりデータが読み出され、７９行目のファイル書き込み文によりデータが書き込まれる。その後に再度、ファイル読み出し文によりデータが読み出され、ファイル書き込み文によりデータが書き込まれる。そして、ファイル読み出し文によりＥＯＦが検出されて入出力処理が終了する。
【００８４】
ファイル読み出し文によって読み出されたデータは、読み出し変数である変数「ＩＮ−ＤＡＴＡ１」に格納される。ここで、入力ファイルに含まれる複数行のデータは、互いに依存関係のない独立なデータである。そこで、プログラム分析装置１００は、ファイル読み出し文の実行毎に変数「ＩＮ−ＤＡＴＡ１」に新たなシンボルを割り当てる。
【００８５】
ファイル書き込み文によって書き込まれるべきデータは、書き込み変数である変数「ＯＵＴ−ＤＡＴＡ１」に格納されている。ファイル書き込み文の実行時における変数「ＯＵＴ−ＤＡＴＡ１」の値は、既出のシンボルなどを用いて算出されている。ただし、出力ファイルの中のデータが書き込まれる場所（行）は、ファイル書き込み文の実行毎に異なる。そこで、プログラム分析装置１００は、複数回の書き込みを区別するため、ファイル書き込み文の実行毎に変数「ＯＵＴ−ＤＡＴＡ１」に別のシンボルを割り当てる。
【００８６】
具体的には、プログラム分析装置１００は、１回目のファイル読み出し文の実行において、変数「ＩＮ−ＤＡＴＡ１」にシンボル「ＩＮ−ＤＡＴＡ１＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ＿１」を割り当てる。このシンボルは、読み出し変数の変数名と、ファイル読み出し文であることを示す文字列「Ｒｅａｄ」と、入力ファイル名と、入力ファイルからの読み出し回数とを連結したものである。読み出し回数は、入出力回数テーブル１２３によって管理されている。以降、ファイル読み出し文により読み出されたデータに依存する他の変数の値は、このシンボルを含む式で表現されることがある。
【００８７】
次に、プログラム分析装置１００は、１回目のファイル書き込み文の実行において、変数「ＯＵＴ−ＤＡＴＡ１」にシンボル「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿１」を割り当てる。このシンボルは、書き込み変数の変数名と、出力ファイル名と、出力ファイルへの書き込み回数とを連結したものである。書き込み回数は、入出力回数テーブル１２３によって管理されている。プログラム分析装置１００は、追跡中の実行パスのパス出力に、上記シンボルを左辺に含み実行パスに沿って算出した変数「ＯＵＴ−ＤＡＴＡ１」の値を示す式を右辺に含む入出力式を追加する。
【００８８】
ここで、１回目のファイル書き込み文の実行時における変数「ＯＵＴ−ＤＡＴＡ１」の値は、「ＩＮ−ＤＡＴＡ１＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ＿１」である。よって、１回目のファイル書き込み文の実行に伴って生成される入出力式は、「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿１＝ＩＮ−ＤＡＴＡ１＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ＿１」となる。
【００８９】
次に、プログラム分析装置１００は、２回目のファイル読み出し文の実行において、変数「ＩＮ−ＤＡＴＡ１」にシンボル「ＩＮ−ＤＡＴＡ１＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ＿２」を割り当てる。次に、プログラム分析装置１００は、２回目のファイル書き込み文の実行において、変数「ＯＵＴ−ＤＡＴＡ１」にシンボル「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿２」を割り当てる。ここで、２回目のファイル書き込み文の実行時における変数「ＯＵＴ−ＤＡＴＡ１」の値は、「ＩＮ−ＤＡＴＡ１＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ＿２」である。よって、プログラム分析装置１００は、パス出力に「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿２＝ＩＮ−ＤＡＴＡ１＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ＿２」を追加する。
【００９０】
最後に、プログラム分析装置１００は、３回目のファイル読み出し文の実行において、ファイル「ＩＮ−ＦＩＬＥ」の読み出し回数が最大行数を超えたことを検出する。すると、プログラム分析装置１００は、ファイル読み出し文の戻り値を定数「ＥＯＦ」に設定する。これにより、この実行パスの入出力処理は終了する。
【００９１】
図１０は、ロジックテーブルの第２の例を示す図である。
ロジックテーブル１２４は、プログラム１２１のシンボリック実行の結果を示す。最大行数を２とすると、プログラム１２１からは６つの実行パスが抽出される。
【００９２】
まず、プログラム分析装置１００は、４６行目のファイル読み出し文において、シンボル「ＩＮ−ＤＡＴＡ１＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ＿１」を取得する。次に、プログラム分析装置１００は、７０行目の条件分岐文において２つの分岐方向が共に充足可能であると判定し、実行パスを分割してＹＥＳ方向を選択する。ＹＥＳ方向を選択する条件は、「ＩＮ−ＤＡＴＡ１＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ＿１＝’１２３４５６７８’」である。次に、プログラム分析装置１００は、７９行目のファイル書き込み文において、その時点の書き込み変数の値を用いて、入出力式「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿１＝ＩＮ−ＤＡＴＡ１＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ＿１」を生成する。
【００９３】
次に、プログラム分析装置１００は、４６行目のファイル読み出し文において、戻り値の候補としてシンボル「ＩＮ−ＤＡＴＡ１＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ＿２」と「ＥＯＦ」を取得する。プログラム分析装置１００は、実行パスを分割して、戻り値が前者である場合を選択する。次に、プログラム分析装置１００は、７０行目の条件分岐文において２つの分岐方向が共に充足可能であると判定し、実行パスを分割してＹＥＳ方向を選択する。ＹＥＳ方向を選択する条件は、「ＩＮ−ＤＡＴＡ１＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ＿２＝’１２３４５６７８’」である。次に、プログラム分析装置１００は、７９行目のファイル書き込み文において、書き込み変数の値を用いて、入出力式「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿２＝ＩＮ−ＤＡＴＡ１＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ＿２」を生成する。
【００９４】
次に、プログラム分析装置１００は、４６行目のファイル読み出し文において「ＥＯＦ」を取得する。これにより、１番目の実行パスが終了する。
次に、プログラム分析装置１００は、直前の分割点である２回目の条件分岐文の実行までバックトラックしてＮＯ方向を選択する。ＮＯ方向を選択する条件は、「ＩＮ−ＤＡＴＡ１＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ＿２≠’１２３４５６７８’」である。次に、プログラム分析装置１００は、７９行目のファイル書き込み文において、その時点の書き込み変数の値が空白であるため、入出力式「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿２＝’’」を生成する。次に、プログラム分析装置１００は、４６行目のファイル読み出し文において「ＥＯＦ」を取得する。これにより、２番目の実行パスが終了する。
【００９５】
次に、プログラム分析装置１００は、２回目のファイル読み出し文の実行までバックトラックして「ＥＯＦ」を選択する。これにより、３番目の実行パスが終了する。
次に、プログラム分析装置１００は、１回目の条件分岐文の実行までバックトラックしてＮＯ方向を選択する。ＮＯ方向を選択する条件は、「ＩＮ−ＤＡＴＡ１＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ＿１≠’１２３４５６７８’」である。次に、プログラム分析装置１００は、７９行目のファイル書き込み文において、その時点の書き込み変数の値が空白であるため、入出力式「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿１＝’’」を生成する。以下、１番目から３番目の実行パスと同様にして４番目から６番目の実行パスが抽出される。
【００９６】
図１１は、ロジックテーブルの第３の例を示す図である。
ロジックテーブル１２４ａは、プログラム１２１ａのシンボリック実行の結果を示す。最大行数を２とすると、プログラム１２１ａからは６つの実行パスが抽出される。
【００９７】
１番目の実行パスのパス条件およびパス出力は、プログラム１２１と同じである。１番目の実行パスが終了すると、プログラム分析装置１００は、７０行目の条件分岐文の２回目の実行までバックトラックしてＮＯ方向を選択する。すると、プログラム分析装置１００は、５７行目の条件分岐文においてＮＯ方向のみ充足可能と判定し、ファイル書き込み文をスキップする。次に、プログラム分析装置１００は、４６行目のファイル読み出し文において「ＥＯＦ」を取得する。これにより、２番目の実行パスが終了する。よって、２番目の実行パスのパス条件はプログラム１２１と同じである一方、パス出力には「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿２」についての入出力式が含まれない。
【００９８】
３番目の実行パスのパス条件およびパス出力は、プログラム１２１と同じである。３番目の実行パスが終了すると、プログラム分析装置１００は、７０行目の条件分岐文の１回目の実行までバックトラックしてＮＯ方向を選択する。すると、プログラム分析装置１００は、５７行目の条件分岐文においてＮＯ方向のみ充足可能と判定し、ファイル書き込み文をスキップする。次に、プログラム分析装置１００は、４６行目のファイル読み出し文において、実行パスを分割し、シンボル「ＩＮ−ＤＡＴＡ１＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ＿２」と「ＥＯＦ」のうち前者を選択する。次に、プログラム分析装置１００は、７０行目の条件分岐文において、実行パスを分割してＹＥＳ方向を選択する。次に、プログラム分析装置１００は、７９行目のファイル書き込み文において、当該ファイル書き込み文の１回目の実行であるため、入出力式「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿１＝ＩＮ−ＤＡＴＡ１＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ＿２」を生成する。
【００９９】
次に、プログラム分析装置１００は、４６行目のファイル読み出し文において「ＥＯＦ」を取得する。これにより、４番目の実行パスが終了する。よって、４番目の実行パスのパス条件はプログラム１２１と同じである一方、パス出力に含まれる「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿１」についての入出力式がプログラム１２１と異なる。また、「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿２」についての入出力式が含まれない。
【０１００】
５番目の実行パスについては、５７行目の条件分岐文の２回目の実行においてもＮＯ方向が選択され、ファイル書き込み文がスキップされる。よって、５番目の実行パスのパス条件はプログラム１２１と同じである一方、パス出力は空集合になる。６番目の実行パスは、７０行目の条件分岐文の２回目の実行に至る前に終了する。よって、６番目の実行パスのパス条件はプログラム１２１と同じである一方、パス出力は空集合になる。
【０１０１】
図１２は、入出力式テーブルの例を示す図である。
プログラム分析装置１００は、プログラム１２１のシンボリック実行が終了した後、ロジックテーブル１２４から入出力式テーブル１２５を生成する。また、プログラム分析装置１００は、プログラム１２１ａのシンボリック実行が終了した後、ロジックテーブル１２４ａから入出力式テーブル１２５ａを生成する。入出力式テーブル１２５，１２５ａは、対応するロジックテーブルに記載された複数の入出力式を集計したものである。
【０１０２】
入出力式テーブル１２５は、出力シンボルおよび入出力式の項目を有する。出力シンボルの項目には、入出力式の左辺に現れる書き込み変数のシンボルが記載される。プログラム分析装置１００は、ロジックテーブル１２４に記載された複数の実行パスのパス出力を横断的に走査して、入出力式の左辺に現れるシンボルを収集し、重複を排除して入出力式テーブル１２５に登録する。入出力式の項目には、出力シンボルの項目に記載されたシンボルを含む入出力式が記載される。プログラム分析装置１００は、ロジックテーブル１２４に記載された複数の実行パスのパス出力から、ある出力シンボルを左辺に含む入出力式を収集し、重複を排除して入出力式テーブル１２５に登録する。入出力式テーブル１２５ａも、入出力式テーブル１２５と同様の構造を有する。
【０１０３】
ロジックテーブル１２４の例では、入出力式の左辺に現れるシンボルは、重複を排除すると「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿１」と「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿２」の２通りである。左辺が「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿１」である入出力式は、重複を排除すると「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿１＝ＩＮ−ＤＡＴＡ１＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ＿１」と「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿１＝’’」の２通りである。左辺が「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿２」である入出力式は、重複を排除すると「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿２＝ＩＮ−ＤＡＴＡ１＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ＿２」と「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿２＝’’」の２通りである。上記が入出力式テーブル１２５に登録される。
【０１０４】
また、ロジックテーブル１２４ａの例では、入出力式の左辺に現れるシンボルはロジックテーブル１２４と同様である。左辺が「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿１」である入出力式は、重複を排除すると「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿１＝ＩＮ−ＤＡＴＡ１＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ＿１」と「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿１＝ＩＮ−ＤＡＴＡ１＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ＿２」の２通りである。左辺が「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿２」である入出力式は、「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿２＝ＩＮ−ＤＡＴＡ１＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ＿２」の１通りである。上記が入出力式テーブル１２５ａに登録される。
【０１０５】
図１３は、一般化入出力式テーブルの例を示す図である。
プログラム分析装置１００は、入出力式テーブル１２５，１２５ａから一般化入出力式テーブル１２６を生成する。一般化入出力式テーブル１２６は、プログラム名および入出力式の項目を有する。プログラム名の項目には、分析対象のプログラムの識別名が記載される。入出力式の項目には、入出力式テーブル１２５，１２５ａに記載された複数の入出力式を一般化した一般化入出力式が記載される。一般化入出力式は、複数の出力シンボルと複数の入出力式との間の関係を抽象的に表した入出力式パターンである。一般化入出力式では、左辺に現れる回数値（左辺のシンボルの末尾にある数値）と右辺に現れる回数値（右辺のシンボルの末尾にある数値）が、ＮやＭなどの抽象的な記号に置換されている。
【０１０６】
入出力式テーブル１２５からは、「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿Ｎ＝ＩＮ−ＤＡＴＡ１＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ＿Ｎ」および「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿Ｎ＝’’」という一般化入出力式が生成される。
【０１０７】
これは、任意の回数値Ｎ（Ｎは１以上の整数）に対して、入出力式「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿Ｎ＝ＩＮ−ＤＡＴＡ１＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ＿Ｎ」が成立することを表す。すなわち、ファイル「ＯＵＴ−ＦＩＬＥ」へのＮ回目の書き込みが、ファイル「ＩＮ−ＦＩＬＥ」からのＮ回目の読み出しに依存する実行パスがあることを表す。入出力式テーブル１２５では、左辺の回数値と右辺の回数値の組が（１，１）と（２，２）であるため、この一般化入出力式が成立する。また、これは、任意の回数値Ｎに対して、入出力式「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿Ｎ＝’’」が成立することを表す。すなわち、ファイル「ＯＵＴ−ＦＩＬＥ」へのＮ回目の書き込みが空白になる実行パスがあることを表す。入出力式テーブル１２５では、Ｎ＝１，２の両方に対して右辺が空白になる入出力式が存在するため、この一般化入出力式が成立する。
【０１０８】
入出力式テーブル１２５ａからは、「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿Ｎ＝ＩＮ−ＤＡＴＡ１＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ＿Ｍ（Ｎ≦Ｍ）」という一般化入出力式が生成される。これは、任意の回数値Ｎに対して、ＭをＮ以上の整数とすると、入出力式「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿Ｎ＝ＩＮ−ＤＡＴＡ１＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ＿Ｍ」が成立することを表す。すなわち、ファイル「ＯＵＴ−ＦＩＬＥ」へのＮ回目の書き込みが、ファイル「ＩＮ−ＦＩＬＥ」からのＭ回目の読み出しに依存する実行パスがあることを表す。入出力式テーブル１２５ａでは、左辺の回数値と右辺の回数値の組が（１，１）と（１，２）と（２，２）であるため、この一般化入出力式が成立する。
【０１０９】
図１４は、入出力式一般化の他の例を示す図である。
入出力式テーブル１２５ｂは、プログラム１２１，１２１ａとは異なるプログラムについて生成された、入出力式テーブル１２５，１２５ａとは異なるテーブルの例である。
【０１１０】
このプログラムでは、ファイル「ＯＵＴ−ＦＩＬＥ」に書き込んだ１回目の値が、ファイル「ＩＮ−ＦＩＬＥ」から読み出した１回目・２回目・３回目の値と「０」との合計を「３」で割った値になることがある。また、ファイル「ＯＵＴ−ＦＩＬＥ」に書き込んだ１回目の値が、ファイル「ＩＮ−ＦＩＬＥ」から読み出した１回目・２回目の値と「０」との合計を「２」で割った値になることがある。また、ファイル「ＯＵＴ−ＦＩＬＥ」に書き込んだ１回目の値が、ファイル「ＩＮ−ＦＩＬＥ」から読み出した１回目の値と「０」との合計を「１」で割った値となることがある。また、ファイル「ＯＵＴ−ＦＩＬＥ」に書き込んだ２回目の値が、ファイル「ＩＮ−ＦＩＬＥ」から読み出した２回目・３回目の値と「０」の合計を「２」で割った値になることがある。また、ファイル「ＯＵＴ−ＦＩＬＥ」に書き込んだ２回目の値が、ファイル「ＩＮ−ＦＩＬＥ」から読み出した２回目の値と「０」の合計を「１」で割った値になることがある。
【０１１１】
この入出力式テーブル１２５ｂでは、入出力式の左辺に現れる回数値と右辺に現れる回数値の組は、（１，１）と（１，２）と（１，３）と（２，２）と（２，３）である。よって、左辺の回数値をＮに変換し、右辺の回数値をＭ（Ｎ≦Ｍ）に変換することができる。ただし、右辺の演算式の形が左辺の回数値によって異なるため、回数値を抽象化するだけでは複数の入出力式を十分に纏めることが難しい。
【０１１２】
この場合、プログラム分析装置１００は、処理種類の判定を容易にするため、右辺の演算式を関数形式に変換する。右辺に現れる固定値はパラメータとして取り扱う。関数の引数には、回数値を一般化したシンボルと固定値とが含まれる。例えば、プログラム分析装置１００は、入出力式テーブル１２５ｂから、次の３つの一般化入出力式を含む一般化入出力式の集合を生成する。「ＯＵＴ−ＤＡＴＡ２＿ＯＵＴ−ＦＩＬＥ＿Ｎ＝Ｆｕｎｃ１（ＩＮ−ＤＡＴＡ２＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ＿Ｍ，０，３）」。「ＯＵＴ−ＤＡＴＡ２＿ＯＵＴ−ＦＩＬＥ＿Ｎ＝Ｆｕｎｃ２（ＩＮ−ＤＡＴＡ２＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ＿Ｍ，０，２）」。「ＯＵＴ−ＤＡＴＡ２＿ＯＵＴ−ＦＩＬＥ＿Ｎ＝Ｆｕｎｃ３（ＩＮ−ＤＡＴＡ２＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ＿Ｍ，０，１）」。なお、ここで使用する関数名は右辺の演算式の形が異なることを表現できればよく、特定の関数名に限定されない。
【０１１３】
図１５は、判定ルールテーブルの例を示す図である。
プログラム分析装置１００は、一般化入出力式テーブル１２６に記載された一般化入出力式と判定ルールテーブル１２７とを照合して、プログラム１２１，１２１ａの処理種類を判定する。判定ルールテーブル１２７は、プログラム１２１，１２１ａの分析開始前に予め用意されている。例えば、プログラム分析装置１００のユーザが判定ルールテーブル１２７を作成して、プログラム分析装置１００に入力しておく。
【０１１４】
判定ルールテーブル１２７は、ルール番号、条件および種類名の項目を有する。ルール番号の項目には、判定ルールの識別番号が記載される。条件の項目には、一般化入出力式が満たすべき条件が記載される。一般化入出力式が満たすべき条件には、左辺の回数値に関する条件、右辺の回数値に関する条件、左辺のファイル名に関する条件、右辺のファイル名に関する条件、右辺の演算子に関する条件などを使用できる。種類名の項目には、プログラムに対して付与される処理種類の名称が記載される。
【０１１５】
あるプログラムについて生成された一般化入出力式が、ある種類名に対応付けられた条件を満たしている場合、当該プログラムに当該種類名が付与される。あるプログラムについて生成された一般化入出力式が、複数の種類名に対応付けられた複数の条件を満たしていることもある。その場合、当該プログラムに当該複数の種類名が付与される。
【０１１６】
一例として、判定ルールテーブル１２７は、６つの判定ルールを含む。判定ルール＃１の種類名は「複写」である。判定ルール＃１の条件は、左辺にＮを含み右辺にＮを含む一般化入出力式が存在することである。判定ルール＃２の種類名は「抽出」である。判定ルール＃２の条件は、左辺にＮを含み右辺にＭ（ＭはＮ以上の整数）を含む一般化入出力式が存在することである。判定ルール＃３の種類名は「選択」である。判定ルール＃３の条件は、右辺の異なる複数の一般化入出力式が存在することである。
【０１１７】
判定ルール＃４の種類名は「演算」である。判定ルール＃４の条件は、右辺に演算子（例えば、四則演算子や論理演算子など）を含む一般化入出力式が存在することである。判定ルール＃５の種類名は「合成」である。判定ルール＃５の条件は、１つの一般化入出力式の中で右辺に複数のファイル名を含むような一般化入出力式が存在することである。判定ルール＃６の種類名は「分割」である。判定ルール＃６の条件は、右辺のファイル名が同じで左辺のファイル名が異なる複数の一般化入出力式が存在することである。
【０１１８】
図１６は、判定結果テーブルの例を示す図である。
プログラム分析装置１００は、処理種類の判定結果を示す判定結果テーブル１２８を生成する。判定結果テーブル１２８は、プログラム名および種類名の項目を有する。プログラム名の項目には、分析対象のプログラムの識別名が記載される。種類名の項目には、判定ルールテーブル１２７から選択された１以上の種類名が記載される。１つのプログラムに対して２以上の種類名が対応付けられることもある。
【０１１９】
プログラム１２１の１番目の一般化入出力式は、判定ルール＃１の条件を満たす。また、プログラム１２１から２つの一般化入出力式が生成されたため、判定ルール＃３の条件を満たす。よって、プログラム１２１の処理種類は「複写」および「選択」と判定される。プログラム１２１ａの一般化入出力式は、判定ルール＃２の条件を満たす。よって、プログラム１２１ａの処理種類は「抽出」と判定される。
【０１２０】
図１７は、処理種類判定の他の例を示す図である。
一般化入出力式テーブル１２６ａは、プログラム１２１，１２１ａとは異なるプログラムについて生成された、一般化入出力式テーブル１２６とは異なるテーブルの例である。一般化入出力式テーブル１２６ａは、プログラム「ＳＡＭＰＬＥ３」、「ＳＡＭＰＬＥ４」および「ＳＡＭＰＬＥ５」についての一般化入出力式を含む。
【０１２１】
プログラム「ＳＡＭＰＬＥ３」の一般化入出力式は、「ＯＵＴ−ＤＡＴＡ３＿ＯＵＴ−ＦＩＬＥ＿Ｎ＝ＩＮ−ＤＡＴＡ３＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ＿Ｍ＋１００」である。プログラム「ＳＡＭＰＬＥ４」の一般化入出力式は、「ＯＵＴ−ＤＡＴＡ４＿ＯＵＴ−ＦＩＬＥ＿Ｎ＝ＩＮ−ＤＡＴＡ４＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ１＿Ｎ×ＩＮ−ＤＡＴＡ５＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ２＿Ｎ」である。プログラム「ＳＡＭＰＬＥ５」の一般化入出力式は、「ＯＵＴ−ＤＡＴＡ５＿ＯＵＴ−ＦＩＬＥ１＿Ｎ＝ＩＮ−ＤＡＴＡ６＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ＿Ｎ」および「ＯＵＴ−ＤＡＴＡ６＿ＯＵＴ−ＦＩＬＥ２＿Ｎ＝ＩＮ−ＤＡＴＡ６＿Ｒｅａｄ＿ＩＮ−ＦＩＬＥ＿Ｎ」である。
【０１２２】
判定結果テーブル１２８ａは、プログラム「ＳＡＭＰＬＥ３」、「ＳＡＭＰＬＥ４」および「ＳＡＭＰＬＥ５」について生成された、判定結果テーブル１２８とは異なるテーブルである。判定結果テーブル１２８ａには、プログラム「ＳＡＭＰＬＥ３」、「ＳＡＭＰＬＥ４」および「ＳＡＭＰＬＥ５」に付与された種類名が記載される。
【０１２３】
プログラム「ＳＡＭＰＬＥ３」の一般化入出力式は、判定ルール＃２，＃４の条件を満たす。よって、プログラム「ＳＡＭＰＬＥ３」の処理種類は「抽出」および「演算」と判定される。プログラム「ＳＡＭＰＬＥ４」の一般化入出力式は、判定ルール＃１，＃４，＃５の条件を満たす。よって、プログラム「ＳＡＭＰＬＥ４」の処理種類は「複写」、「演算」および「合成」と判定される。プログラム「ＳＡＭＰＬＥ５」の一般化入出力式は、判定ルール＃１，＃６の条件を満たす。よって、プログラム「ＳＡＭＰＬＥ５」の処理種類は「複写」および「分割」と判定される。
【０１２４】
図１８は、分析結果画面の表示例を示す図である。
プログラム分析装置１００は、プログラム１２１の処理種類を判定した後、プログラム１２１の分析結果を示す分析結果画面１２９をディスプレイ１１１に表示する。分析結果画面１２９は、分析対象のプログラム１２１のプログラム名を含む。また、分析結果画面１２９は、ロジックテーブル１２４に記載されたプログラム１２１の実行パスの情報を含む。また、分析結果画面１２９は、判定したプログラム１２１の処理種類の種類名を含む。すなわち、種類名「複写」および「選択」が実行パス情報と併せて表示される。
【０１２５】
次に、プログラム分析装置１００の機能および処理手順について説明する。
図１９は、プログラム分析装置の機能例を示すブロック図である。
プログラム分析装置１００は、記憶部１２０を有する。記憶部１２０は、例えば、ＲＡＭ１０２またはＨＤＤ１０３に確保した記憶領域を用いて実装される。記憶部１２０は、プログラム１２１、ファイルサイズテーブル１２２、入出力回数テーブル１２３、ロジックテーブル１２４、入出力式テーブル１２５、一般化入出力式テーブル１２６、判定ルールテーブル１２７および判定結果テーブル１２８を記憶する。プログラム１２１ａが分析対象プログラムである場合には、記憶部１２０は、プログラム１２１ａ、ロジックテーブル１２４ａおよび入出力式テーブル１２５ａを更に記憶する。
【０１２６】
また、プログラム分析装置１００は、ファイルサイズ設定部１３１、入出力値割り当て部１３２、シンボリック実行部１３３、入出力式集計部１３４、入出力式一般化部１３５、処理種類判定部１３６および分析結果表示部１３７を有する。ファイルサイズ設定部１３１、入出力値割り当て部１３２、シンボリック実行部１３３、入出力式集計部１３４、入出力式一般化部１３５、処理種類判定部１３６および分析結果表示部１３７は、例えば、プロセッサ１０１が実行するプログラムモジュールを用いて実装される。
【０１２７】
ファイルサイズ設定部１３１は、入力ファイル毎の最大行数の指定を受け付ける。最大行数は、例えば、ユーザが入力する。ファイルサイズ設定部１３１は、指定された最大行数を含むファイルサイズテーブル１２２を生成して記憶部１２０に格納する。
【０１２８】
入出力値割り当て部１３２は、シンボリック実行部１３３がシンボリック実行を開始する前に、入出力回数テーブル１２３を生成して記憶部１２０に格納する。入出力回数テーブル１２３に記載された各ファイルの回数は０に初期化しておく。その後、入出力値割り当て部１３２は、シンボリック実行の進行を監視し、シンボリック実行がファイル読み出し文やファイル書き込み文などの入出力文に到達したことを検出する。
【０１２９】
シンボリック実行がファイル読み出し文に到達すると、入出力値割り当て部１３２は、入出力回数テーブル１２３を用いて読み出し変数のシンボルを生成し、シンボリック実行部１３３に通知する。また、入出力値割り当て部１３２は、「ＥＯＦ」をシンボリック実行部１３３に通知する。ただし、入出力値割り当て部１３２は、読み出し回数が最大行数を超えている場合は読み出し変数のシンボルを生成しない。シンボリック実行がファイル書き込み文に到達すると、入出力値割り当て部１３２は、入出力回数テーブル１２３を用いて書き込み変数のシンボルを生成し、シンボリック実行部１３３に通知する。読み出し変数のシンボルと書き込み変数のシンボルは、回数値を含む。
【０１３０】
シンボリック実行部１３３は、分析対象のプログラム１２１が指定されると、プログラム１２１についてシンボリック実行を開始する。シンボリック実行部１３３は、実行パスがファイル読み出し文に到達すると、実際のファイル入力は行わずに、ファイル読み出し文の戻り値を入出力値割り当て部１３２から取得する。シンボリック実行部１３３は、戻り値としてシンボルを取得した場合、読み出し変数にシンボルを割り当ててシンボリック実行を続ける。また、シンボリック実行部１３３は、戻り値として「ＥＯＦ」を取得した場合、入力ファイルの末尾に到達したと判断する。戻り値としてシンボルと「ＥＯＦ」の両方を取得した場合は、シンボリック実行部１３３は実行パスを分割する。
【０１３１】
また、シンボリック実行部１３３は、実行パスがファイル書き込み文に到達すると、実際のファイル出力は行わずに、書き込み変数のシンボルを入出力値割り当て部１３２から取得する。すると、シンボリック実行部１３３は、書き込み変数に割り当てたシンボルとその時点で書き込み変数に格納されている値とを対応付けた入出力式を生成し、その実行パスのパス出力に追加する。書き込み変数に格納されている値は、先のファイル読み出し文の際に取得したシンボルを含む式で表現されていることがある。シンボリック実行部１３３は、ロジックテーブル１２４を生成して記憶部１２０に格納する。
【０１３２】
入出力式集計部１３４は、シンボリック実行部１３３によるシンボリック実行が終了すると、ロジックテーブル１２４に記載された複数の実行パスの入出力式を集計する。入出力式集計部１３４は、入出力式テーブル１２５を生成して記憶部１２０に格納する。
【０１３３】
入出力式一般化部１３５は、入出力式テーブル１２５に記載された複数の入出力式を一般化して１以上の一般化入出力式に変換する。入出力式一般化部１３５は、一般化入出力式テーブル１２６を生成して記憶部１２０に格納する。
【０１３４】
処理種類判定部１３６は、一般化入出力式テーブル１２６に記載された一般化入出力式と判定ルールテーブル１２７に記載された複数の判定ルールそれぞれの条件とを照合する。処理種類判定部１３６は、条件を満たす判定ルールの種類名を判定ルールテーブル１２７から取得し、種類名をプログラム１２１に付与する。処理種類判定部１３６は、判定結果テーブル１２８を生成して記憶部１２０に格納する。
【０１３５】
分析結果表示部１３７は、ロジックテーブル１２４に記載された実行パス情報と、判定結果テーブル１２８に記載された種類名とを含む分析結果画面１２９を生成する。実行パス情報は、複数の実行パスそれぞれのパス条件およびパス出力を含む。分析結果表示部１３７は、生成した分析結果画面１２９をディスプレイ１１１に表示させる。ただし、プログラム分析装置１００は、実行パス情報や種類名を他の装置に送信してもよい。また、プログラム分析装置１００は、実行パス情報や種類名を印刷デバイスに出力するなど、他の方法で実行パス情報や種類名を出力してもよい。
【０１３６】
図２０は、プログラム分析の手順例を示すフローチャートである。
（Ｓ１）プログラム分析装置１００は、分析対象のプログラム１２１の指定を取得する。この指定は、例えば、入力デバイス１１２を用いてユーザから入力される。
【０１３７】
（Ｓ２）ファイルサイズ設定部１３１は、入力ファイルそれぞれの最大行数の指定を取得する。この指定は、例えば、入力デバイス１１２を用いてユーザから入力される。
（Ｓ３）シンボリック実行部１３３は、指定されたプログラム１２１のシンボリック実行を行う。シンボリック実行の途中で、入出力値割り当て部１３２がシンボリック実行部１３３に、読み出し変数に割り当てるシンボルを提供することがある。また、シンボリック実行の途中で、入出力値割り当て部１３２がシンボリック実行部１３３に、書き込み変数に割り当てるシンボルを提供することがある。シンボリック実行の詳細は後述する。
【０１３８】
（Ｓ４）入出力式集計部１３４は、シンボリック実行の終了後、複数の実行パスのパス出力に含まれる入出力式を横断的に集計する。入出力式集計部１３４は、複数の実行パスのパス出力から左辺が同じ入出力式を抽出し、重複を排除して入出力式テーブルの１つのレコードに登録する。例えば、入出力式集計部１３４は、左辺の回数値が小さい入出力式から順に集計していく。図１０のロジックテーブル１２４について、入出力式集計部１３４は、まず左辺が「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿１」である入出力式を検索し、重複を排除して入出力式テーブル１２５の１行目に登録する。次に、入出力式集計部１３４は、左辺が「ＯＵＴ−ＤＡＴＡ１＿ＯＵＴ−ＦＩＬＥ＿２」である入出力式を検索し、重複を排除して入出力式テーブル１２５の２行目に登録する。
【０１３９】
（Ｓ５）入出力式一般化部１３５は、左辺の回数値毎に集計した入出力式から、複数の回数値に共通に成立する一般化入出力式を生成する。入出力式一般化の詳細は後述する。
（Ｓ６）処理種類判定部１３６は、判定ルールテーブル１２７を参照して、ステップＳ５で生成した一般化入出力式からプログラム１２１の処理種類を判定する。
【０１４０】
（Ｓ７）分析結果表示部１３７は、シンボリック実行によって生成されたロジックテーブル１２４の内容とステップＳ６で判定した処理種類の種類名とを含む分析結果画面１２９を生成し、ディスプレイ１１１に分析結果画面１２９を表示する。
【０１４１】
図２１は、シンボリック実行の手順例を示すフローチャートである。
シンボリック実行は、上記のステップＳ３で実行される。
（Ｓ１０）シンボリック実行部１３３は、プログラム１２１の開始時に外部から入力される値を格納する入力変数がある場合、入力変数にシンボルを割り当てる。
【０１４２】
（Ｓ１１）シンボリック実行部１３３は、プログラム１２１の処理順序に従い、次に実行されるべき命令文をプログラム１２１から１つ取得する。
（Ｓ１２）シンボリック実行部１３３は、ステップＳ１１で終了文以外の命令文を取得したか判断する。終了文以外の命令文を取得した場合、ステップＳ１３に処理が進む。終了文を取得したか、または、取得すべき命令文が存在しない場合、ステップＳ１５に処理が進む。
【０１４３】
（Ｓ１３）シンボリック実行部１３３は、ステップＳ１１で取得した命令文が、ファイル読み出し以外の演算によって変数の値を更新する変数更新文であるか判断する。変数更新文は、例えば、左辺と右辺を等号で結合した代入文やＭＯＶＥ文などである。取得した命令文が変数更新文である場合はステップＳ１４に処理が進み、取得した命令文がそれ以外である場合はステップＳ１７に処理が進む。
【０１４４】
（Ｓ１４）シンボリック実行部１３３は、変数更新文に従い変数の値を更新する。変数の値はシンボルを含む式で表されることもある。そして、ステップＳ１１に処理が進む。
（Ｓ１５）シンボリック実行部１３３は、実行パスが終点に到達したと判断する。シンボリック実行部１３３は、その時点のパス条件とパス出力をロジックテーブル１２４に登録する。パス条件は、実行パスの先頭から終点までに選択した分岐方向の条件を累積したものである。パス条件にはシンボルが用いられることがある。パス出力は、実行パスの先頭から終点までに行われたファイル書き込みについて、書き込み時点の書き込み変数の値と書き込み変数に別途割り当てたシンボルとを対応付けた入出力式を含む。
【０１４５】
（Ｓ１６）シンボリック実行部１３３は、ファイル読み出し文や条件分岐文によって分割された実行パスであって、未選択の実行パスが残っているか判断する。未選択の実行パスがある場合、シンボリック実行部１３３は、１つ前の分割点までバックトラックし、保存しておいたパス条件、パス出力および入出力回数テーブル１２３を取得する。シンボリック実行部１３３は、未選択の分岐方向を選択し、取得したパス条件およびパス出力を用いてその実行パスについてシンボリック実行を続ける。そして、ステップＳ１１に処理が進む。一方、未選択の実行パスがない場合、シンボリック実行が終了する。
【０１４６】
図２２は、シンボリック実行の手順例を示すフローチャート（続き）である。
（Ｓ１７）シンボリック実行部１３３は、ステップＳ１１で取得した命令文が、ファイル読み出し文やファイル書き込み文などの入出力文であるか判断する。取得した命令文が入出力文である場合はステップＳ１８に処理が進み、取得した命令文がそれ以外である場合はステップＳ２１に処理が進む。
【０１４７】
（Ｓ１８）入出力値割り当て部１３２は、命令文がファイル読み出し文である場合、その戻り値をシンボリック実行部１３３に提供する。また、入出力値割り当て部１３２は、命令文がファイル書き込み文である場合、書き込み変数に割り当てるシンボルをシンボリック実行部１３３に提供する。入出力値割り当ての詳細は後述する。
【０１４８】
（Ｓ１９）シンボリック実行部１３３は、命令文がファイル読み出し文であり、かつ、入出力値割り当て部１３２から取得した戻り値が読み出し変数のシンボルと「ＥＯＦ」の２通りあるか判断する。上記条件を満たす場合はステップＳ２０に処理が進み、上記条件を満たさない場合はステップＳ１１に処理が進む。
【０１４９】
（Ｓ２０）シンボリック実行部１３３は、実行パスを分割する。シンボリック実行部１３３は、２通りの戻り値の何れか一方（例えば、読み出し変数のシンボル）を選択する。シンボルを選択した場合、シンボリック実行部１３３は、読み出し変数に当該シンボルを割り当てる。また、シンボリック実行部１３３は、その時点のパス条件、パス出力および入出力回数テーブル１２３を退避する。選択しなかった戻り値に相当する実行パスは、未選択の実行パスとしておく。そして、ステップＳ１１に処理が進む。
【０１５０】
（Ｓ２１）シンボリック実行部１３３は、ステップＳ１１で取得した命令文が、条件分岐文であるか判断する。取得した命令文が条件分岐文である場合はステップＳ２２に処理が進み、取得した命令文がそれ以外である場合はステップＳ２５に処理が進む。
【０１５１】
（Ｓ２２）シンボリック実行部１３３は、条件分岐文に記載された分岐条件とその時点の変数の値とその時点のパス条件とに基づいて、ＹＥＳ方向とＮＯ方向の２つの分岐方向それぞれの充足可能性を判定する。変数の値がシンボルを含む式である場合、２つの分岐方向の両方が充足可能であると判定されることもある。
【０１５２】
（Ｓ２３）シンボリック実行部１３３は、２つの分岐方向が共に充足可能であるか判断する。２つの分岐方向が共に充足可能である場合はステップＳ２４に処理が進み、一方の分岐方向のみ充足可能である場合はステップＳ２５に処理が進む。
【０１５３】
（Ｓ２４）シンボリック実行部１３３は、実行パスを分割する。シンボリック実行部１３３は、２つの分岐方向の何れか一方（例えば、ＹＥＳ方向）を選択して、現在の実行パスの進行方向とする。また、シンボリック実行部１３３は、その時点のパス条件、パス出力および入出力回数テーブル１２３を退避する。選択しなかった分岐方向に相当する実行パスは、未選択の実行パスとしておく。そして、ステップＳ１１に処理が進む。
【０１５４】
（Ｓ２５）シンボリック実行部１３３は、ステップＳ１１で取得した命令文に応じた処理を行う。ステップＳ２３で一方の分岐方向のみ充足可能と判断された場合、シンボリック実行部１３３は、条件分岐文に従って充足可能な分岐方向を選択することになる。このとき、実行パスは分割されない。そして、ステップＳ１１に処理が進む。
【０１５５】
図２３は、入出力値割り当ての手順例を示すフローチャートである。
入出力値割り当ては、上記のステップＳ１８で実行される。
（Ｓ３０）入出力値割り当て部１３２は、ステップＳ１１で取得された命令文が、入力ファイルからデータを読み出すファイル読み出し文であるか判断する。取得された命令文がファイル読み出し文である場合はステップＳ３１に処理が進み、取得された命令文がそれ以外である場合はステップＳ３５に処理が進む。
【０１５６】
（Ｓ３１）入出力値割り当て部１３２は、プログラム１２１からアクセス先の入力ファイル名を抽出する。入出力値割り当て部１３２は、入出力回数テーブル１２３に記載された入力ファイル名に対応する読み出し回数を１だけ加算する。
【０１５７】
（Ｓ３２）入出力値割り当て部１３２は、ファイルサイズテーブル１２２から、入力ファイル名に対応する最大行数を取得する。入出力値割り当て部１３２は、ステップＳ３１の更新後の読み出し回数が最大行数以下であるか判断する。更新後の読み出し回数が最大行数以下である場合はステップＳ３３に処理が進み、更新後の読み出し回数が最大回数を超える場合はステップＳ３４に処理が進む。
【０１５８】
（Ｓ３３）入出力値割り当て部１３２は、更新後の読み出し回数を含むシンボルを生成する。シンボルは、例えば、読み出し変数の変数名と、ファイル読み出し文であることを示す文字列「Ｒｅａｄ」と、入力ファイル名と、読み出し回数とを連結したものである。入出力値割り当て部１３２は、２通りの戻り値として、生成したシンボルと「ＥＯＦ」をシンボリック実行部１３３に通知する。そして、入出力値割り当てが終了する。
【０１５９】
（Ｓ３４）入出力値割り当て部１３２は、戻り値として「ＥＯＦ」をシンボリック実行部１３３に通知する。そして、入出力値割り当てが終了する。
（Ｓ３５）入出力値割り当て部１３２は、ステップＳ１１で取得された命令文が、出力ファイルにデータを書き込むファイル書き込み文であるか判断する。取得された命令文がファイル書き込み文である場合はステップＳ３６に処理が進み、取得された命令文がそれ以外である場合は入出力値割り当てが終了する。
【０１６０】
（Ｓ３６）入出力値割り当て部１３２は、プログラム１２１からアクセス先の出力ファイル名を抽出する。入出力値割り当て部１３２は、入出力回数テーブル１２３に記載された出力ファイル名に対応する書き込み回数を１だけ加算する。
【０１６１】
（Ｓ３７）入出力値割り当て部１３２は、更新後の書き込み回数を含むシンボルを生成する。シンボルは、例えば、書き込み変数の変数名と、出力ファイル名と、書き込み回数とを連結したものである。入出力値割り当て部１３２は、書き込み変数に対応させるシンボルとして、生成したシンボルをシンボリック実行部１３３に通知する。
【０１６２】
（Ｓ３８）シンボリック実行部１３３は、入出力値割り当て部１３２から通知されたシンボルを左辺に含み、ファイル書き込み文の前までに計算した書き込み変数の値を右辺に含む入出力式を生成する。書き込み変数の値は、ステップＳ３３で通知されたシンボルを含む式で表現されていることがある。シンボリック実行部１３３は、生成した入出力式を、追跡中の実行パスのパス出力に追加する。
【０１６３】
図２４は、入出力式一般化の手順例を示すフローチャートである。
入出力式一般化は、上記のステップＳ５で実行される。
（Ｓ４０）入出力式一般化部１３５は、入出力式テーブル１２５に記載された各入出力式の両辺から回数値を抽出する。すなわち、入出力式一般化部１３５は、左辺から書き込み回数の回数値を抽出し、右辺から読み出し回数の回数値を抽出する。
【０１６４】
（Ｓ４１）入出力式一般化部１３５は、左辺の回数値と右辺の回数値の対応関係を示す対応マップを生成する。対応マップは、キーとバリューを対応付けたデータ構造をもつ。対応マップのキーは、左辺の回数値である。対応マップのバリューは、左辺の回数値と対応付けられる右辺の回数値の集合である。ただし、左辺に回数値を含み右辺に回数値を含まない入出力式がある場合、左辺の回数値に対応するバリューに「０」が追加される。
【０１６５】
例えば、入出力式一般化部１３５は、入出力式テーブル１２５から、（キー，バリュー）＝（１，｛０，１｝）および（２，｛０，２｝）という対応マップを生成する。また、入出力式一般化部１３５は、入出力式テーブル１２５ａから、（キー，バリュー）＝（１，｛１，２｝）および（２，｛２｝）という対応マップを生成する。
【０１６６】
（Ｓ４２）入出力式一般化部１３５は、対応マップからキーを１つ選択する。
（Ｓ４３）入出力式一般化部１３５は、選択したキーに対応付けられたバリューを取得する。入出力式一般化部１３５は、バリューの中に、キーと同じ回数値および「０」以外の回数値が含まれているか判断する。上記条件に該当する場合はステップＳ４５に処理が進み、上記条件に該当しない場合はステップＳ４４に処理が進む。
【０１６７】
（Ｓ４４）入出力式一般化部１３５は、入出力式テーブル１２５から、ステップＳ４２で選択したキーを左辺の回数値として含む入出力式を検索する。入出力式一般化部１３５は、検索された入出力式の左辺の回数値を「Ｎ」に変換する。また、入出力式一般化部１３５は、検索された入出力式の右辺に回数値が含まれる場合、その右辺の回数値を「Ｎ」に変換する。そして、ステップＳ４７に処理が進む。
【０１６８】
（Ｓ４５）入出力式一般化部１３５は、ステップＳ４３で取得したバリューから、「０」以外の最小の回数値を特定する。入出力式一般化部１３５は、最小の回数値がキーの回数値以上であるか判断する。上記条件を満たす場合はステップＳ４６に処理が進み、上記条件を満たさない場合はステップＳ４８に処理が進む。
【０１６９】
（Ｓ４６）入出力式一般化部１３５は、入出力式テーブル１２５から、ステップＳ４２で選択したキーを左辺の回数値として含む入出力式を検索する。入出力式一般化部１３５は、検索された入出力式の左辺の回数値を「Ｎ」に変換する。また、入出力式一般化部１３５は、検索された入出力式の右辺に回数値が含まれる場合、その右辺の回数値を「Ｍ」に変換する。ここで、Ｎ，Ｍは、Ｎ≦Ｍを満たす整数を表す記号である。
【０１７０】
（Ｓ４７）入出力式一般化部１３５は、ここまでに変換した入出力式の集合を取得し、右辺の演算式の形が複数通りあるか（右辺の演算式の形が異なる複数の入出力式があるか）判断する。入出力式一般化部１３５は、右辺の演算式の形が複数通りある場合、右辺を関数表記に変換する。そして、ステップＳ４９に処理が進む。
【０１７１】
（Ｓ４８）入出力式一般化部１３５は、一般化失敗と判断する。入出力式一般化部１３５は、入出力式テーブル１２５から、ステップＳ４２で選択したキーを左辺の回数値として含む入出力式を検索し、検索された入出力式を変換せずに残す。
【０１７２】
（Ｓ４９）入出力式一般化部１３５は、ステップＳ４２で対応マップの全てのキーを選択したか判断する。全てのキーを選択した場合はステップＳ５０に処理が進み、未選択のキーがある場合はステップＳ４２に処理が進む。
【０１７３】
（Ｓ５０）入出力式一般化部１３５は、ステップＳ４４，Ｓ４６，Ｓ４８の入出力式を統合して１以上の一般化入出力式を生成する。例えば、入出力式一般化部１３５は、変換後の入出力式の重複を排除する。また、例えば、入出力式一般化部１３５は、右辺の回数値相当の記号のみが異なる２つの入出力式（右辺に「Ｎ」を含むものと右辺に「Ｍ」を含むもの）がある場合、右辺に「Ｎ」を含む入出力式を削除し右辺に「Ｍ」を含む入出力式に統一する。入出力式一般化部１３５は、一般化に失敗した入出力式を削除してもよい。
【０１７４】
第２の実施の形態のプログラム分析装置１００によれば、シンボリック実行の間、各入力ファイルの読み出し回数と各出力ファイルの書き込み回数とが監視される。ファイル読み出し文の実行毎に、読み出し回数を含むシンボルが読み出し変数に割り当てられる。また、ファイル書き込み文の実行毎に、読み出し変数のシンボルを用いて算出した書き込み値と書き込み回数を含むシンボルとを対応付けた入出力式が生成される。複数の実行パスを通じて収集された入出力式から、複数回のファイル書き込みそれぞれが何回目のファイル読み込みのデータに依存するかが分析され、その依存パターンを示す一般化入出力式がされる。そして、一般化入出力式と判定ルールテーブル１２７とが照合されて、「複写」や「選択」などのプログラム１２１の処理種類が判定される。
【０１７５】
これにより、入力ファイル数や出力ファイル数などプログラム１２１の静的解析によって得られる情報のみからプログラム１２１の処理種類を判定する場合よりも、入出力処理を詳細に分析でき、処理種類を高い精度で判定することができる。例えば、１回のファイル読み出しにつき１回のファイル書き込みを行うプログラムと、複数回のファイル読み出しにつき１回のファイル書き込みを行うプログラムとを区別できる。よって、プログラム１２１の仕様や処理目的などの理解が容易となる。また、シンボリック実行によって実行パスを追跡するため、具体的な入力値や入力ファイルのサンプルを入れ替えながらプログラム１２１を繰り返し実行する動的解析よりも、実行パスおよび入出力式の抽出の網羅性が向上すると共に、プログラム分析の効率が向上する。
【符号の説明】
【０１７６】
１０  プログラム分析装置
１１  記憶部
１２  演算部
１３  パターン情報
１４，１５  回数対応情報
１６，１７  処理の種類
２０  プログラム
２１  読み出し命令
２２  書き込み命令
２３ａ，２３ｂ，２３ｃ，２５ａ，２５ｂ，２５ｃ，２５ｄ  第１のカウント値
２４ａ，２４ｂ，２４ｃ，２６ａ，２６ｂ  第２のカウント値
【図１】
0006643718.tif 000002
【図２】
0006643718.tif 000003
【図３】
0006643718.tif 000004
【図４】
0006643718.tif 000005
【図５】
0006643718.tif 000006
【図６】
0006643718.tif 000007
【図７】
0006643718.tif 000008
【図８】
0006643718.tif 000009
【図９】
0006643718.tif 000010
【図１０】
0006643718.tif 000011
【図１１】
0006643718.tif 000012
【図１２】
0006643718.tif 000013
【図１３】
0006643718.tif 000014
【図１４】
0006643718.tif 000015
【図１５】
0006643718.tif 000016
【図１６】
0006643718.tif 000017
【図１７】
0006643718.tif 000018
【図１８】
0006643718.tif 000019
【図１９】
0006643718.tif 000020
【図２０】
0006643718.tif 000021
【図２１】
0006643718.tif 000022
【図２２】
0006643718.tif 000023
【図２３】
0006643718.tif 000024
【図２４】
0006643718.tif 000025