(57)【特許請求の範囲】
【請求項１】
対象プログラムを解析する処理をコンピュータに実行させるコンピュータプログラムにおいて、
第１入力データ及び該第１入力データと異なる第２入力データに夫々基づく前記対象プログラムの第１駆動履歴及び第２駆動履歴を記録する記録手段に記録された該第１駆動履歴から、該対象プログラムに含まれる関数の呼び出し情報に基づいて、該関数の第１呼び出し履歴を抽出し、
前記記録手段に記録された第２駆動履歴から、前記関数の呼び出し情報に基づいて、該関数の第２呼び出し履歴を抽出し、
前記関数の第１及び第２呼び出し履歴に夫々基づいて、前記第１及び第２駆動履歴各々における該関数の呼び出し回数又は呼び出し箇所を取得する
処理をコンピュータに実行させるコンピュータプログラム。
【請求項２】
前記関数の呼び出し情報は該関数の呼び出し開始又は呼び出し終了を示す情報を含み、
前記関数の第１及び第２呼び出し履歴を抽出する処理は、該関数の呼び出し開始又は呼び出し終了に係る第１及び第２呼び出し履歴を夫々抽出し、
前記関数の呼び出し回数又は呼び出し箇所を取得する処理は、該関数の呼び出し開始又は呼び出し終了に係る第１及び第２呼び出し履歴に夫々基づいて、前記第１及び第２駆動履歴各々における該関数の呼び出し回数又は呼び出し箇所を取得する
請求項１に記載のコンピュータプログラム。
【請求項３】
前記対象プログラムの第１及び第２駆動履歴は行単位の文字列であり、
前記関数の呼び出し箇所を取得する処理は、該関数の呼び出し開始又は呼び出し終了に対応する行番号を取得する
請求項２に記載のコンピュータプログラム。
【請求項４】
前記関数の呼び出し開始又は呼び出し終了に対応する行番号に基づいて、該関数の処理に関するステップ数に応じた行の数量を算出する
請求項３に記載のコンピュータプログラム。
【請求項５】
前記ステップ数に応じた行の数量を算出する処理は、前記対象プログラムの第１及び第２駆動履歴各々における関数の同一呼び出し回数目の呼び出し開始及び呼び出し終了に夫々対応する行番号に基づいて、前記ステップ数に応じた行の数量を算出する
請求項４に記載のコンピュータプログラム。
【請求項６】
前記ステップ数に応じた行の数量を算出する処理は、前記対象プログラムの第１及び第２駆動履歴各々における関数の呼び出し開始に対応する最初の行番号及び呼び出し開始に対応する最後の行番号、又は該関数の呼び出し終了に対応する最初の行番号及び呼び出し終了に対応する最後の行番号に基づいて、前記ステップ数に応じた行の数量を算出する
請求項４に記載のコンピュータプログラム。
【請求項７】
対象プログラムを解析するプログラム解析方法において、
コンピュータが、
第１入力データ及び該第１入力データと異なる第２入力データに夫々基づく前記対象プログラムの第１駆動履歴及び第２駆動履歴を記録する記録手段に記録された該第１駆動履歴から、該対象プログラムに含まれる関数の呼び出し情報に基づいて、該関数の第１呼び出し履歴を抽出し、
前記記録手段に記録された第２駆動履歴から、前記関数の呼び出し情報に基づいて、該関数の第２呼び出し履歴を抽出し、
前記関数の第１及び第２呼び出し履歴に夫々基づいて、前記第１及び第２駆動履歴各々における該関数の呼び出し回数又は呼び出し箇所を取得する
プログラム解析方法。
【請求項８】
対象プログラムを解析するプログラム解析装置において、
第１入力データ及び該第１入力データと異なる第２入力データに夫々基づく前記対象プログラムの第１駆動履歴及び第２駆動履歴を記録する記録手段と、
該記録手段に記録された第１駆動履歴から、前記対象プログラムに含まれる関数の呼び出し情報に基づいて、該関数の第１呼び出し履歴を抽出する第１抽出部と、
前記記録手段に記録された第２駆動履歴から、前記関数の呼び出し情報に基づいて、該関数の第２呼び出し履歴を抽出する第２抽出部と、
前記第１及び第２抽出部が夫々抽出した関数の前記第１及び第２呼び出し履歴に基づいて、前記第１及び第２駆動履歴各々における該関数の呼び出し回数又は呼び出し箇所を取得する取得部と
を備えるプログラム解析装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムの動作を解析するコンピュータプログラム、プログラム解析方法及びプログラム解析装置に関する。
【背景技術】
【０００２】
開発されたプログラムは、その運用及び保守に係る歳月の経過にともない、改良、機能追加等の修正が必要になる。しかし、修正対象のソースコード、設計仕様書、要求仕様書等が手に入らない場合、プログラムの動作がわからないため、プログラムの運用及び保守は困難を極める。そこで、プログラムの動作を解析するリバースエンジニアリングが行われる（例えば、特許文献１〜５参照）。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開平０６−１３９２２４号公報
【特許文献２】特開２００５−１２４１１２号公報
【特許文献３】特許第４２８８９７８号公報
【特許文献４】特開２００４−３０２７５１号公報
【特許文献５】特表２００１−５２７２３５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしながら、多くの場合、リバースエンジニアリングによりプログラムの分析を行うときは、ソースコードが必要とされる。リバースエンジニアリングはオブジェクトコードをソースコードに戻す逆コンパイルを含む。しかし、逆コンパイルによってコンパイル前のソースコードを復元することは難しい。また、逆コンパイルは著作権を侵害するおそれがある。
【０００５】
本発明は斯かる事情に鑑みてなされたものである。その目的は、入力データの変化に基づいてプログラムに含まれる関数の動作変化を取得することが可能なコンピュータプログラム、プログラム解析方法及びプログラム解析装置を提供することである。
【課題を解決するための手段】
【０００６】
本願による開示の一観点は、対象プログラムを解析する処理をコンピュータに実行させるコンピュータプログラムにおいて、第１入力データ及び該第１入力データと異なる第２入力データに夫々基づく前記対象プログラムの第１駆動履歴及び第２駆動履歴を記録する記録手段に記録された該第１駆動履歴から、該対象プログラムに含まれる関数の呼び出し情報に基づいて、該関数の第１呼び出し履歴を抽出し、前記記録手段に記録された第２駆動履歴から、前記関数の呼び出し情報に基づいて、該関数の第２呼び出し履歴を抽出し、前記関数の第１及び第２呼び出し履歴に夫々基づいて、前記第１及び第２駆動履歴各々における該関数の呼び出し回数又は呼び出し箇所を取得する処理をコンピュータに実行させる。
【発明の効果】
【０００７】
本願による開示の一観点によれば、入力データの変化に基づいて、プログラムに含まれる関数の動作変化を取得することが可能である。
【図面の簡単な説明】
【０００８】
【図１】プログラム解析装置のハードウェア構成例を示すブロック図である。
【図２】データ処理の流れの一例を示すデータフロー図である。
【図３】プログラム解析処理の手順の一例を示すフローチャートである。
【図４】関数の呼び出し履歴を計側する処理の手順の一例を示すフローチャートである。
【図５】関数の呼び出し履歴を計側する処理の手順の一例を示すフローチャートである。
【図６】関数の呼び出し履歴を分析する処理の手順の一例を示すフローチャートである。
【図７】関数の呼び出し履歴を分析する処理の手順の一例を示すフローチャートである。
【図８】関数の呼び出し履歴を分析する処理の手順の一例を示すフローチャートである。
【図９】基準データである商品在庫テーブルのレコード例を示す説明図である。
【図１０】変更データである商品在庫テーブルのレコード例を示す説明図である。
【図１１】差分データの一例を示す説明図である。
【図１２】基準データ実行履歴ファイルの内容の一例を示す説明図である。
【図１３】変更データ実行履歴ファイルの内容の一例を示す説明図である。
【図１４】基準データ関数別計測ファイルの内容の一例を示す説明図である。
【図１５】変更データ関数別計測ファイルの内容の一例を示す説明図である。
【図１６】関数別呼び出し履歴分析ファイルの内容の一例を示す説明図である。
【図１７】差分リストファイルの内容の一例を示す説明図である。
【図１８】基準データに基づく関数の分析情報と変更データに基づく関数の分析情報との差分を示す説明図である。
【図１９】解析対象プログラムの実行履歴における関数間の構造の一例を示す説明図である。
【発明を実施するための形態】
【０００９】
以下、実施の形態をその図面に基づいて説明する。本願に開示するプログラム解析装置をＰＣ（パーソナルコンピュータ）に適用した実施の形態について説明する。
なお、本発明は、以下の実施の形態に限定されるものではない。
【００１０】
図１は、プログラム解析装置１のハードウェア構成例を示すブロック図である。プログラム解析装置１は、ＣＰＵ（Central Processing Unit）１１、ＲＯＭ（Read Only Memory）１２、ＲＡＭ（Random Access Memory）１３、ハードディスク１４、ディスクドライブ１５、通信部１６、表示部１７及び操作部１８を含む。プログラム解析装置１のハードウェア各部は、バス１ｂを介して相互に接続されている。
【００１１】
ＣＰＵ１１は、プログラム解析装置１のハードウェア各部を制御する。ＣＰＵ１１は、ハードディスク１４に記録されたプログラム１ＰをＲＡＭ１３に読み込み、プログラム１Ｐを実行する。
【００１２】
ＲＯＭ１２は、プログラム解析装置１の起動時にＣＰＵ１１が実行するＢＩＯＳ（Basic Input/Output System）等を記録している。
ＲＡＭ１３は、例えばＳＲＡＭ（Static RAM）、ＤＲＡＭ（Dynamic RAM）であり、ＣＰＵ１１が実行する処理の過程で必要な作業変数、データ等を一時的に記録する。なお、ＲＡＭ１３は主記憶装置の一例であり、ＲＡＭ１３の代わりにフラッシュメモリ、メモリカード等が用いられてもよい。
【００１３】
ハードディスク１４は、ＣＰＵ１１が実行するプログラム１Ｐを記録している。
なお、ハードディスク１４は、プログラム解析装置１の内部に取り付けられるものであっても、プログラム解析装置１の外部に置かれるものであってもよい。また、ハードディスク１４は補助記憶装置の一例であり、大容量の情報の記録が可能なフラッシュメモリ、ＣＤ（Compact Disc）、ＤＶＤ（Digital Versatile Disk）、ＢＤ（Blu-ray Disc、登録商標）等の光ディスク１ａで代替してもよい。
【００１４】
ディスクドライブ１５は、外部の記録媒体であるＣＤ、ＤＶＤ、ＢＤ等の光ディスク１ａから情報を読み込み、光ディスク１ａに情報を記録する。ＣＰＵ１１は、操作部１８からディスクドライブ１５に対する光ディスク１ａの排出命令を受け付けた場合、ディスクドライブ１５の図示しないトレイを排出する。
【００１５】
通信部１６は、有線又は無線通信のモデム又はＬＡＮカード等であり、インターネットＮに接続されている。通信部１６は、電話回線と接続することができてもよい。
【００１６】
表示部１７は、例えば液晶ディスプレイ、有機ＥＬ（Electro-Luminescence）ディスプレイ、ＣＲＴ（Cathode Ray Tube）ディスプレイ等の画面を有し、ＣＰＵ１１からの指示に従って、プログラム１Ｐに係る各種情報を表示する。
【００１７】
操作部１８は、ユーザが各種の入力を行うキーボード、マウス、電源スイッチ、ディスクドライブ１５から光ディスク１ａを排出するための操作ボタン等の入力デバイスを含む。操作部１８は、ユーザによる操作に基づいて入力信号を生成する。生成された入力信号は、バス１ｂを介してＣＰＵ１１に送信される。
【００１８】
次に、プログラム解析装置１の動作の概略について説明する。
図２は、データ処理の流れの一例を示すデータフロー図である。対象プログラム実行部２１、関数呼び出し履歴計側部２２及び関数呼び出し履歴分析部２３は、ＣＰＵ１１がハードディスク１４に記録されたプログラム１Ｐに基づいて動作することにより実行される各機能部である。
【００１９】
対象プログラム実行部２１は、入力データを受け付ける。プログラム解析装置１が受け付けるデータには、この入力データの他に当該入力データの値又はデータ量を変更した変更データ（第２入力データ）ＣＤがある。そこで以後、変更データＣＤの元となる入力データを変更データＣＤと区別するために基準データＳＤ（第１入力データ）と呼ぶ。対象プログラム実行部２１は、受け付けた基準データＳＤに基づいて、解析対象プログラムを当該プログラムの機能単位毎に実行する。対象プログラム実行部２１は、基準データＳＤに基づいて実行した解析対象プログラムの実行履歴を取得する。対象プログラム実行部２１は、取得した解析対象プログラムの実行履歴を基準データ実行履歴ファイル（第１駆動履歴）２１Ｆとしてハードディスク１４に記録する。
【００２０】
対象プログラム実行部２１は、基準データＳＤの値又はデータ量を変更した変更データＣＤを受け付ける。対象プログラム実行部２１は、変更データＣＤに対しても基準データＳＤと同様に解析対象プログラムを機能単位毎に実行する。対象プログラム実行部２１は、変更データＣＤに基づいて解析対象プログラムを実行し、その実行履歴を取得する。対象プログラム実行部２１は、取得した実行履歴を変更データ実行履歴ファイル（第２駆動履歴）２１０Ｆとしてハードディスク１４に記録する。
【００２１】
基準データ実行履歴ファイル２１Ｆ及び変更データ実行履歴ファイル２１０Ｆには、ともに解析対象プログラムの実行履歴が行単位の文字列として記述されている。基準データ実行履歴ファイル２１Ｆ及び変更データ実行履歴ファイル２１０Ｆには、呼び出された関数に関する情報が記述された行と、呼び出された関数に関する情報が記述されていない行とを含む。なお、以下では関数の呼び出しと関数の実行は同じ意味である。呼び出された関数に関する情報が記述された行には、少なくとも呼び出された関数名と、関数の呼び出し開始を示す情報又は関数の呼び出し終了を示す情報とが記述されている。関数の呼び出し開始を示す情報又は関数の呼び出し終了を示す情報の有無により、呼び出された関数に関する情報が記述された行と、呼び出された関数に関する情報が記述されていない行とを判別することができる。なお、関数の呼び出し開始及び呼び出し終了を示す情報は、呼び出し開始と呼び出し終了とを判別することができるのであれば、記号、数式、語句、文等のいずれであってもよい。
【００２２】
関数呼び出し履歴計側部２２は、ハードディスク１４から基準データ実行履歴ファイル２１Ｆを先頭行から読み込み、関数の呼び出し回数、関数の呼び出し開始行、関数の呼び出し終了行を行番号に基づいて計測する。関数呼び出し履歴計側部２２は、計測結果を基準データ関数別計測ファイル（第１呼び出し履歴）２２Ｆとしてハードディスク１４に記録する。
【００２３】
関数呼び出し履歴計側部２２は、変更データ実行履歴ファイル２１０Ｆについても同様に関数の呼び出し回数、関数の呼び出し開始行、関数の呼び出し終了行を行番号に基づいて計測し、その計測結果を変更データ関数別計測ファイル（第２呼び出し履歴）２２０Ｆとしてハードディスク１４に記録する。
【００２４】
なお、基準データ実行履歴ファイル２１Ｆ及び変更データ実行履歴ファイル２１０Ｆには、行番号が記述されていてもよいし、記述されていなくてもよい。基準データ実行履歴ファイル２１Ｆ及び変更データ実行履歴ファイル２１０Ｆに行番号が記述されている場合、関数呼び出し履歴計側部２２は、当該行番号を利用して上述の計測を行う。一方、基準データ実行履歴ファイル２１Ｆ及び変更データ実行履歴ファイル２１０Ｆに行番号が記述されていない場合、関数呼び出し履歴計側部２２は、内部的に行番号をカウントしながら上述の計測を行う。
【００２５】
関数呼び出し履歴分析部２３は、ハードディスク１４から基準データ関数別計測ファイル２２Ｆ及び変更データ関数別計測ファイル２２０Ｆを読み込む。関数呼び出し履歴分析部２３は、基準データ関数別計測ファイル２２Ｆに記録された関数の呼び出し開始行及び呼び出し終了行の行番号に基づいて、関数毎に各種の行間距離を算出する。ここでの行間距離は、行番号の差である。なお、行間距離は、行番号の差に所定数を加算又は減算したものでもよいし、行番号の差に所定数を掛けたものでもよい。
関数呼び出し履歴分析部２３は、変更データ関数別計測ファイル２２０Ｆに記録された関数についても、呼び出し開始行及び呼び出し終了行の行番号に基づいて、関数毎に各種の行間距離を算出する。
【００２６】
関数呼び出し履歴分析部２３は、基準データＳＤ及び変更データＣＤに夫々対応する関数の呼び出し回数及び上記の行間距離が一覧形式に整理された情報を、関数別呼び出し履歴分析ファイル２３Ｆとしてハードディスク１４に記録する。関数呼び出し履歴分析部２３は、基準データＳＤに対応する関数の分析情報と変更データＣＤに対応する関数の分析情報とを比較し、この比較結果に基づいて各関数を数種類に分類する。関数呼び出し履歴分析部２３は、基準データＳＤと変更データＣＤとの差分である差分データＤＤを受け付ける。関数呼び出し履歴分析部２３は、分類した関数を受け付けた差分データＤＤと対応付けた態様で差分リストファイル２３０Ｆに出力する。
【００２７】
図２では、基準データＳＤの受け付けから基準データ関数別計測ファイル２２Ｆを出力するまでの処理フローと、変更データＣＤの受け付けから変更データ関数別計測ファイル２２０Ｆを出力するまでの処理フローとが並列に示されている。しかし、これらの処理フローは直列に実行されてもよい。
【００２８】
図２の対象プログラム実行部２１が実行する処理は、外部の情報処理装置が実行してもよい。かかる場合、プログラム解析装置１は、外部の情報処理装置が生成した基準データ実行履歴ファイル２１Ｆ及び変更データ実行履歴ファイル２１０Ｆをディスクドライブ１５又は通信部１６を介して受け付ける。あるいは、プログラム解析装置１は、フラッシュメモリ等の半導体メモリ１ｃを介して、基準データ実行履歴ファイル２１Ｆ及び変更データ実行履歴ファイル２１０Ｆを受け付けてもよい。関数呼び出し履歴計側部２２は、外部から受け付けた基準データ実行履歴ファイル２１Ｆ及び変更データ実行履歴ファイル２１０Ｆを用いて、関数の呼び出し履歴を計測する。
【００２９】
図３は、プログラム解析処理の手順の一例を示すフローチャートである。図３は、プログラム解析処理の全体的な概要を示している。
ＣＰＵ１１は、基準データＳＤ及び変更データＣＤを受け付ける（ステップＳ１０１）。ＣＰＵ１１は、受け付けた基準データＳＤ及び変更データＣＤに基づいて、解析対象プログラムを実行する（ステップＳ１０２）。ＣＰＵ１１は、基準データＳＤ及び変更データＣＤの全データに基づいて、解析対象プログラムを実行したか否か判定する（ステップＳ１０３）。ＣＰＵ１１は、基準データＳＤ及び変更データＣＤの全データに基づいて、解析対象プログラムを実行していないと判定した場合（ステップＳ１０３：ＮＯ）、ステップＳ１０２に処理を戻す。ＣＰＵ１１は、基準データＳＤ及び変更データＣＤの全データに基づいて、解析対象プログラムを実行したと判定した場合（ステップＳ１０３：ＹＥＳ）、基準データ実行履歴ファイル２１Ｆ及び変更データ実行履歴ファイル２１０Ｆを作成する（ステップＳ１０４）。
【００３０】
ＣＰＵ１１は、基準データ実行履歴ファイル２１Ｆ及び変更データ実行履歴ファイル２１０Ｆに基づいて、解析対象プログラムに含まれる関数の呼び出し回数、関数の呼び出し開始行及び関数の呼び出し終了行を計測する（ステップＳ１０５）。ＣＰＵ１１は、基準データ実行履歴ファイル２１Ｆ及び変更データ実行履歴ファイル２１０Ｆの全データに基づいて、解析対象プログラムに含まれる関数の呼び出し回数等、ステップＳ１０５で計測する項目を全て計測したか否か判定する（ステップＳ１０６）。ＣＰＵ１１は、基準データ実行履歴ファイル２１Ｆ及び変更データ実行履歴ファイル２１０Ｆの全データに基づいて、当該関数の呼び出し回数等、ステップＳ１０５で計測する項目を一つでも計測していないと判定した場合（ステップＳ１０６：ＮＯ）、ステップＳ１０５に処理を戻す。ＣＰＵ１１は、基準データ実行履歴ファイル２１Ｆ及び変更データ実行履歴ファイル２１０Ｆの全データに基づいて、当該関数の呼び出し回数等を計測したと判定した場合（ステップＳ１０６：ＹＥＳ）、ステップＳ１０７に処理を進める。ＣＰＵ１１は、計測結果に基づいて基準データ関数別計測ファイル２２Ｆ及び変更データ関数別計測ファイル２２０Ｆを作成する（ステップＳ１０７）。
【００３１】
ＣＰＵ１１は、基準データ関数別計測ファイル２２Ｆ及び変更データ関数別計測ファイル２２０Ｆに基づいて、関数毎に各種の行間距離を算出し、算出した行間距離が関数の呼び出し回数と対応付けられた関数別呼び出し履歴分析ファイル２３Ｆを作成する（ステップＳ１０８）。ＣＰＵ１１は、差分データＤＤを受け付ける（ステップＳ１０９）。ＣＰＵ１１は、基準データＳＤ及び変更データＣＤに夫々対応する関数の分析情報を比較することにより、関数を分類し、分類結果が差分データＤＤと対応付けられた差分リストファイル２３０Ｆを作成し（ステップＳ１１０）、処理を終える。
【００３２】
上述のステップＳ１０１からステップＳ１０４までの処理は、対象プログラム実行部２１が行う処理機能に該当する。ステップＳ１０５からステップＳ１０７までの処理は、関数呼び出し履歴計側部２２が行う処理機能に該当する。ステップＳ１０８からステップＳ１１０までの処理は、関数呼び出し履歴分析部２３が行う処理機能に該当する。
【００３３】
次に、プログラム解析装置１の動作について詳細に説明する。
本実施の形態では、対象プログラム実行部２１が解析対象プログラムを実行する前に、入力データである基準データＳＤと変更データＣＤとを用意する必要がある。基準データＳＤ及び変更データＣＤは、データベースのテーブルデータ、画面からの入力データ、ファイルのデータ等である。基準データＳＤは、既存の入力データでもよいし、手作業又は入力データ作成ソフト等により新規に作成されてもよい。
【００３４】
変更データＣＤは、基準データＳＤの値の一部若しくは全部を変更したデータ、又は基準データＳＤのデータ量を変更したデータである。基準データＳＤのデータ量の変更は、データの削除又はデータの追加により行われる。データの追加は、基準データＳＤの複製又は基準データＳＤから変更されたデータの追加により行われる。
【００３５】
基準データＳＤを変更する場合、基準データＳＤのデータ特性が考慮される。例えば、基準データＳＤがデータベースのテーブルレコードである場合、変更データＣＤは当該テーブルに関するテーブル制約及び列制約に整合するように基準データＳＤを変更することにより、作成される。
【００３６】
基準データＳＤ及び変更データＣＤが用意された段階で、基準データＳＤと変更データＣＤとの差分データＤＤが作成される。例えば、基準データＳＤ及び変更データＣＤがデータベースのテーブルデータである場合、テーブル名、差異が生じている列名、差異が生じているレコードの主キーデータ値等が差分に該当する。あるいは、基準データＳＤへのデータ削除又はデータ追加により変更データＣＤが作成された場合、削除されたレコードセット又は追加されたレコードセットの記録を差分データＤＤとしてもよい。
なお、基準データＳＤに対して最初に差分データＤＤを作成し、その後に基準データＳＤと差分データＤＤとから変更データＣＤを作成してもよい。
【００３７】
プログラム解析装置１のハードディスク１４に解析対象プログラムをインストールする。この解析対象プログラムは、機械語で記述されている。
また、用意した基準データＳＤ及び変更データＣＤをプログラム解析装置１のハードディスク１４に記録する。
【００３８】
ＣＰＵ１１は、基準データＳＤ及び変更データＣＤを解析対象プログラムに入力する。ＣＰＵ１１は解析対象プログラムを機能単位で実行し、基準データＳＤ及び変更データＣＤの夫々について解析対象プログラムの実行履歴を取得する。この実行履歴を取得するために、既存の技術が利用される。例えば、解析対象プログラムがＪＡＶＡ（登録商標）アプリケーションである場合、スタックの中身を実行履歴とし、仮想マシンにスタックトレースを出力させる。
ＣＰＵ１１は、基準データＳＤ及び変更データＣＤに基づいて実行された解析対象プログラムの実行履歴を夫々基準データ実行履歴ファイル２１Ｆ及び変更データ実行履歴ファイル２１０Ｆとしてハードディスク１４に記録する。
【００３９】
図４及び図５は、関数の呼び出し履歴を計側する処理の手順の一例を示すフローチャートである。以下は、基準データＳＤに係る基準データ実行履歴ファイル２１Ｆに基づく処理であるが、変更データＣＤに係る変更データ実行履歴ファイル２１０Ｆに基づく処理についても、ＣＰＵ１１は同様の処理を実行する。
以下のステップＳ２０２からステップＳ２１２までの処理は、基準データ実行履歴ファイル２１Ｆの１行についての処理であり、基準データ実行履歴ファイル２１Ｆの行数だけ繰り返し実行される。
【００４０】
ＣＰＵ１１は、基準データ実行履歴ファイル２１Ｆをハードディスク１４からＲＡＭ１３にロードする（ステップＳ２０１）。ＣＰＵ１１は、基準データ実行履歴ファイル２１Ｆから次の１行を読み込む（ステップＳ２０２）。ステップＳ２０２において、ＣＰＵ１１は基準データ実行履歴ファイル２１Ｆを開いた直後の場合、先頭の１行を読み込む。ＣＰＵ１１は、読み込んだ行から行番号と、関数名と、当該関数の呼び出し開始又は呼び出し終了の情報とを取得する（ステップＳ２０３）。なお、行番号は、基準データ実行履歴ファイル２１Ｆ又は変更データ実行履歴ファイル２１０Ｆの作成時に記述されてもよいし、ＣＰＵ１１がこれらのファイルから１行ずつデータを読み込む際に、カウントしてもよい。
【００４１】
ＣＰＵ１１は、ステップＳ２０３において関数名を取得したか否か判定する（ステップＳ２０４）。ＣＰＵ１１は、ステップＳ２０３において関数名を取得しなかったと判定した場合（ステップＳ２０４：ＮＯ）、ステップＳ２０２に処理を戻す。ＣＰＵ１１は、ステップＳ２０３において関数名を取得したと判定した場合（ステップＳ２０４：ＹＥＳ）、配列を読み込む（ステップＳ２０５）。この配列は基準データ実行履歴ファイル２１Ｆから読み込んだ関数名を格納する作業用配列である。
【００４２】
ＣＰＵ１１は、配列の中にステップＳ２０３で取得した関数名があるか否か判定する（ステップＳ２０６）。ＣＰＵ１１は、配列の中にステップＳ２０３で取得した関数名がないと判定した場合（ステップＳ２０６：ＮＯ）、配列にステップＳ２０３で取得した関数名を格納し（ステップＳ２０７）、ステップＳ２０８へ処理を移す。ＣＰＵ１１は、配列の中にステップＳ２０３で取得した関数名があると判定した場合（ステップＳ２０６：ＹＥＳ）、ステップＳ２０３で取得した情報が関数の呼び出し開始情報か否か判定する（ステップＳ２０８）。
【００４３】
ＣＰＵ１１は、ステップＳ２０３で取得した情報が関数の呼び出し開始情報であると判定した場合（ステップＳ２０８：ＹＥＳ）、当該関数の呼び出し回数をインクリメントする（ステップＳ２０９）。ＣＰＵ１１は、ステップＳ２０３で取得した行番号を当該関数の呼び出し開始行番号として記録し（ステップＳ２１０）、ステップＳ２１２へ処理を移す。ＣＰＵ１１は、ステップＳ２０３で取得した情報が関数の呼び出し開始情報でないと判定した場合（ステップＳ２０８：ＮＯ）、ステップＳ２０３で取得した行番号を当該関数の呼び出し終了行番号として記録し（ステップＳ２１１）、ステップＳ２１２へ処理を移す。ＣＰＵ１１は、基準データ実行履歴ファイル２１Ｆの全行を処理したか否か判定する（ステップＳ２１２）。ＣＰＵ１１は、基準データ実行履歴ファイル２１Ｆの全行を処理していないと判定した場合（ステップＳ２１２：ＮＯ）、ステップＳ２０２に処理を戻す。ＣＰＵ１１は、基準データ実行履歴ファイル２１Ｆの全行を処理したと判定した場合（ステップＳ２１２：ＹＥＳ）、処理を終了する。
【００４４】
図４及び図５の処理により、基準データＳＤ及び変更データＣＤに基づいて夫々呼び出された関数毎に呼び出し回数、呼び出し開始行番号及び呼び出し終了行番号がＲＡＭ１３に記録される。
呼び出し回数が複数回である関数の場合、複数の呼び出し開始行番号及び複数の呼び出し終了行番号がＲＡＭ１３に記録される。かかる場合、呼び出し開始行番号の数と呼び出し終了行番号の数とは同数である。
【００４５】
ＣＰＵ１１は、上述において計測した関数の呼び出し履歴を整理し、基準データ関数別計測ファイル２２Ｆ及び変更データ関数別計測ファイル２２０Ｆを作成する。
例えば、基準データ関数別計測ファイル２２Ｆを作成するために、ＣＰＵ１１は１つの関数について、関数名及び呼び出し回数をＲＡＭ１３に記録した関数の呼び出し履歴から抽出する。
ＣＰＵ１１は、当該関数の呼び出し開始が最初に取得された行番号をＲＡＭ１３に記録した関数の呼び出し履歴から抽出する。以後、この行番号を初出開始行と呼ぶ。
ＣＰＵ１１は、当該関数の呼び出し終了が最初に取得された行番号をＲＡＭ１３に記録した関数の呼び出し履歴から抽出する。以後、この行番号を初出終了行と呼ぶ。
ＣＰＵ１１は、当該関数の呼び出し開始が最後に取得された行番号をＲＡＭ１３に記録した関数の呼び出し履歴から抽出する。以後、この行番号を最終開始行と呼ぶ。
ＣＰＵ１１は、当該関数の呼び出し終了が最後に取得された行番号をＲＡＭ１３に記録した関数の呼び出し履歴から抽出する。以後、この行番号を最終終了行と呼ぶ。
【００４６】
ＣＰＵ１１は、１つの関数について、関数名、関数の呼び出し回数、初出開始行、初出終了行、最終開始行及び最終終了行を１レコードとする基準データ関数別計測ファイル２２Ｆを作成する。基準データ関数別計測ファイル２２Ｆは、ＣＰＵ１１が取得した関数の数だけこれらのレコードを含む。
【００４７】
同様に、ＣＰＵ１１は、変更データ実行履歴ファイル２１０Ｆに基づいて計測した関数の呼び出し履歴から、変更データ関数別計測ファイル２２０Ｆを作成する。変更データ関数別計測ファイル２２０Ｆのファイル形式は、基準データ関数別計測ファイル２２Ｆと同一である。すなわち、変更データ関数別計測ファイル２２０Ｆは、１つの関数について、関数名、関数の呼び出し回数、初出開始行、初出終了行、最終開始行及び最終終了行を含む。そして、変更データ関数別計測ファイル２２０Ｆは、ＣＰＵ１１が取得した関数の数だけこれらのレコードを含む。
ＣＰＵ１１は、作成した基準データ関数別計測ファイル２２Ｆ及び変更データ関数別計測ファイル２２０Ｆをハードディスク１４に記録する。
【００４８】
上述では、関数の呼び出し回数が複数回である関数の場合、複数の呼び出し開始行番号及び複数の呼び出し終了行番号がＲＡＭ１３に記録された。しかし、ＲＡＭ１３に記録する呼び出し開始行番号及び呼び出し終了行番号は、夫々２つずつでもよい。すなわち、ＣＰＵ１１は、初出開始行、初出終了行、最終開始行及び最終終了行を記録する領域を夫々１つずつＲＡＭ１３に確保する。ＣＰＵ１１は、関数の呼び出し開始の行を読み込んだ場合、初出開始行及び最終開始行に、読み込んだ行の行番号を記録する。ＣＰＵ１１は、次に再び関数の呼び出し開始の行を読み込んだ場合、初出開始行はそのままにし、最終開始行を新たに読み込んだ行の行番号に更新する。ＣＰＵ１１は、その後さらに関数の呼び出し開始の行を読み込んだ場合、次々と最終開始行だけを更新する。
ＣＰＵ１１は、関数の呼び出し終了の行を読み込んだ場合、初出終了行及び最終終了行に、読み込んだ行の行番号を記録する。ＣＰＵ１１は、次に再び関数の呼び出し終了の行を読み込んだ場合、初出終了行はそのままにし、最終終了行を新たに読み込んだ行の行番号に更新する。ＣＰＵ１１は、その後さらに関数の呼び出し終了の行を読み込んだ場合、次々と最終終了行だけを更新する。
【００４９】
図６、図７及び図８は、関数の呼び出し履歴を分析する処理の手順の一例を示すフローチャートである。
ＣＰＵ１１は、基準データ関数別計測ファイル２２Ｆをハードディスク１４からＲＡＭ１３にロードする（ステップＳ３０１）。ＣＰＵ１１は、基準データ関数別計測ファイル２２Ｆから次の１行を読み込む（ステップＳ３０２）。ステップＳ３０２において、ＣＰＵ１１は基準データ関数別計測ファイル２２Ｆを開いた直後の場合、先頭の１行を読み込む。ＣＰＵ１１は、関数名及び関数の呼び出し回数を取得する（ステップＳ３０３）。
【００５０】
ＣＰＵ１１は、初出開始行及び初出終了行を取得する（ステップＳ３０４）。ＣＰＵ１１は、初出開始行及び初出終了行の差を算出する（ステップＳ３０５）。以後、初出開始行及び初出終了行の差を関数行間距離と呼ぶ。
【００５１】
ＣＰＵ１１は、初出開始行及び最終開始行を取得する（ステップＳ３０６）。ＣＰＵ１１は、初出開始行及び最終開始行の差を算出する（ステップＳ３０７）。以後、初出開始行及び最終開始行の差を開始行間距離と呼ぶ。
【００５２】
ＣＰＵ１１は、基準データ関数別計測ファイル２２Ｆの全行、すなわち全関数についてステップＳ３０２からステップＳ３０７までの処理を実行したか否か判定する（ステップＳ３０８）。ＣＰＵ１１は、基準データ関数別計測ファイル２２Ｆの全関数についてステップＳ３０２からステップＳ３０７までの処理を実行しなかったと判定した場合（ステップＳ３０８：ＮＯ）、ステップＳ３０２に処理を戻す。ＣＰＵ１１は、基準データ関数別計測ファイル２２Ｆの全関数についてステップＳ３０２からステップＳ３０７までの処理を実行したと判定した場合（ステップＳ３０８：ＹＥＳ）、ステップＳ３０９に処理を進める。
【００５３】
ＣＰＵ１１は、変更データ関数別計測ファイル２２０Ｆの全関数についてステップＳ３０２からステップＳ３０８の処理を実行したか否か判定する（ステップＳ３０９）。ＣＰＵ１１は、変更データ関数別計測ファイル２２０Ｆの全関数についてステップＳ３０２からステップＳ３０８の処理を実行していないと判定した場合（ステップＳ３０９：ＮＯ）、ステップＳ３０１に処理を戻す。なお、ＣＰＵ１１は、ステップＳ３０１に戻った後、ステップＳ３０１からステップＳ３０８までの処理について、基準データ関数別計測ファイル２２Ｆを変更データ関数別計測ファイル２２０Ｆに置き換えて、実行する。
ＣＰＵ１１は、変更データ関数別計測ファイル２２０Ｆの全関数についてステップＳ３０２からステップＳ３０８の処理を実行したと判定した場合（ステップＳ３０９：ＹＥＳ）、ステップＳ３１０に処理を進める。
【００５４】
ここまでの段階で、基準データＳＤ及び変更データＣＤに基づいて実行された解析対象プログラムの関数に関する呼び出し履歴の分析情報が、関数別にＲＡＭ１３に記録されている。この分析情報は、関数名、呼び出し回数、関数行間距離及び開始行間距離を含む。
なお、関数行間距離は、初出開始行及び初出終了行の差に限らず、最終開始行及び最終終了行の差であってもよい。あるいは、関数行間距離は、関数の呼び出し開始がｎ回目（ただし、ｎは自然数）に取得された行番号と、関数の呼び出し終了がｎ回目に取得された行番号との差であってもよい。すなわち、関数行間距離は、関数の呼び出し開始及び呼び出し終了が夫々同一の呼び出し回数目に取得された行番号同士の差であってもよい。
また、開始行間距離は、初出開始行及び最終開始行の差に限らず、初出終了行及び最終終了行の差であってもよい。
【００５５】
ＣＰＵ１１は、基準データＳＤに基づく関数の分析情報と、変更データＣＤに基づく関数の分析情報とを関数毎に対応付け、その結果を関数別呼び出し履歴分析ファイル２３Ｆとしてハードディスク１４に記録する（ステップＳ３１０）。関数別呼び出し履歴分析ファイル２３Ｆは、関数名、基準データＳＤに基づく関数の分析情報及び変更データＣＤに基づく関数の分析情報を１レコードとし、解析対象プログラムの実行履歴から取得された関数の数だけレコード数を有する。ただし、基準データＳＤに基づく関数の分析情報又は変更データＣＤに基づく関数の分析情報のうち、一方にのみ含まれる関数がある場合、関数別呼び出し履歴分析ファイル２３Ｆは、存在しない分析情報のデータ部分を空データとする。
この段階では、ＲＡＭ１３に関数別呼び出し履歴分析ファイル２３Ｆの内容が記録されている。
【００５６】
ＣＰＵ１１は、ＲＡＭ１３上の関数別呼び出し履歴分析ファイル２３Ｆから次の１行を読み込む（ステップＳ３１１）。ステップＳ３１１において、ＣＰＵ１１は最初の処理時には先頭の１行を読み込む。ＣＰＵ１１は、基準データＳＤに基づく関数の分析情報又は変更データＣＤに基づく関数の分析情報のうち、一方の分析情報にのみ存在する関数があるか否か判定する（ステップＳ３１２）。ＣＰＵ１１は、基準データＳＤに基づく関数の分析情報又は変更データＣＤに基づく関数の分析情報のうち、一方の分析情報にのみ存在する関数があると判定した場合（ステップＳ３１２：ＹＥＳ）、当該関数を一方の分析情報にのみ存在する関数として抽出し（ステップＳ３１３）、ステップＳ３１１に処理を戻す。ＣＰＵ１１は、基準データＳＤに基づく関数の分析情報又は変更データＣＤに基づく関数の分析情報のうち、一方の分析情報にのみ存在する関数はないと判定した場合（ステップＳ３１２：ＮＯ）、ステップＳ３１４に処理を進める。
【００５７】
ＣＰＵ１１は、双方の分析情報に記録された呼び出し回数が同じか否か判定する（ステップＳ３１４）。ＣＰＵ１１は、双方の分析情報に記録された呼び出し回数が同じでないと判定した場合（ステップＳ３１４：ＮＯ）、当該関数を呼び出し回数が異なる関数として抽出し（ステップＳ３１５）、ステップＳ３１６に処理を進める。ＣＰＵ１１は、双方の分析情報に記録された呼び出し回数が同じであると判定した場合（ステップＳ３１４：ＹＥＳ）、双方の分析情報に記録された関数行間距離が同じか否か判定する（ステップＳ３１６）。
【００５８】
ＣＰＵ１１は、双方の分析情報に記録された関数行間距離が同じでないと判定した場合（ステップＳ３１６：ＮＯ）、当該関数を関数行間距離が異なる関数として抽出し（ステップＳ３１７）、ステップＳ３１８に処理を進める。ＣＰＵ１１は、双方の分析情報に記録された関数行間距離が同じであると判定した場合（ステップＳ３１６：ＹＥＳ）、双方の分析情報に記録された開始行間距離が同じか否か判定する（ステップＳ３１８）。ＣＰＵ１１は、双方の分析情報に記録された開始行間距離が同じでないと判定した場合（ステップＳ３１８：ＮＯ）、当該関数を開始行間距離が異なる関数として抽出し（ステップＳ３１９）、ステップＳ３２０に処理を進める。ＣＰＵ１１は、双方の分析情報に記録された開始行間距離が同じであると判定した場合（ステップＳ３１８：ＹＥＳ）、全行について、すなわち全関数についてステップＳ３１１からステップＳ３１９までの処理を実行したか否か判定する（ステップＳ３２０）。
【００５９】
ＣＰＵ１１は、全関数についてステップＳ３１１からステップＳ３１９までの処理を実行していないと判定した場合（ステップＳ３２０：ＮＯ）、ステップＳ３１１に処理を戻す。ＣＰＵ１１は、全関数についてステップＳ３１１からステップＳ３１９までの処理を実行したと判定した場合（ステップＳ３２０：ＮＯ）、差分データＤＤを受け付ける（ステップＳ３２１）。ＣＰＵ１１は、上述で抽出した関数のリストを差分リストファイル２３０Ｆとしてハードディスク１４に記録し（ステップＳ３２２）、処理を終える。差分リストファイル２３０Ｆは、一方の分析情報にのみ存在する関数、呼び出し回数が異なる関数、関数行間距離が異なる関数及び開始行間距離が異なる関数を含み、これらの関数毎に対応する差分データＤＤが特定可能な態様で記録されている。
【００６０】
差分リストファイル２３０Ｆから関数の動作を推定することにより、解析対象プログラムの動作を把握することができる。
一方の分析情報にのみ存在する関数は、入力データの変化によって実行されなかった関数が実行されるように変化した関数又は実行された関数が実行されないように変化した関数である。例えば、一方の分析情報にのみ存在する関数は、例外処理、エラー処理等を実行する関数を含む。入力データの値又は量が変化した場合、関数の設計仕様によっては例外処理又はエラー処理の関数が呼び出されることがある。
【００６１】
なお、一方の分析情報にのみ存在する関数は、一方の分析情報における呼び出し回数が１回以上であり、他方の分析情報における呼び出し回数が０回である関数である。従って、一方の分析情報にのみ存在する関数であるか否かは、呼び出し回数に基づいて判定されてもよい。一方の分析情報にのみ存在する関数は、呼び出し回数が異なる関数に含めて分類されてもよい。
【００６２】
呼び出し回数が異なる関数は、入力データの変化によって呼び出し回数が変化した関数である。例えば、入力データ１件に対して１回呼び出される関数は、入力データの量変化に相関して呼び出し回数が変化すると考えられる。あるいは、入力データの値が変化することにより、関数の呼び出し回数が変化する場合がある。例えば、入力データが日付型であり、関数が１日分の処理ごとに１回ずつ呼び出される場合、１週間後の日付を入力したときと１カ月後の日付を入力したときとで、関数の呼び出し回数は変化すると考えられる。
【００６３】
関数行間距離が異なる関数は、入力データの変化によって関数の初出の呼び出し開始行と関数の初出の呼び出し終了行との間の行数が変化した関数である。関数行間距離は、関数が複数回呼び出されたとしても、２回目以降の呼び出し履歴は除外している。関数行間距離は、１回目の呼び出しにおける関数のステップ数変化を反映した情報を記録していると考えられる。
例えば、関数が解析対象プログラムの中で上位の機能を有し、当該関数から別の関数が呼び出されて処理が実行される場合がある。かかる場合、呼び出し先の別の関数の呼び出し回数が変化したとき、呼び出し元の関数の関数行間距離は変化する。従って、関数行間距離が異なる関数は、解析対象プログラムにおいて上位の機能を有する可能性がある。
なお、ここでのステップ数とは、解析対象プログラムの実行履歴（駆動履歴）の各行から取得される関数のステップ数であり、解析対象プログラムのソースコードにおけるステップ数とは異なる場合が含まれる。
【００６４】
開始行間距離が異なる関数は、入力データの変化によって関数の初出の呼び出し開始行と関数の最終の呼び出し開始行との間の行数が変化した関数である。開始行間距離は、ステップ数に応じた情報処理量が反映される情報である。入力データの変化によって自身の呼び出し回数が増減した場合、開始行間距離も増減する。
一方、入力データが変化しても自身の呼び出し回数は変わらない関数がある。かかる場合、開始行間距離が異なる関数は、自身から呼び出す別の関数を有し、この別の関数を呼び出す回数を変化させた可能性がある。この場合、開始行間距離が異なる関数は、解析対象プログラムにおいて上位の機能を有する可能性がある。
入力データが変化しても開始行間距離が異なる関数の呼び出し回数が変わらない場合、他の解釈も考え得る。例えば、入力データの変化によって、関数の初出の呼び出し開始行と関数の最終の呼び出し開始行との間に、割り込み処理を実行する関数が呼び出されることが考えられる。あるいは、入力データの変化によって、ステップ数が異なる複数の関数の実行順序が変化した可能性が考えられる。
【００６５】
差分リストファイル２３０Ｆの解釈には多様性があり、一義的に関数の動作が特定されない場合がある。上述は差分リストファイル２３０Ｆの解釈の一例である。差分リストファイル２３０Ｆの解釈は、具体的な差分データＤＤとの対応に基づいて行われる。また、差分リストファイル２３０Ｆの解釈には、他の情報が利用されてよい。例えば、基準データ実行履歴ファイル２１Ｆ又は変更データ実行履歴ファイル２１０Ｆが差分リストファイル２３０Ｆの解釈に利用されてよい。また、解析対象プログラムがオブジェクト指向言語で作成されている場合、クラスの継承、クラスとそれに属するメソッド等の情報が差分リストファイル２３０Ｆの解釈に利用されてよい。すなわち、言語特性が差分リストファイル２３０Ｆの解釈に利用されてよい。設計仕様書、要求仕様書等が入手可能な場合、これらのドキュメントが差分リストファイル２３０Ｆの解釈に利用されてよいことは勿論である。
【００６６】
次に、上述したプログラム解析装置１の動作を、具体的な例を用いて説明する。
まず、入力データである基準データＳＤ及び変更データＣＤについて説明する。基準データＳＤ及び変更データＣＤとして、データベースのテーブルレコードを扱う。
図９は、基準データＳＤである商品在庫テーブルのレコード例を示す説明図である。商品在庫テーブルは、商品の在庫を管理するテーブルである。商品在庫テーブルは、商品コード、商品名、登録日時及び在庫数の各列を含む。商品コードは、商品の識別コードを格納し、商品在庫テーブルの主キーである。商品名は、商品の名称を格納する。登録日時は、在庫数が変化したときの日時を格納する。在庫数は、商品の在庫数を格納する。基準データＳＤの総数は２件である。
【００６７】
図１０は、変更データＣＤである商品在庫テーブルのレコード例を示す説明図である。変更データＣＤは、基準データＳＤに対して４レコードが追加されたデータであり、その総数は６件である。追加データの登録日時及び在庫数は、基準データＳＤの先頭レコードの登録日時及び在庫数を複製している。追加データの商品コード及び商品名には、基準データＳＤの商品コード及び商品名と重複しない値が格納されている。
【００６８】
図１１は、差分データＤＤの一例を示す説明図である。差分データＤＤは、基準データＳＤと変更データＣＤとの差分であるレコードが格納されたテーブル名と、差分レコードとを含む。差分レコードは、主キーである商品コードの値を列挙することにより示されている。
本実施例では、基準データＳＤ及び変更データＣＤの組は１組であるため、差分データＤＤは１種類である。しかし、基準データＳＤ及び変更データＣＤの組を複数用意した場合、各組ごとに差分データＤＤを作成する。
【００６９】
プログラム解析装置１に基準データＳＤを入力し、解析対象プログラムを実行する。プログラム解析装置１は、解析対象プログラムの実行履歴を取得し、取得した実行履歴を基準データ実行履歴ファイル２１Ｆとしてハードディスク１４に出力する。
同様に、プログラム解析装置１に変更データＣＤを入力し、解析対象プログラムの実行履歴を変更データ実行履歴ファイル２１０Ｆとしてハードディスク１４に出力させる。
【００７０】
図１２は、基準データ実行履歴ファイル２１Ｆの内容の一例を示す説明図である。図１３は、変更データ実行履歴ファイル２１０Ｆの内容の一例を示す説明図である。
図１２及び図１３は、解析対象プログラムの同一機能を実行した場合の実行履歴を示している。各行の左端の数字は行番号である。なお、基準データ実行履歴ファイル２１Ｆ及び変更データ実行履歴ファイル２１０Ｆは、行番号が記録されていてもよいし、記録されていなくてもよい。
【００７１】
基準データ実行履歴ファイル２１Ｆの１行目左端の＞は、関数の呼び出し開始を示す記号である。その右隣りのｔｏｐｌｉｓｔ１は関数名である。従って、＞ｔｏｐｌｉｓｔ１は、関数ｔｏｐｌｉｓｔ１の呼び出し開始を示している。基準データ実行履歴ファイル２１Ｆの２行目から５行目までは、関数内部に記述された命令文乃至制御文等である。６行目の＞ｉｎｉｔ１は、関数ｉｎｉｔ１の呼び出し開始を示している。７行目左端の＜は、関数の呼び出し終了を示す記号である。従って、＜ｉｎｉｔ１は、関数ｉｎｉｔ１の呼び出し終了を示している。
【００７２】
変更データ実行履歴ファイル２１０Ｆにおける記号の意味は、基準データ実行履歴ファイル２１Ｆにおける記号の意味と同じである。基準データ実行履歴ファイル２１Ｆの先頭から最終行まで読むことにより、関数の呼び出し開始及び呼び出し終了を関数毎に時系列で追跡することができる。同様に変更データ実行履歴ファイル２１０Ｆの先頭から最終行まで読むことにより、関数の呼び出し開始及び呼び出し終了を関数毎に時系列で追跡することができる。
【００７３】
プログラム解析装置１は、基準データ実行履歴ファイル２１Ｆ及び変更データ実行履歴ファイル２１０Ｆを入力データとして、夫々基準データ関数別計測ファイル２２Ｆ及び変更データ関数別計測ファイル２２０Ｆをハードディスク１４に出力する。
【００７４】
図１４は、基準データ関数別計測ファイル２２Ｆの内容の一例を示す説明図である。基準データ関数別計測ファイル２２Ｆは、関数名、初出開始行、初出終了行、最終開始行、最終終了行及び呼び出し回数の各列を含む。関数名は、基準データ実行履歴ファイル２１Ｆから抽出された関数名である。初出開始行は、関数の呼び出し開始が最初に読み込まれた行番号である。初出終了行は、関数の呼び出し終了が最初に読み込まれた行番号である。最終開始行は、関数の呼び出し開始が最後に読み込まれた行番号である。最終終了行は、関数の呼び出し終了が最後に読み込まれた行番号である。呼び出し回数は、関数が呼び出された回数である。
【００７５】
ここで、ＣＰＵ１１が基準データ実行履歴ファイル２１Ｆを読み込み、基準データ関数別計測ファイル２２Ｆを出力するまでの流れについて詳細に説明する。
ＣＰＵ１１は、基準データ実行履歴ファイル２１Ｆの１行目を読み込み、ｔｏｐｌｉｓｔ１の関数名と、ｔｏｐｌｉｓｔ１の呼び出し開始が１行目にあることとを取得する。ＣＰＵ１１は、作業用の配列を参照し、ｔｏｐｌｉｓｔ１がこの配列に格納されていないことから、初めて登場した関数としてｔｏｐｌｉｓｔ１を配列に格納する。ＣＰＵ１１は、＞の記号から１行目は呼び出し開始情報であると判定し、ｔｏｐｌｉｓｔ１の呼び出し回数を０から１にインクリメントする。１行目はｔｏｐｌｉｓｔ１の呼び出し開始の最初に相当するので、ＣＰＵ１１は、ｔｏｐｌｉｓｔ１の初出開始行に１を記録する。また、現時点で１行目はｔｏｐｌｉｓｔ１の呼び出し開始の最後に相当するので、ＣＰＵ１１はｔｏｐｌｉｓｔ１の最終開始行に１を記録する。
【００７６】
ＣＰＵ１１は、基準データ実行履歴ファイル２１Ｆの２行目を読み込む。２行目は「a＝１」とあり、関数の呼び出し情報ではないので、ＣＰＵ１１は２行目を無視し、３行目を読み込む。以降、２行目と同じ理由から３行目、４行目及び５行目をＣＰＵ１１は無視する。
【００７７】
ＣＰＵ１１は、基準データ実行履歴ファイル２１Ｆの６行目を読み込む。ＣＰＵ１１は、ｉｎｉｔ１の関数名と、ｉｎｉｔ１の呼び出し開始が６行目にあることを取得する。ＣＰＵ１１は、配列を参照し、ｉｎｉｔ１が配列に格納されていないことから、初めて登場した関数としてｉｎｉｔ１を配列に格納する。ＣＰＵ１１は、ｉｎｉｔ１の呼び出し回数を０から１にインクリメントする。ＣＰＵ１１は、ｉｎｉｔ１の初出開始行及び最終開始行に６を記録する。
【００７８】
ＣＰＵ１１は、基準データ実行履歴ファイル２１Ｆの７行目を読み込む。ＣＰＵ１１は、ｉｎｉｔ１の関数名と、ｉｎｉｔ１の呼び出し終了が７行目にあることを取得する。ＣＰＵ１１は、配列を参照し、ｉｎｉｔ１が配列に既に格納されていることから、配列にｉｎｉｔ１を格納しない。また、ＣＰＵ１１は、ｉｎｉｔ１の呼び出し回数をインクリメントしない。７行目はｉｎｉｔ１の呼び出し終了の最初に相当するので、ＣＰＵ１１はｉｎｉｔ１の初出終了行に７を更新する。現時点で７行目はｉｎｉｔ１の呼び出し終了の最後に相当するので、ＣＰＵ１１はｉｎｉｔ１の最終終了行に７を記録する。
【００７９】
ＣＰＵ１１は、基準データ実行履歴ファイル２１Ｆの８行目を読み込む。ＣＰＵ１１は、ｉｔｅｍ１の関数名と、ｉｔｅｍ１の呼び出し開始が８行目にあることを取得する。ＣＰＵ１１は、初めて登場した関数としてｉｔｅｍ１を配列に格納する。ＣＰＵ１１は、ｉｔｅｍ１の呼び出し回数を０から１にインクリメントする。ＣＰＵ１１は、ｉｔｅｍ１の初出開始行及び最終開始行に８を記録する。
【００８０】
ＣＰＵ１１は、基準データ実行履歴ファイル２１Ｆの９行目を読み込む。ＣＰＵ１１は、ｉｔｅｍ１の関数名と、ｉｔｅｍ１の呼び出し終了が９行目にあることを取得する。ＣＰＵ１１は、配列を参照し、ｉｔｅｍ１が配列に既に格納されていることから、配列にｉｔｅｍ１を格納しない。また、ＣＰＵ１１は、ｉｔｅｍ１の呼び出し回数をインクリメントしない。９行目はｉｔｅｍ１の呼び出し終了の最初に相当するので、ＣＰＵ１１はｉｔｅｍ１の初出終了行に９を記録する。現時点で９行目はｉｔｅｍ１の呼び出し終了の最後に相当するので、ＣＰＵ１１はｉｔｅｍ１の最終終了行に９を記録する。
【００８１】
ＣＰＵ１１は、基準データ実行履歴ファイル２１Ｆの１０行目を読み込む。ＣＰＵ１１は、ｉｔｅｍ１の関数名と、ｉｔｅｍ１の呼び出し開始が１０行目にあることを取得する。ＣＰＵ１１は、配列を参照し、ｉｔｅｍ１が配列に既に格納されていることから、配列にｉｔｅｍ１を格納しない。また、ＣＰＵ１１は、ｉｔｅｍ１の呼び出し回数を１から２にインクリメントする。ｉｔｅｍ１は初出ではないため、ＣＰＵ１１は初出開始行を更新しない。ＣＰＵ１１は、ｉｔｅｍ１の最終開始行を８から１０に上書き更新する。
【００８２】
ＣＰＵ１１は、基準データ実行履歴ファイル２１Ｆの１１行目を読み込む。ＣＰＵ１１は、ｉｔｅｍ１の関数名と、ｉｔｅｍ１の呼び出し終了が１１行目にあることを取得する。ＣＰＵ１１は、配列を参照し、ｉｔｅｍ１が配列に既に格納されていることから、配列にｉｔｅｍ１を格納しない。また、ＣＰＵ１１は、ｉｔｅｍ１の呼び出し回数をインクリメントしない。１１行目はｉｔｅｍ１の呼び出し終了の最初ではないので、ＣＰＵ１１はｉｔｅｍ１の初出終了行を更新しない。ＣＰＵ１１は、ｉｔｅｍ１の最終終了行を９から１１に上書き更新する。
【００８３】
ＣＰＵ１１は、基準データ実行履歴ファイル２１Ｆの１２行目を読み込む。ＣＰＵ１１は、ｉｎｉｔ１の関数名と、ｉｎｉｔ１の呼び出し開始が１２行目にあることを取得する。ＣＰＵ１１は、配列を参照し、ｉｎｉｔ１が配列に既に格納されていることから、配列にｉｎｉｔ１を格納しない。また、ＣＰＵ１１は、ｉｎｉｔ１の呼び出し回数を１から２にインクリメントする。ｉｎｉｔ１は初出ではないため、ＣＰＵ１１は初出開始行を更新しない。ＣＰＵ１１は、ｉｎｉｔ１の最終開始行を６から１２に上書き更新する。
【００８４】
ＣＰＵ１１は、基準データ実行履歴ファイル２１Ｆの１３行目を読み込む。ＣＰＵ１１は、ｉｎｉｔ１の関数名と、ｉｎｉｔ１の呼び出し終了が１３行目にあることを取得する。ＣＰＵ１１は、配列を参照し、ｉｎｉｔ１が配列に既に格納されていることから、配列にｉｎｉｔ１を格納しない。また、ＣＰＵ１１は、ｉｎｉｔ１の呼び出し回数をインクリメントしない。ｉｎｉｔ１の呼び出し終了は初出ではないため、ＣＰＵ１１は初出終了行を更新しない。ＣＰＵ１１は、ｉｎｉｔ１の最終終了行を７から１３に上書き更新する。
【００８５】
ＣＰＵ１１は、基準データ実行履歴ファイル２１Ｆの１４行目を読み込む。ＣＰＵ１１は、ｔｏｐｌｉｓｔ１の関数名と、ｔｏｐｌｉｓｔ１の呼び出し終了が１４行目にあることを取得する。ＣＰＵ１１は、配列を参照し、ｔｏｐｌｉｓｔ１が配列に既に格納されていることから、配列にｔｏｐｌｉｓｔ１を格納しない。また、ＣＰＵ１１は、ｔｏｐｌｉｓｔ１の呼び出し回数をインクリメントしない。ｔｏｐｌｉｓｔ１の呼び出し終了は初出であるため、ＣＰＵ１１はｔｏｐｌｉｓｔ１の初出終了行に１４を記録する。ＣＰＵ１１は、ｔｏｐｌｉｓｔ１の最終終了行に１４を記録する。
【００８６】
ＣＰＵ１１は、基準データ実行履歴ファイル２１ＦのＥＯＦ（End Of File）を取得する。ＣＰＵ１１は、上述の関数の呼び出し履歴について計測した結果を基準データ関数別計測ファイル２２Ｆとしてハードディスク１４に記録する。図１４の基準データ関数別計測ファイル２２Ｆは、ＣＰＵ１１が基準データ実行履歴ファイル２１Ｆについて計測処理を実行した最終状態を示している。
【００８７】
図１５は、変更データ関数別計測ファイル２２０Ｆの内容の一例を示す説明図である。
ＣＰＵ１１は、基準データ実行履歴ファイル２１Ｆについて実行した処理と同じ処理を変更データ実行履歴ファイル２１０Ｆについても実行する。図１３に示す変更データ実行履歴ファイル２１０Ｆの場合、１２行目以降の部分に基準データ実行履歴ファイル２１Ｆとの差がある。ＣＰＵ１１は、基準データ実行履歴ファイル２１Ｆよりもｉｔｅｍ１が４回多く登場することを変更データ関数別計測ファイル２２０Ｆに記録する。図１５の変更データ関数別計測ファイル２２０Ｆは、ＣＰＵ１１が変更データ実行履歴ファイル２１０Ｆについて計測処理を実行した最終状態を示している。
【００８８】
図１６は、関数別呼び出し履歴分析ファイル２３Ｆの内容の一例を示す説明図である。関数別呼び出し履歴分析ファイル２３Ｆは、基準データ関数別計測ファイル２２Ｆ及び変更データ関数別計測ファイル２２０Ｆのデータに基づいて作成される。
【００８９】
関数別呼び出し履歴分析ファイル２３Ｆは、関数名、基準データＳＤに基づく関数の分析情報及び変更データＣＤに基づく関数の分析情報を含む。基準データＳＤ及び変更データＣＤに基づく関数の分析情報は、ともに呼び出し回数、開始行間距離及び関数行間距離を含む。関数名は、基準データ関数別計測ファイル２２Ｆ又は変更データ関数別計測ファイル２２０Ｆに含まれる関数名である。呼び出し回数は、基準データ関数別計測ファイル２２Ｆ及び変更データ関数別計測ファイル２２０Ｆに含まれる関数の呼び出し回数である。開始行間距離は、基準データ関数別計測ファイル２２Ｆ及び変更データ関数別計測ファイル２２０Ｆに夫々含まれる初出開始行及び最終開始行の差である。関数行間距離は、基準データ関数別計測ファイル２２Ｆ及び変更データ関数別計測ファイル２２０Ｆに夫々含まれる初出開始行及び初出終了行の差である。
【００９０】
ここで、ＣＰＵ１１が基準データ関数別計測ファイル２２Ｆを読み込み、関数別呼び出し履歴分析ファイル２３Ｆを出力するまでの流れについて説明する。
ＣＰＵ１１は、基準データ関数別計測ファイル２２Ｆの１行目を読み込む。ＣＰＵ１１は、関数名ｔｏｐｌｉｓｔ１及び呼び出し回数１を取得する。ＣＰＵ１１は、最終開始行１と初出開始行１との差から開始行間距離０を取得する。ＣＰＵ１１は、初出終了行１４と初出開始行１との差から関数行間距離１３を取得する。
【００９１】
ＣＰＵ１１は、基準データ関数別計測ファイル２２Ｆの２行目及び３行目を読み込み、上述と同様に夫々関数名、呼び出し回数、開始行間距離及び関数行間距離を取得する。
ＣＰＵ１１は、変更データ関数別計測ファイル２２０Ｆの各行からも同様に、夫々関数名、呼び出し回数、開始行間距離及び関数行間距離を取得する。
【００９２】
ＣＰＵ１１は、取得した基準データＳＤに基づく関数の分析情報及び変更データＣＤに基づく関数の分析情報に対して、関数名が一致するもの同士を対応付ける。ＣＰＵ１１は、関数毎に基準データＳＤに基づく関数の分析情報及び変更データＣＤに基づく関数の分析情報を１レコードとする関数別呼び出し履歴分析ファイル２３Ｆを作成する。図１６の関数別呼び出し履歴分析ファイル２３Ｆの例では、ｔｏｐｌｉｓｔ１、ｉｔｅｍ１及びｉｎｉｔ１の３関数についての３レコードが示されている。
【００９３】
ただし、基準データＳＤに基づく関数の分析情報又は変更データＣＤに基づく関数の分析情報のうち、一方にのみ含まれる関数がある場合、ＣＰＵ１１は関数の対応付けをすることができない。かかる場合、ＣＰＵ１１は、存在しない分析情報のデータを空データとする。例えば、関数ｉｔｅｍ１の分析情報が基準データＳＤに基づく関数の分析情報に存在し、変更データＣＤに基づく関数の分析情報に存在しない場合、ＣＰＵ１１は、図１６において変更データＣＤに基づくｉｔｅｍ１の分析情報の欄を空欄とする。
【００９４】
図１７は、差分リストファイル２３０Ｆの内容の一例を示す説明図である。差分リストファイル２３０Ｆは、差分データＤＤ及び関数別呼び出し履歴分析ファイル２３Ｆのデータに基づいて作成される。すなわち、差分リストファイル２３０Ｆは、基準データＳＤに基づく関数の分析情報又は変更データＣＤに基づく関数の分析情報を比較することにより作成される。
【００９５】
差分リストファイル２３０Ｆは、差分データＤＤ、一方の分析情報にのみ存在する関数、呼び出し回数が異なる関数、開始行間距離が異なる関数及び関数行間距離が異なる関数の各リストを含む。差分データＤＤは、基準データＳＤと変更データＣＤとの差分に相当するデータである。一方の分析情報にのみ存在する関数は、入力データの変化によって実行されなかった関数が実行されるように変化した関数又は実行された関数が実行されないように変化した関数である。呼び出し回数が異なる関数は、入力データの変化によって呼び出し回数が変化した関数である。開始行間距離が異なる関数は、入力データの変化によって関数の初出の呼び出し開始行と関数の最終の呼び出し開始行との間の行数が変化した関数である。関数行間距離が異なる関数は、入力データの変化によって関数の初出の呼び出し開始行と関数の初出の呼び出し終了行との間の行数が変化した関数である。
【００９６】
ここで、ＣＰＵ１１が関数別呼び出し履歴分析ファイル２３Ｆを読み込み、差分リストファイル２３０Ｆを出力するまでの流れについて説明する。
ＣＰＵ１１は、関数別呼び出し履歴分析ファイル２３Ｆの１行目を読み込む。
ＣＰＵ１１は、基準データＳＤに基づく関数の分析情報又は変更データＣＤに基づく関数の分析情報のうち、一方の分析情報にのみ存在する関数があるか否か判定する。ｔｏｐｌｉｓｔ１は双方の関数の分析情報に含まれているため、ＣＰＵ１１はｔｏｐｌｉｓｔ１の有無に差分はないと判定する。
ＣＰＵ１１は、双方の分析情報に記録されたｔｏｐｌｉｓｔ１の呼び出し回数が同じか否か判定する。呼び出し回数は夫々１、１であり同一なので、ＣＰＵ１１は、ｔｏｐｌｉｓｔ１は呼び出し回数が異なる関数ではないと判定する。
ＣＰＵ１１は、双方の分析情報に記録されたｔｏｐｌｉｓｔ１の開始行間距離が同じか否か判定する。開始行間距離は夫々０、０なので、ＣＰＵ１１は、ｔｏｐｌｉｓｔ１は開始行間距離が異なる関数ではないと判定する。
ＣＰＵ１１は、双方の分析情報に記録されたｔｏｐｌｉｓｔ１の関数行間距離が同じか否か判定する。関数行間距離は、夫々１３、２１であり異なるので、ＣＰＵ１１は、ｔｏｐｌｉｓｔ１は関数行間距離が異なる関数であると判定する。
【００９７】
ＣＰＵ１１は、関数別呼び出し履歴分析ファイル２３Ｆの２行目及び３行目を読み込み、上述と同様の処理を実行する。
その結果、ＣＰＵ１１は、ｉｔｅｍ１は一方の分析情報にのみ存在する関数ではないと判定する。ＣＰＵ１１は、ｉｔｅｍ１は呼び出し回数が異なる関数であると判定する。ＣＰＵ１１は、ｉｔｅｍ１は開始行間距離が異なる関数であると判定する。ＣＰＵ１１は、ｉｔｅｍ１は関数行間距離が異なる関数でないと判定する。
ＣＰＵ１１は、ｉｎｉｔ１は一方の分析情報にのみ存在する関数ではないと判定する。ＣＰＵ１１は、ｉｎｉｔ１は呼び出し回数が異なる関数でないと判定する。ＣＰＵ１１は、ｉｎｉｔ１は開始行間距離が異なる関数であると判定する。ＣＰＵ１１は、ｉｎｉｔ１は関数行間距離が異なる関数でないと判定する。
【００９８】
ＣＰＵ１１は、関数別呼び出し履歴分析ファイル２３ＦのＥＯＦ（End Of File）を取得する。ＣＰＵ１１は、上述の判定に基づいて、一方の分析情報にのみ存在する関数、呼び出し回数が異なる関数、開始行間距離が異なる関数及び関数行間距離が異なる関数を抽出する。ＣＰＵ１１は、抽出した関数を差分リストファイル２３０Ｆとしてハードディスク１４に記録する。図１７は、ＣＰＵ１１により抽出された関数を示している。
図１７の例では、一方の分析情報にのみ存在する関数は存在せず、呼び出し回数が異なる関数はｉｔｅｍ１である。開始行間距離が異なる関数は、ｉｔｅｍ１及びｉｎｉｔ１、関数行間距離が異なる関数はｔｏｐｌｉｓｔ１である。
なお、一方の分析情報にのみ存在する関数は、一方の分析情報の呼び出し回数が１回以上、他方の分析情報の呼び出し回数が０回の関数として表示されてもよい。
【００９９】
一方の分析情報にのみ存在する関数は存在しないので、本実施例において入力データの変化によって例外、エラー処理等を実行する関数は、実行されなかったと考えられる。
ｉｔｅｍ１は、呼び出し回数が異なる関数であり、開始行間距離が異なる関数でもある。基準データＳＤと変更データＣＤとの違いはデータ数であることから、ｉｔｅｍ１は入力データ数の違いにより呼び出し回数が変化する関数であるといえる。そのため、ｉｔｅｍ１は、商品在庫の情報を商品の種類ごとに処理する関数である可能性がある。
【０１００】
ｉｎｉｔ１は、呼び出し回数が異なる関数ではなく、開始行間距離が異なる関数である。ｉｎｉｔ１は、解析対象プログラムの中で上位の機能を有し、複数回実行された関数を呼び出した可能性がある。また、基準データ実行履歴ファイル２１Ｆ又は変更データ実行履歴ファイル２１０Ｆを参照した場合、ｉｎｉｔ１とｉｔｅｍ１とは入れ子構造であることが予想される。そうすると、ｉｎｉｔ１からｉｔｅｍ１が呼び出された可能性が示唆される。
【０１０１】
ｔｏｐｌｉｓｔ１は、呼び出し回数が異なる関数ではなく、関数行間距離が異なる関数である。ｔｏｐｌｉｓｔ１は、入力データの量が増加することにより少なくとも１回目の呼び出しにおける実行されたステップ数が増大している。しかし、自身の呼び出し回数に差は生じなかったので、ｔｏｐｌｉｓｔ１は解析対象プログラムの中で上位の機能を有するものと考えられる。また、基準データ実行履歴ファイル２１Ｆ又は変更データ実行履歴ファイル２１０Ｆを参照した場合、ｔｏｐｌｉｓｔ１とｉｎｉｔ１とは入れ子構造であることが予想される。そうすると、ｔｏｐｌｉｓｔ１からｉｎｉｔ１が呼び出された可能性が示唆される。
【０１０２】
プログラム解析装置１によれば、入力データの変化に基づいて、プログラムに含まれる関数の動作変化を取得することが可能である。
解析対象プログラムの機能毎に実行履歴から抽出された関数の属性は、入力データの変化に対する動作変化に基づいて４種類に分類される。差分リストファイル２３０Ｆにおいて、関数は基準データＳＤ及び変更データＣＤの差分である差分データＤＤと、対応づけられており、解析対象プログラムにおける各関数の動作の理解を支援することができる。
【０１０３】
プログラム解析装置１によれば、解析対象プログラムの実行履歴に基づいて、関数の呼び出し回数、開始行間距離及び関数行間距離を求めることができる。これにより、プログラム解析装置１は、関数が上位の機能を有するか否かについて分析を行う上で、有益な情報を提供することができる。
【０１０４】
なお、ＣＰＵ１１は、基準データ実行履歴ファイル２１Ｆ、変更データ実行履歴ファイル２１０Ｆ、基準データ関数別計測ファイル２２Ｆ、変更データ関数別計測ファイル２２０Ｆ及び関数別呼び出し履歴分析ファイル２３Ｆをハードディスク１４に記録する。しかし、ＣＰＵ１１は、これらのファイルをＲＡＭ１３に記録してもよい。
【０１０５】
図１６の関数別呼び出し履歴分析ファイル２３Ｆには、基準データＳＤに基づく関数の分析情報と変更データＣＤに基づく関数の分析情報とが含まれていた。双方を比較することにより、入力データの変化に基づく関数の動作変化を知ることができる。しかし、基準データＳＤに基づく関数の分析情報と変更データＣＤに基づく関数の分析情報との差が定量的に求められてもよい。
図１８は、基準データＳＤに基づく関数の分析情報と変更データＣＤに基づく関数の分析情報との差分を示す説明図である。図１８の関数名は、図１６の関数名と同じである。図１６の呼び出し回数差、開始行間距離差及び関数行間距離差は、夫々図１６の基準データＳＤに基づく関数の分析情報と変更データＣＤに基づく関数の分析情報との各差に該当する。つまり、図１８には、入力データの変化による関数の動作変化が定量的に示されている。
ｉｔｅｍ１は、呼び出し回数に４回、開始行間距離に８行の変化がある。変更データＣＤの件数が基準データＳＤの件数より４件多いことを勘案した場合、ｉｔｅｍ１は、商品在庫テーブルのレコードを１件ずつ処理する関数であることが想像される。
ｉｎｉｔ１は、関数行間距離に８行の変化がある。この変化量はｉｔｅｍ１の開始行間距離の変化に等しい。従って、ｉｎｉｔ１は、ｉｔｅｍ１を呼び出していることが想像される。
ｔｏｐｌｉｓｔ１は、呼び出し回数及び開始行間距離に変化がなく、関数行間距離に８行の変化がある。この変化量はｉｔｅｍ１及びｉｎｉｔ１の開始行間距離の変化に等しい。従って、ｔｏｐｌｉｓｔ１は、ｉｔｅｍ１又はｉｎｉｔ１を呼び出していることが想像される。
なお、基準データに対応する関数の分析情報と変更データに対する関数の分析情報との間に差がないことも、リバースエンジニアリングの情報として有益である。従って、図１８において、０と記された情報からも、関数の解釈に有益な情報が得られる。例えば、ｔｏｐｌｉｓｔ１及びｉｎｉｔ１は、入力データのデータ量が変化しても呼び出し回数は変化していない。そのため、ｔｏｐｌｉｓｔ１及びｉｎｉｔ１は、データ量の変化とは無関係な処理をしていることが想像される。
【０１０６】
本実施例では、基準データＳＤと変更データＣＤとの間で、商品在庫テーブルのレコード数を変化させた。しかし、基準データＳＤと変更データＣＤとの間で、入力データの値を変化させてもよいことは勿論である。例えば、変更データＣＤの作成に際し、商品在庫テーブルのレコード数は基準データＳＤのレコード数と同じ２件とする。ただし、変更データＣＤの登録日時又は在庫数を基準データＳＤの登録日時又は在庫数と異なる値に変更する。
【０１０７】
本実施例では、解析対象プログラムの機能毎に、関数別の分析を行った。しかし、関数間の構造が解析されてもよい。例えば、解析対象プログラムの実行履歴において、関数Ａの呼び出し開始と呼び出し終了との間に、関数Ｂの呼び出し開始と呼び出し終了とがある場合、関数Ｂは関数Ａの入れ子関数である可能性がある。かかる場合、関数Ａから関数Ｂが呼び出される関係にあり、関数Ａは上位の関数、関数Ｂは下位の関数であるといえる。
図１９は、解析対象プログラムの実行履歴における関数間の構造の一例を示す説明図である。図１９では、関数の呼び出し順序に基づいた入れ子構造が示されている。
図１２又は図１３の実行履歴において、ｔｏｐｌｉｓｔ１の呼び出し開始と呼び出し終了との間に、ｉｎｉｔ１の呼び出し開始と呼び出し終了とがある。また、ｉｎｉｔ１の呼び出し開始と呼び出し終了との間に、ｉｔｅｍ１の呼び出し開始と呼び出し終了とがある。従って、ソースコードにおいてもｉｔｅｍ１はｉｎｉｔ１の内部で入れ子になり、ｉｎｉｔ１はｔｏｐｌｉｓｔ１の内部で入れ子になっている可能性がある。
関数の呼び出し回数、開始行間距離及び関数行間距離から関数の動作を決定することが困難な場合であっても、関数の呼び出し順序に基づいた関数間の構造を勘案することにより、関数動作推定の支援が可能となる。
【０１０８】
本実施の形態で扱った関数は、手続き型言語、命令型言語、構造化言語等における関数に限らない。本実施の形態で扱った関数は、オブジェクト指向言語におけるクラスのメソッドに置き換えてもよい。
【０１０９】
プログラム解析装置１を動作させるためのプログラム１Ｐは、ディスクドライブ１５に光ディスク１ａを読み取らせてハードディスク１４に記録してもよい。また、プログラム１Ｐは、インターネットＮを介して接続される他の情報処理装置又は記録装置（図示せず）からダウンロードすることも可能である。あるいは、また、プログラム１Ｐを記録したフラッシュメモリ等の半導体メモリ１ｃがプログラム解析装置１内に実装されてもよい。
【０１１０】
以上の実施の形態に関し、さらに以下の付記を開示する。
【０１１１】
（付記１）
対象プログラムを解析する処理をコンピュータに実行させるコンピュータプログラムにおいて、
第１入力データ及び該第１入力データと異なる第２入力データに夫々基づく前記対象プログラムの第１駆動履歴及び第２駆動履歴を記録する記録手段に記録された該第１駆動履歴から、該対象プログラムに含まれる関数の呼び出し情報に基づいて、該関数の第１呼び出し履歴を抽出し、
前記記録手段に記録された第２駆動履歴から、前記関数の呼び出し情報に基づいて、該関数の第２呼び出し履歴を抽出し、
前記関数の第１及び第２呼び出し履歴に夫々基づいて、前記第１及び第２駆動履歴各々における該関数の呼び出し回数又は呼び出し箇所を取得する
処理をコンピュータに実行させるコンピュータプログラム。
【０１１２】
（付記２）
前記関数の呼び出し情報は該関数の呼び出し開始又は呼び出し終了を示す情報を含み、
前記関数の第１及び第２呼び出し履歴を抽出する処理は、該関数の呼び出し開始又は呼び出し終了に係る第１及び第２呼び出し履歴を夫々抽出し、
前記関数の呼び出し回数又は呼び出し箇所を取得する処理は、該関数の呼び出し開始又は呼び出し終了に係る第１及び第２呼び出し履歴に夫々基づいて、前記第１及び第２駆動履歴各々における該関数の呼び出し回数又は呼び出し箇所を取得する
付記１に記載のコンピュータプログラム。
【０１１３】
（付記３）
前記対象プログラムの第１及び第２駆動履歴は行単位の文字列であり、
前記関数の呼び出し箇所を取得する処理は、該関数の呼び出し開始又は呼び出し終了に対応する行番号を取得する
付記２に記載のコンピュータプログラム。
【０１１４】
（付記４）
前記関数の呼び出し開始又は呼び出し終了に対応する行番号に基づいて、該関数の処理に関するステップ数に応じた行の数量を算出する
付記３に記載のコンピュータプログラム。
【０１１５】
（付記５）
前記ステップ数に応じた行の数量を算出する処理は、前記対象プログラムの第１及び第２駆動履歴各々における関数の同一呼び出し回数目の呼び出し開始及び呼び出し終了に夫々対応する行番号に基づいて、前記ステップ数に応じた行の数量を算出する
付記４に記載のコンピュータプログラム。
【０１１６】
（付記６）
前記ステップ数に応じた行の数量を算出する処理は、前記対象プログラムの第１及び第２駆動履歴各々における関数の呼び出し開始に対応する最初の行番号及び呼び出し開始に対応する最後の行番号、又は該関数の呼び出し終了に対応する最初の行番号及び呼び出し終了に対応する最後の行番号に基づいて、前記ステップ数に応じた行の数量を算出する
付記４に記載のコンピュータプログラム。
【０１１７】
（付記７）
前記関数の呼び出し回数又はステップ数に応じた行の数量に基づいて、前記第１及び第２入力データに夫々対応する該関数の呼び出し回数又はステップ数に応じた行の数量の間の同異又は変化量を求める
付記４から付記６までのいずれか一つに記載のコンピュータプログラム。
【０１１８】
（付記８）
前記第１入力データは値を有し、
前記第２入力データは前記第１入力データの値又はデータ量を変更したデータである
付記１から付記７までのいずれか一つに記載のコンピュータプログラム。
【０１１９】
（付記９）
前記対象プログラムは機械語により記述されている
付記１から付記８までのいずれか一つに記載のコンピュータプログラム。
【０１２０】
（付記１０）
対象プログラムを解析するプログラム解析方法において、
コンピュータが、
第１入力データ及び該第１入力データと異なる第２入力データに夫々基づく前記対象プログラムの第１駆動履歴及び第２駆動履歴を記録する記録手段に記録された該第１駆動履歴から、該対象プログラムに含まれる関数の呼び出し情報に基づいて、該関数の第１呼び出し履歴を抽出し、
前記記録手段に記録された第２駆動履歴から、前記関数の呼び出し情報に基づいて、該関数の第２呼び出し履歴を抽出し、
前記関数の第１及び第２呼び出し履歴に夫々基づいて、前記第１及び第２駆動履歴各々における該関数の呼び出し回数又は呼び出し箇所を取得する
プログラム解析方法。
【０１２１】
（付記１１）
対象プログラムを解析するプログラム解析装置において、
第１入力データ及び該第１入力データと異なる第２入力データに夫々基づく前記対象プログラムの第１駆動履歴及び第２駆動履歴を記録する記録手段と、
該記録手段に記録された第１駆動履歴から、前記対象プログラムに含まれる関数の呼び出し情報に基づいて、該関数の第１呼び出し履歴を抽出する第１抽出部と、
前記記録手段に記録された第２駆動履歴から、前記関数の呼び出し情報に基づいて、該関数の第２呼び出し履歴を抽出する第２抽出部と、
前記第１及び第２抽出部が夫々抽出した関数の前記第１及び第２呼び出し履歴に基づいて、前記第１及び第２駆動履歴各々における該関数の呼び出し回数又は呼び出し箇所を取得する取得部と
を備えるプログラム解析装置。
【符号の説明】
【０１２２】
１        プログラム解析装置
１１      ＣＰＵ
１３      ＲＡＭ
１４      ハードディスク
２２      関数呼び出し履歴計測部
２３      関数呼び出し履歴分析部
ＳＤ      基準データ
ＣＤ      変更データ
ＤＤ      差分データ
２１Ｆ    基準データ実行履歴ファイル
２１０Ｆ  変更データ実行履歴ファイル
２２Ｆ    基準データ関数別計測ファイル
２２０Ｆ  変更データ関数別計測ファイル
２３Ｆ    関数別呼び出し履歴分析ファイル
２３０Ｆ  差分リストファイル
１Ｐ      プログラム
１ａ      光ディスク
【図１】
0005678689.tif 000002
【図２】
0005678689.tif 000003
【図３】
0005678689.tif 000004
【図４】
0005678689.tif 000005
【図５】
0005678689.tif 000006
【図６】
0005678689.tif 000007
【図７】
0005678689.tif 000008
【図８】
0005678689.tif 000009
【図９】
0005678689.tif 000010
【図１０】
0005678689.tif 000011
【図１１】
0005678689.tif 000012
【図１２】
0005678689.tif 000013
【図１３】
0005678689.tif 000014
【図１４】
0005678689.tif 000015
【図１５】
0005678689.tif 000016
【図１６】
0005678689.tif 000017
【図１７】
0005678689.tif 000018
【図１８】
0005678689.tif 000019
【図１９】
0005678689.tif 000020