(57)【要約】【課題】解析対象機能の実行により影響を受けるプログラム内部の変数を誤りなく検出することができるプログラム解析装置を提供する。【解決手段】実行中のプログラムの変数内容の、機能の実行前後での比較に基づいて影響を解析することにより、機能実行の影響を受ける変数の誤った抽出を防ぐと共に、その影響の内容を最小限の差分情報にまで削減し段階的に抽象化することにより識別容易な情報として提示する。すなわち、機能の実行に影響を受ける変数の検出に際して実際には影響を受けない変数を誤って検出することがない効果がある。【選択図】図１
2010102664.tif 000002
【特許請求の範囲】
【請求項１】
変数にアクセスしながら動作するプログラムを解析するプログラム解析装置であって、解析対象として指定された機能の開始時点における前記変数の内容と、該機能の終了時点における前記変数の内容とが異なっている変数を抽出する差分抽出手段を備えることを特徴とするプログラム解析装置。
【請求項２】
前記差分抽出手段は、解析対象として指定された機能の開始時点における内容と、該機能の終了時点における内容との差を、二つの内容を並べた記述によって表示することを特徴とする請求項１に記載のプログラム解析装置。
【請求項３】
前記差分抽出手段により抽出された変数の、解析対象として指定された機能の開始時点における内容と、該機能の終了時点における内容との差を抽出し、抽出した内容を抽象化して表示する差分抽象化手段をさらに具備することを特徴とする請求項１または請求項２に記載のプログラム解析装置。
【請求項４】
前記差分抽象化手段は、解析対象として指定された機能の開始時点における内容と、該機能の終了時点における内容との差を、一方の内容から他方の内容へ変換する変換式で表示することを特徴とする請求項３に記載のプログラム解析装置。
【請求項５】
変数にアクセスしながら動作するプログラムを解析するプログラム解析方法であって、解析対象として指定された機能の開始時点における前記変数の内容と、該機能の終了時点における前記変数の内容とが異なっている変数を抽出する差分抽出処理を有することを特徴とするプログラム解析方法。
【請求項６】
前記差分抽出処理は、解析対象として指定された機能の開始時点における内容と、該機能の終了時点における内容との差を、二つの内容を並べた記述によって表示することを特徴とする請求項５に記載のプログラム解析方法。
【請求項７】
前記差分抽出処理により抽出された変数の、解析対象として指定された機能の開始時点における内容と、該機能の終了時点における内容との差を抽出し、抽出した内容を抽象化して表示する差分抽象化処理をさらに具備することを特徴とする請求項５または請求項６に記載のプログラム解析方法。
【請求項８】
前記差分抽象化処理は、解析対象として指定された機能の開始時点における内容と、該機能の終了時点における内容との差を、一方の内容から他方の内容へ変換する変換式で表示することを特徴とする請求項７に記載のプログラム解析方法。
【請求項９】
変数にアクセスしながら動作するプログラムを解析するプログラムであって、解析対象として指定された機能の開始時点における前記変数の内容と、該機能の終了時点における前記変数の内容とが異なっている変数を抽出する差分抽出処理をコンピュータに実行させるためのプログラム。
【請求項１０】
前記差分抽出処理は、解析対象として指定された機能の開始時点における内容と、該機能の終了時点における内容との差を、二つの内容を並べた記述によって表示することを特徴とする請求項９に記載のプログラム。
【請求項１１】
前記差分抽出処理により抽出された変数の、解析対象として指定された機能の開始時点における内容と、該機能の終了時点における内容との差を抽出し、抽出した内容を抽象化して表示する差分抽象化処理をさらに具備することを特徴とする請求項９または請求項１０に記載のプログラム。
【請求項１２】
前記差分抽象化処理は、解析対象として指定された機能の開始時点における内容と、該機能の終了時点における内容との差を、一方の内容から他方の内容へ変換する変換式で表示することを特徴とする請求項１１に記載のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムの保守や再構築をする際に、効率的にプログラムの構成を把握することを可能とするプログラム解析装置およびプログラム解析方法並びにプログラム解析用プログラムに関する。
【背景技術】
【０００２】
プログラムの保守や再構築を効率的に行うためには、プログラムの構成要素である制御構造やデータ構造を把握し、構成要素同士がどのように影響しあうかについて理解する必要がある。しかし、プログラムの規模が大きい場合に、修正が頻繁に行われるなどの要因によって、構成要素同士の相互作用が容易には理解できない程にまで複雑化してしまうことがよくある。そのため、プログラムの保守を行う上ではドキュメント等の手がかりが欠かせない。しかし、プログラムの運用・保守が長期に渡ると、当初の開発者が不在となる場合や、ドキュメントがプログラムの変更内容と同期していない等の理由により、手がかりなしでプログラム要素同士の相互作用を分析する必要が生じる。
【０００３】
そこで、プログラムソースコード等を静的に解析することにより、プログラムに入力されるイベントとプログラム内部のデータ構造との依存関係を示したり、プログラム内部の制御フロー若しくはデータフローを提示したり、プログラムの各要素同士の影響範囲を提示することにより、プログラム要素間の相互作用の理解を助けるプログラム解析技術が用いられてきた。
【０００４】
この種の静的なプログラム解析装置の一例が、特許文献１、特許文献２に記載されている。図１５に示すように、特許文献１のプログラム解析装置は、プログラムにおける処理対象データの単位であるエンティティとエンティティに対する処理に影響を与えるイベントとを関係付けて関係テーブル１３１に格納するステップと、関係テーブル１３１に格納されたデータを用いてイベントの重要度を算出し記憶装置に格納するステップと、関係テーブル１３１に格納されたデータを用いて特定のエンティティに対する処理に影響を与えるイベントを特定し記憶装置に格納された当該イベントの重要度を用いて特定のエンティティの影響度を算出し記憶装置に格納するステップとによって構成されている。このような構成により、情報システム中のプログラムにおけるエンティティとイベントとの関係をより具体的に提示することができる。
【０００５】
特許文献２のプログラム解析装置は、プログラム中の起点情報を元にして、その起点に影響を与えている若しくは与えられているプログラムの一部分を抽出する装置である。システムを構成している解析対象のプログラムに対して、ユーザに抽出したいロジックの入力情報を指定させ、プログラム中の命令文ごとに特定のロジックとして抽出する必要性についての判定を行う。ここで、特定ロジックとして解析対象プログラムから抽出する必要性を以下のように分類する。まず、ユーザの指定した入力のみから影響を受けている命令文は抽出対象となる命令文、つぎにユーザの指定した入力と指定しなかった入力の両方から影響を受けている命令文は修正候補となる命令文、最後にユーザの指定しなかった入力のみから影響を受けている命令文は抽出対象とならない命令文と分類し、それぞれの命令文を区別して表示するものである。これにより、ロジックの連鎖をたどってプログラムを読解する際に、基点に無関係な部分を読み飛ばすことで作業効率を向上させることができる。
【０００６】
特許文献３に例示されているシンボリックデバッガは、メモリ内容の参照、プログラム動作のトレース、変数の値表示などを高水準プログラム言語のレベルで行ない、デバッグ対象プログラムの実行の様子を確認することのできる装置である。また、非特許文献１には、シンボリックデバッガが、メモリ内容を高水準プログラム言語のレベルで表示する際に、シンボルテーブル情報を利用する方法について記載されている。これらのシンボリックデバッガを用いると、実際にプログラムの動作中に実行を一時停止させ、プログラムの内部状態を観察できる。これは、特許文献１や特許文献２のような静的な解析とは異なり、実行時の情報を取得するため、影響範囲を過大に抽出してしまうことはない。
【特許文献１】特開２００７−２４１９１６号公報
【特許文献２】特開２００７−９４７５３号公報
【特許文献３】特開平０９−２９７６９５号公報
【非特許文献１】Jonathan B. Rosenberg著「デバッガの理論と実装」アスキー出版局、１９９８年２月１１日、ｐｐ．１９０−２０３（８．６節）
【発明の開示】
【発明が解決しようとする課題】
【０００７】
ところで、プログラムを修正する際の該プログラムに関する理解を助ける目的で、入出力に関してプログラム外部から識別される機能とその機能の実行により影響を受けるプログラム内部の変数との関係を提示するために、従来のプログラム解析手法を利用しようとすると次の課題がある。
【０００８】
第１の問題点は、静的なプログラム解析技術によって機能の実行の影響を受ける変数を検出するとき、影響を受けない変数を誤って検出してしまうことである。その理由は、プログラムを実行させること無しにソースコードを静的に解析するだけでは個々のロジックについて変数へ作用する可能性を推定することしかできず、作用の有無の判定まではできないためである。
【０００９】
第２の問題点は、第１の問題点を回避するために、実際に動作中のプログラムの内部状態を観察するシンボリックデバッガ等の既存の手段を用いて変数への影響を解析するとき、影響の有無や影響の内容に関する情報が、それとは無関係な大量の情報に埋もれて容易には識別できないということである。その理由は、シンボリックデバッガ等の観察手段を用いると、プログラム内部の状態について膨大な情報がもたらされるが、実際に注目すべき部分はその中のごく一部に過ぎないことと、影響の有無を比較できるように、適切なタイミングで複数回の観察結果情報を取得する必要があるからである。これは、大規模かつ複雑なプログラムを対象とするとき、特に顕著となる問題点である。
【００１０】
本発明は、このような事情に鑑みてなされたもので、その目的は、プログラムを修正する際の該プログラムへの理解を助けるために、入出力に関してプログラム外部から識別される機能に対して、その機能の実行により影響を受けるプログラム内部の変数を誤りなく検出することができるプログラム解析装置およびプログラム解析方法並びにプログラム解析用プログラムを提供することにある。
【課題を解決するための手段】
【００１１】
本発明は、変数にアクセスしながら動作するプログラムを解析するプログラム解析装置であって、解析対象として指定された機能の開始時点における前記変数の内容と、該機能の終了時点における前記変数の内容とが異なっている変数を抽出する差分抽出手段を備えることを特徴とするプログラム解析装置である。
【００１２】
また、本発明は、変数にアクセスしながら動作するプログラムを解析するプログラム解析方法であって、解析対象として指定された機能の開始時点における前記変数の内容と、該機能の終了時点における前記変数の内容とが異なっている変数を抽出する差分抽出処理を有することを特徴とするプログラム解析方法である。
【００１３】
また、本発明は、変数にアクセスしながら動作するプログラムを解析するプログラムであって、解析対象として指定された機能の開始時点における前記変数の内容と、該機能の終了時点における前記変数の内容とが異なっている変数を抽出する差分抽出処理をコンピュータに実行させるためのプログラムである。
【発明の効果】
【００１４】
本発明によれば、解析対象として指定された機能の開始時点における変数の内容と、該機能の終了時点における変数の内容とが異なっている変数を抽出する差分抽出手段を備えているので、機能の実行に影響を受ける変数の検出に際して実際には影響を受けない変数を誤って検出することがない効果がある。
【発明を実施するための最良の形態】
【００１５】
以下、図面を参照し、本発明の実施形態について説明する。図１は本発明の一実施形態によるプログラム解析装置の構成を示すブロック図である。この装置は、プログラム制御により動作するコンピュータ（中央処理装置；プロセッサ；データ処理装置）１００と、記憶装置２００とから構成されている。コンピュータ１００は、差分抽出手段１１０と、差分抽象化手段１２０と、解析対象プログラム１３０とを含む。
【００１６】
差分抽出手段１１０は、変数への影響を解析すべき機能に対応するプログラムの範囲を、機能開始時に呼び出される関数（開始関数と呼ぶ）と該機能の終了時にリターンされる関数（復帰関数と呼ぶ）との対として受け付ける。また、この差分抽出手段１１０は、解析対象プログラム１３０の実行中に発生する関数呼び出しを監視し、前記の開始関数が呼び出されるタイミングと前記の復帰関数のリターンするタイミングのそれぞれにおいて、解析対象プログラム１３０内部の変数値を読み出し、プログラムソースコードの変数名や構造体フィールド名などのシンボル情報と関連付けたデータを作成する。開始関数の開始のタイミングで作成されるデータを開始時データ、復帰関数リターンのタイミングで作成されるデータを復帰時データと呼ぶ。また、この差分抽出手段１１０は、イベントの発生毎に作成された開始時データと復帰時データとを対として対応付ける。また、この差分抽出手段１１０は、開始時データと復帰時データの対を比較し、差異の無い部分を除去した結果（差分データと呼ぶ）を抽出する。
差分抽象化手段１２０は、差分抽出手段１１０が抽出した差分データを具体値による表現や関係式による表現へと抽象化して提示する。
【００１７】
次に、図２のフローチャートを参照して本実施形態の全体の動作について説明する。
まず、差分抽出手段１１０は、開始関数の呼び出しを検出し（Ｓ１１０）、さらに、開始関数の実行に先立って解析対象プログラム１３０内部の変数を読み出してプログラムのソースコード上における変数名や構造体要素名などのシンボル情報と関連付けて開始時データを作成する（Ｓ１２０）。次に、解析対象プログラム１３０において開始関数の実行が開始される（Ｓ１３０）。次に、差分抽出手段１１０は、復帰関数のリターンを検出し（Ｓ１４０）、復帰関数のリターンに先立ってプログラム内部の変数を読み出してプログラムソースコードの変数名や構造体要素名などのシンボル情報と関連付けて復帰時データを作成し（Ｓ１５０）、開始時データと復帰時データとを対として対応付ける（Ｓ１６０）。次に、差分抽出手段１１０は、対として関連付けられた開始時データと復帰時データから差分データを抽出する（Ｓ１７０）。次に、差分抽象化手段１２０は、差分データを抽象化して提示する（Ｓ１８０）。最後に、解析対象プログラム１３０において復帰関数がリターンし、プログラムの実行が継続される（Ｓ１９０）。
【００１８】
上述した実施形態によれば、プログラム実行中に、機能の実行前と実行後のプログラム内部の変数のうち、内容に変化が生じた変数を検出し、変化の内容を抽象化して提示するように構成されているため、機能の実行により影響を受ける変数だけを、さらに変数の内容で影響を受ける箇所だけを検出することができる。
（実施例）
【００１９】
次に、具体的な実施例を用いて上記実施形態の動作を説明する。まず、図３に示すように、本実施例の差分抽出手段１１０は、既存の一般的なシンボリックデバッガ１１１を内蔵し、その機能を利用して動作する。シンボリックデバッガ１１１には、あらかじめ指定しておいたプログラム内の任意のステップにおいて実行を停止させるブレークポイント機能と、停止中にプログラム内のデータをソースコードのシンボル情報と関連付けて提示する式評価機能と、停止状態から実行状態を再開させる実行再開機能とが備わっている。
【００２０】
そこで、本実施例の差分抽出手段１１０は、開始関数の開始行と復帰関数の終了行および復帰命令文とにブレークポイントを設定することで、開始関数の開始時点と復帰関数の復帰時点とでプログラムが停止されるようにシンボリックデバッガ１１１を制御する。そして、差分抽出手段１１０は、プログラムが開始関数のブレークポイントで停止した際に、シンボリックデバッガ１１１の式評価機能を利用して開始時データを取得し、シンボリックデバッガ１１１の実行再開機能を利用してプログラムの実行を再開させる。さらに、差分抽出手段１１０は、プログラムが復帰関数のブレークポイントで停止した際に、シンボリックデバッガ１１１の式評価機能を利用して復帰時データを取得し、復帰時データを開始時データと関連付けて保持し、差分抽出手段１１０による差分の抽出と差分抽象化手段１２０による差分の抽象化が行われた後にシンボリックデバッガ１１１の再開機能を使用してプログラムの実行を再開させる。
【００２１】
なお、シンボリックデバッガ１１１の式評価機能は、変数名のみの式や、構造体変数の要素を参照する式を受け付けることができる。従って、開始データや復帰データとして、図４に示すような式の値を取得できる。なお、図４の例では、解析対象プログラムの変数として整数型配列変数Ａ、文字列型変数Ｂ、論理型変数Ｘ、整数型変数Ｙ、構造体型変数Ｚが存在し、Ｚの構造体型は、整数型の変数ｐと自身の型を参照する変数ｑとから構成されている場合を想定している。図４は、Ａ[i]、Ｂ、Ｘ、Ｙ、Ｚ．ｐ、Ｚ．ｑ、Ｚ．ｑ．ｐ、Ｚ．ｑ．ｑ、Ｚ．ｑ．ｑ．ｑといった形の式の値が取得された状態である。
【００２２】
次に、差分抽出手段１１０の具体的動作について説明する。
差分抽出手段１１０は、図４に示すような開始時データと復帰時データの対を受け取り、図５に示すような差分データを抽出する手段であり、プログラミング言語において定義されている同値性の基準に基づいて、開始時データ側と復帰時データ側とで式の値の比較を行い、比較結果が同値である式を除外して同値で無い式のみを残し抽出結果とする。
【００２３】
例えばＪａｖａ（登録商標）言語における値の同値性は次のように定義されている。まず、数値型や論理型などの基本型の値は、単純な比較によって同値性が判定される。配列型やクラス等の参照型の値は、参照するオブジェクトが持つequals()関数によって同値性が判定される。例えば文字列型のequals()関数は文字列の各文字が先頭から末尾まで全て同じである場合に同値と判定される。
【００２４】
また、例えばＣ言語における変数値の同値性は、次のように定義されている。まず、算術型の変数は、単純な比較によって同値性が判定される。構造体型や配列型やポインタ型の変数は、言語の仕様上での同値性は定義されていない。従って、本実施例においては除外せずに全て抽出結果に残すことになる。
【００２５】
次に、差分抽象化手段１２０の具体的動作について説明する。
差分抽象化手段は、図６に示すように、開始時データD61と復帰時データD62をそれぞれ式表現F63と式表現F64に変換し、さらに、それらをまとめて差分式F65に変換する。開始時データD61において、変数ｖは構造体Pを参照する型である。構造体Pは要素として整数型であるｘ、文字列型であるｙ、構造体Qを参照する型であるｚを持つ。構造体Qは要素として構造体Rを参照する型のｍを持つ。構造体Rは整数型の要素aとｂとを持つ。また、参照するオブジェクトが同一であるかどうかを識別するための識別コードを付与して参照型の値を表記しており、例えばP@10とP@20は別のオブジェクトを表す。式表現F63では、構造体の階層関係を括弧で表しており、オブジェクトIDが@10であるPは、要素としてx=1とy=”a”と、z=Q@1(R@2(1,3))とを持つ。また、オブジェクトIDが@1であるQは、要素としてm=R@2(1,3)を持つ。さらに、オブジェクトR@2は、要素としてa=1とb=3とを持つ。これら二つの式表現を矢印で結合した式が差分式である。
【００２６】
次に、差分抽象化手段１２０は、差分式の簡約化を行う。簡約化にあたっては、変数の型に定義されている同値性を用いてオブジェクトの比較を行う。ここでは、Pは全要素の値が同値のときに同値であるものとする。QやRは、オブジェクトが一致していてなおかつその全要素の値が一致するときに同値であるものとする。
【００２７】
図７に差分式の簡約化を例示した。差分式F701におけるトップレベルの要素Pの同値性は要素の比較によるので、差分式を要素単位に展開して差分式F702を得る。その際に、差の無い要素は_に置換する。これを順次繰り返し、F705を得る。さらに、差分抽象化手段１２０は、差分式をより抽象的な表現へと段階的に変換した系列を生成する。例えば図８では、数値型の差分式3→5をΔ+2、「増加」、「変化有り」のように段階的により一般化、抽象化された表現に変換する。
【００２８】
差分式の段階的な抽象化は、データ型に応じて次のように行う。構造を持つ型（構造体やクラス）については図９に例示するように、F910のようなオブジェクトID付きの式からトップレベルのオブジェクトIDを除去しその要素単位の差分式へ変形し簡約化を行う（F920）。最後に要素ごとの簡約化を行う（F930、F940、F950）。論理型については、図１０に示すように、第一段階ではデータ対を例示し、第二段階では差異があることだけを示す。数値型については、図１１に示すように、第一段階ではデータ対を例示し、第二段階では増分を符号付で示し、第三段階では増減の符号のみを示し、第四段階では差異があることだけを示す。
【００２９】
配列型やコレクションについては、図１２、図１３に示すように、第一段階ではデータ対を例示し、第二段階では追加・削除・変更の操作とパラメータのリストを示し、第三段階では、操作の種類と変化した要素数を示し、第四段階では操作の種類を、最終段階では差異があることだけを示す。また、第三段階から第四段階とは別の第四段階‘や第五段階’への要素数に着目した抽象化も考えられる。
【００３０】
また、図１４に示すように、差分抽象化手段１２０をさらに拡張して、同種のイベント複数個について取得された複数の差分のサンプルに関し、全てのサンプルについて差分式が共通となるところまで抽象化した結果を提示することを行ってもよい。
【００３１】
以上が本発明の詳細である。本発明によれば次の効果が得られる。
第１の効果は、機能の実行に影響をうける変数の検出に際して、実際には影響を受けない変数を誤って検出しないことである。その理由は、実際にプログラムを実行し、プログラム内部の変化を観察した上で影響範囲に関する情報を抽出することにより、静的な解析の近似処理に起因するような影響範囲の過大な見積りを回避できるからである。
第２の効果は、プログラム内部の観察結果に関する情報の提示に際して、不要な情報を除外して、影響範囲の把握に必要な情報のみを提示できることにある。その理由は、観察して得られた情報から変化部分のみの情報を抽出し、さらに変化の内容を抽象化して提示するためである。
【産業上の利用可能性】
【００３２】
本発明は、プログラム設計書が無いなどの理由でプログラムの内容についての理解が乏しい中でのプログラム修正に際して、プログラムの内容理解に有用な情報を取得する用途に用いることができる。
【図面の簡単な説明】
【００３３】
【図１】本発明の一実施形態によるプログラム解析装置の構成を示すブロック図である。
【図２】図１に示すプログラム解析装置の動作を説明するためのフローチャートである。
【図３】図１に示すコンピュータ１００をさらに詳細に示したブロック図である。
【図４】図１に示すプログラム解析装置における差分抽出手段１１０の動作を説明するための説明図である。
【図５】同プログラム解析装置における差分抽出手段１１０の動作を説明するための説明図である。
【図６】図１に示すプログラム解析装置における差分抽象化手段１２０の動作を説明するための説明図である。
【図７】同プログラム解析装置における差分抽象化手段１２０の動作を説明するための説明図である。
【図８】同プログラム解析装置における差分抽象化手段１２０の動作を説明するための説明図である。
【図９】同プログラム解析装置における差分抽象化手段１２０の動作を説明するための説明図である。
【図１０】同プログラム解析装置における差分抽象化手段１２０の動作を説明するための説明図である。
【図１１】同プログラム解析装置における差分抽象化手段１２０の動作を説明するための説明図である。
【図１２】同プログラム解析装置における差分抽象化手段１２０の動作を説明するための説明図である。
【図１３】同プログラム解析装置における差分抽象化手段１２０の動作を説明するための説明図である。
【図１４】同プログラム解析装置における差分抽象化手段１２０の動作を説明するための説明図である。
【図１５】従来のプログラム解析装置の一例を示すブロック図である。
【符号の説明】
【００３４】
１００    コンピュータ（中央処理装置；プロセッサ；データ処理装置）
１１０    差分抽出手段
１１１    シンボリックデバッガ
１２０    差分抽象化手段
１３０    解析対象プログラム
２００    記憶装置
【図１】
2010102664.tif 000003
【図２】
2010102664.tif 000004
【図３】
2010102664.tif 000005
【図４】
2010102664.tif 000006
【図５】
2010102664.tif 000007
【図６】
2010102664.tif 000008
【図７】
2010102664.tif 000009
【図８】
2010102664.tif 000010
【図９】
2010102664.tif 000011
【図１０】
2010102664.tif 000012
【図１１】
2010102664.tif 000013
【図１２】
2010102664.tif 000014
【図１３】
2010102664.tif 000015
【図１４】
2010102664.tif 000016
【図１５】
2010102664.tif 000017