(57)【要約】【課題】プログラム解析の対象とする分岐箇所の解析作業を効率化できるプログラム解析装置を提供する。【解決手段】呼出ファイル特定手段８２は、処理群識別情報が識別する処理群ごとに、その処理群から呼び出される処理群識別情報の処理内容が記載されたファイルである呼出ファイルを特定する。分岐先呼出ファイル特定手段８４は、分岐箇所から分岐した先の処理である分岐先ごとに、呼出ファイル特定手段８２が特定した呼出ファイルを利用してその分岐先の呼出ファイルを特定する。排他的分岐箇所抽出手段８５は、分岐先呼出ファイル特定手段８４が特定した一の分岐先で呼び出される呼出ファイルと、他の分岐先で呼び出される呼出ファイルとが排他的関係にある場合に、その一の分岐先と他の分岐先とを含む分岐箇所である排他的分岐箇所を抽出する。【選択図】図７
2010191622.tif 000002
【特許請求の範囲】
【請求項１】
解析対象のプログラムから、処理の集合である処理群を識別する情報である処理群識別情報を抽出する処理群識別情報抽出手段と、
前記処理群識別情報が識別する処理群ごとに、当該処理群から呼び出される処理群識別情報の処理内容が記載されたファイルである呼出ファイルを特定する呼出ファイル特定手段と、
処理が分岐する分岐箇所を前記プログラムから抽出する分岐箇所抽出手段と、
前記分岐箇所から分岐した先の処理である分岐先ごとに、前記呼出ファイル特定手段が特定した呼出ファイルを利用して当該分岐先の呼出ファイルを特定する分岐先呼出ファイル特定手段と、
前記分岐先呼出ファイル特定手段が特定した一の分岐先で呼び出される呼出ファイルと、他の分岐先で呼び出される呼出ファイルとが排他的関係にある場合に、当該一の分岐先と当該他の分岐先とを含む分岐箇所である排他的分岐箇所を抽出する排他的分岐箇所抽出手段とを備えた
ことを特徴とするプログラム解析装置。
【請求項２】
処理群識別情報と呼出ファイルの情報とを対応付けて記憶する呼出ファイル記憶手段と、
呼出ファイル特定手段が特定した処理群識別情報に対する呼出ファイルの情報を登録する呼出ファイル登録手段とを備え、
分岐先呼出ファイル特定手段は、分岐先に含まれる処理群識別情報に対応する呼出ファイルの情報を前記呼出ファイル記憶手段から読み取って分岐先ごとの呼出ファイルを特定する
請求項１記載のプログラム解析装置。
【請求項３】
排他的分岐箇所抽出手段は、一の分岐先で呼び出される呼出ファイルが一の分岐先以外の他の分岐先で呼び出されない場合に、当該一の分岐先と当該一の分岐先以外の他の分岐先とを含む分岐箇所を抽出する
請求項１または請求項２に記載のプログラム解析装置。
【請求項４】
排他的分岐箇所抽出手段は、排他的分岐箇所を特定する情報として、分岐箇所を含むプログラムファイル名、当該分岐箇所のプログラムファイル上の位置、当該分岐箇所に含まれる処理群識別情報、当該分岐箇所に含まれる処理群識別情報の位置のうちのいずれかを含む情報を抽出する
請求項１から請求項３のうちのいずれか１項に記載のプログラム解析装置。
【請求項５】
分岐箇所抽出手段は、プログラムを構文要素に分解し、前記構文要素が所定の文字列を含む場合に分岐箇所として抽出する
請求項１から請求項４のうちのいずれか１項に記載のプログラム解析装置。
【請求項６】
解析対象のプログラムから、処理の集合である処理群を識別する情報である処理群識別情報を抽出する処理群識別情報抽出ステップと、
前記処理群識別情報が識別する処理群ごとに、当該処理群から呼び出される処理群識別情報の処理内容が記載されたファイルである呼出ファイルを特定する呼出ファイル特定ステップと、
処理が分岐する分岐箇所を前記プログラムから抽出する分岐箇所抽出ステップと、
前記分岐箇所から分岐した先の処理である分岐先ごとに、前記呼出ファイル特定ステップで特定した呼出ファイルを利用して当該分岐先の呼出ファイルを特定する分岐先呼出ファイル特定ステップと、
一の分岐先で呼び出される呼出ファイルと、他の分岐先で呼び出される呼出ファイルとが排他的関係にある場合に、当該一の分岐先と当該他の分岐先とを含む分岐箇所である排他的分岐箇所を抽出する排他的分岐箇所抽出ステップとを含む
ことを特徴とするプログラム解析方法。
【請求項７】
分岐先呼出ファイル特定ステップで、処理群識別情報と呼出ファイルの情報とを対応付けて記憶する呼出ファイル記憶手段から、分岐先に含まれる処理群識別情報に対応する呼出ファイルの情報を読み取って分岐先ごとの呼出ファイルを特定する
請求項６記載のプログラム解析方法。
【請求項８】
コンピュータに、
解析対象のプログラムから、処理の集合である処理群を識別する情報である処理群識別情報を抽出する処理群識別情報抽出処理、
前記処理群識別情報が識別する処理群ごとに、当該処理群から呼び出される処理群識別情報の処理内容が記載されたファイルである呼出ファイルを特定する呼出ファイル特定処理、
処理が分岐する分岐箇所を前記プログラムから抽出する分岐箇所抽出処理、
前記分岐箇所から分岐した先の処理である分岐先ごとに、前記呼出ファイル特定処理で特定した呼出ファイルを利用して当該分岐先の呼出ファイルを特定する分岐先呼出ファイル特定処理、および、
一の分岐先で呼び出される呼出ファイルと、他の分岐先で呼び出される呼出ファイルとが排他的関係にある場合に、当該一の分岐先と当該他の分岐先とを含む分岐箇所である排他的分岐箇所を抽出する排他的分岐箇所抽出処理
を実行させるためのプログラム解析プログラム。
【請求項９】
コンピュータに、
分岐先呼出ファイル特定処理で、処理群識別情報と呼出ファイルの情報とを対応付けて記憶する呼出ファイル記憶手段から、分岐先に含まれる処理群識別情報に対応する呼出ファイルの情報を読み取って分岐先ごとの呼出ファイルを特定させる
請求項８記載のプログラム解析プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム解析の負担を軽減するプログラム解析装置、プログラム解析方法及びプログラム解析プログラムに関する。
【背景技術】
【０００２】
ソフトウェア保守などにおいては、プログラム解析者がそのソフトウェアを構成するプログラムのソースファイルなどを読むことによりプログラムの挙動を解析する。そのため、このようなプログラムの解析を行うための作業を効率化する技術が各種提案されている。
【０００３】
特許文献１には、プログラムの解析を容易にするプログラム解析方法が記載されている。特許文献１に記載されたプログラム解析方法は、まず、解析するプログラムの中から処理の流れを変える分岐命令を抽出する。その分岐命令による分岐先を抽出後、分岐命令及び分岐先の位置に基づいてプログラムを複数のブロックに分割する。ブロックへの分割後、分割したこれらのブロック間の関係を示す接続情報を生成する。
【０００４】
特許文献２には、プログラムのソースコードを解析し、その結果を解析目的に応じて効果的に表示できる解析方法が記載されている。特許文献２に記載された解析方法では、ソースコードを解析して、関数間の呼び出しに関する情報と、変数の定義及び使用箇所に関する情報とを取得する。解析結果として取得したこれらの情報を用いて、モジュールと関数との包含関係、モジュール間の呼び出し関数、モジュール間の呼び出し関連図を作成する。このとき、解析結果を表示するモジュール単位を、関数、その関数が属するグループ、その関数を実装したファイル、そのファイルが格納されているディレクトリ、そのファイル内のプログラム情報が含まれるクラスなどの粒度に設定すると、その粒度でグループ間の依存度合を可視化できる。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平９−８１３７２号公報（段落０００８、００１６、図６）
【特許文献２】特開２００８−２９３４８６号公報（段落０００７、００１２、００２４、図６）
【発明の概要】
【発明が解決しようとする課題】
【０００６】
プログラムを解析する上での観点の一つに、プログラムの挙動が変化する分岐処理部に着目して解析する方法がある。例えば、ある整数値を入力とし、何らかの演算結果を出力させるプログラムを考える。このプログラムに対する入力が正の値のときと負の値のときとで挙動が変化する場合、その分岐処理の部分に着目してプログラムを解析する。
【０００７】
また、プログラム解析を行う場合には、通常、ソースコードを順にたどり、分岐処理が出てきたら、その分岐先のソースコードをさらにたどるという処理を繰り返す。しかし、プログラムの大規模化、複雑化に伴い、プログラムの分岐処理も増加している。そのため、プログラム解析者にとって、全ての分岐処理をたどっていくのは困難である。
【０００８】
特許文献１及び特許文献２に記載された解析方法を用いた場合、プログラム全体の構造を可視化できるため、各分岐処理の構造を容易に把握できる。しかし、プログラム全体の構造が可視化されても、分岐先のブロックで行われる処理に対してまで解析する必要があるか否かは、分岐先のプログラムの挙動の変化の大きさによって異なる。すなわち、挙動が大きく変化する分岐処理においては、その分岐先の処理を注視して解析する必要がある反面、挙動がほとんど変わらない分岐処理では、その分岐先の処理の解析を簡略化することができる。しかし、特許文献１及び特許文献２に記載された解析方法では、分岐処理におけるプログラムの挙動の変化の大きさを判断する術がないため、プログラム解析者は、分岐処理が発生するたびに分岐先のプログラム解析を進めなければならない。すなわち、プログラム解析者が解析するプログラムの量は結局のところ変わらないため、プログラム解析が効率的に解析できるとは言い切れない。
【０００９】
そこで、本発明は、プログラム解析の対象とする分岐箇所の解析作業を効率化できるプログラム解析装置、プログラム解析方法及びプログラム解析プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１０】
本発明によるプログラム解析装置は、解析対象のプログラムから、処理の集合である処理群を識別する情報である処理群識別情報を抽出する処理群識別情報抽出手段と、処理群識別情報が識別する処理群ごとに、その処理群から呼び出される処理群識別情報の処理内容が記載されたファイルである呼出ファイルを特定する呼出ファイル特定手段と、処理が分岐する分岐箇所をプログラムから抽出する分岐箇所抽出手段と、分岐箇所から分岐した先の処理である分岐先ごとに、呼出ファイル特定手段が特定した呼出ファイルを利用してその分岐先の呼出ファイルを特定する分岐先呼出ファイル特定手段と、分岐先呼出ファイル特定手段が特定した一の分岐先で呼び出される呼出ファイルと、他の分岐先で呼び出される呼出ファイルとが排他的関係にある場合に、その一の分岐先とその他の分岐先とを含む分岐箇所である排他的分岐箇所を抽出する排他的分岐箇所抽出手段とを備えたことを特徴とする。
【００１１】
本発明によるプログラム解析方法は、解析対象のプログラムから、処理の集合である処理群を識別する情報である処理群識別情報を抽出する処理群識別情報抽出ステップと、処理群識別情報が識別する処理群ごとに、その処理群から呼び出される処理群識別情報の処理内容が記載されたファイルである呼出ファイルを特定する呼出ファイル特定ステップと、処理が分岐する分岐箇所をプログラムから抽出する分岐箇所抽出ステップと、分岐箇所から分岐した先の処理である分岐先ごとに、呼出ファイル特定ステップで特定した呼出ファイルを利用してその分岐先の呼出ファイルを特定する分岐先呼出ファイル特定ステップと、一の分岐先で呼び出される呼出ファイルと、他の分岐先で呼び出される呼出ファイルとが排他的関係にある場合に、その一の分岐先とその他の分岐先とを含む分岐箇所である排他的分岐箇所を抽出する排他的分岐箇所抽出ステップとを含むことを特徴とする。
【００１２】
本発明によるプログラム解析プログラムは、コンピュータに、解析対象のプログラムから、処理の集合である処理群を識別する情報である処理群識別情報を抽出する処理群識別情報抽出処理、処理群識別情報が識別する処理群ごとに、その処理群から呼び出される処理群識別情報の処理内容が記載されたファイルである呼出ファイルを特定する呼出ファイル特定処理、処理が分岐する分岐箇所をプログラムから抽出する分岐箇所抽出処理、分岐箇所から分岐した先の処理である分岐先ごとに、呼出ファイル特定処理で特定した呼出ファイルを利用してその分岐先の呼出ファイルを特定する分岐先呼出ファイル特定処理、および、一の分岐先で呼び出される呼出ファイルと、他の分岐先で呼び出される呼出ファイルとが排他的関係にある場合に、その一の分岐先とその他の分岐先とを含む分岐箇所である排他的分岐箇所を抽出する排他的分岐箇所抽出処理を実行させることを特徴とする。
【発明の効果】
【００１３】
本発明によれば、プログラム解析の対象とする分岐箇所の解析作業を効率化できる。
【図面の簡単な説明】
【００１４】
【図１】本発明によるプログラム解析装置の一実施形態を示すブロック図である。
【図２】プログラム解析の対象とするプログラムファイルの例を示す説明図である。
【図３】プログラム解析の対象とするプログラムファイルの例を示す説明図である。
【図４】依存関係抽出部１０１が行う処理の例を示すフローチャートである。
【図５】分岐箇所抽出部１０３が行う処理の例を示すフローチャートである。
【図６】排他的分岐箇所検出部１０５が行う処理の例を示すフローチャートである。
【図７】本発明におけるプログラム解析装置の最小構成を示すブロック図である。
【発明を実施するための形態】
【００１５】
以下、本発明の実施形態を図面を参照して説明する。
【００１６】
図１は、本発明によるプログラム解析装置の一実施形態を示すブロック図である。本発明におけるプログラム解析装置は、プログラムファイル記憶部１００と、依存関係抽出部１０１と、依存関係記憶部１０２と、分岐箇所抽出部１０３と、分岐箇所記憶部１０４と、排他的分岐箇所検出部１０５と、排他的分岐箇所記憶部１０６とを備えている。
【００１７】
プログラムファイル記憶部１００は、プログラム解析の対象とするプログラムファイル（以下、解析対象ファイルと記す。）を記憶する記憶装置である。
【００１８】
依存関係抽出部１０１は、プログラムファイル記憶部１００から解析対象ファイルを読み取り、その解析対象ファイルから、処理の集合（以下、処理群と記す。）を識別する情報（以下、プログラム要素と記す。）を抽出する。プログラム要素とは、例えば、関数やプロシージャ、手続きやサブルーチンといった処理群を示す関数名やプロシージャ名、手続き名やサブルーチン名などであるが、プログラム要素は上記内容に限定されない。なお、以下の説明では、プログラム要素として関数名を使用する場合について説明する。
【００１９】
プログラム要素の抽出は、既存の構文解析の技術により実現される。具体的には、プログラムファイルは所定の文法に従って書かれるため（言い換えれば、プログラム要素を抽出することができるように文法が定められているため）、プログラムファイルからデータを読み出し、その文法に従って構文解釈することによりプログラム要素を抽出できる。なお、構文解析の技術は広く知られているため、ここでは説明を省略する。
【００２０】
また、依存関係抽出部１０１は、プログラム要素が識別する処理群ごとに、その処理群から呼び出されるプログラム要素の処理内容が記載されたファイルを特定する。なお、処理群から呼び出されるプログラム要素の処理内容が記載されたファイルには、その処理群で実際に実行される処理内容が記載されていることから、その処理群が依存するファイルということができる。そのため、以下の説明では、その処理群から呼び出されるプログラム要素の処理内容が記載（定義）されたファイルを、依存ファイルと記す。例えば、「関数ｆが実行されるとき、プログラムファイルＦ内で定義されているプログラム要素を呼び出す（もしくは、利用する）」ことを、「関数ｆがプログラムファイルＦに依存している」と言うことができる。以下、順を追って説明する。
【００２１】
まず、依存関係抽出部１０１は、プログラム要素の処理内容が記載されたプログラムファイル（以下、定義ファイルと記すこともある。）を特定する。例えば、プログラムファイルＢに関数ａの処理内容が記載されている場合、依存関係抽出部１０１は、プログラム要素である関数ａの処理内容が記載されたファイルをプログラムファイルＢと特定する。
【００２２】
例えば、依存関係抽出部１０１は、プログラムファイルＦの中にプログラム要素ａの定義を発見した場合に「プログラム要素ａを定義するのはプログラムファイルＦである」と解釈して定義ファイルを特定すればよい。なお、プログラム要素の定義方法は所定の文法に従うため、依存関係抽出部１０１は、プログラム要素の抽出方法と同様に既存の構文解析の技術を用いてプログラム要素の定義を抽出すればよい。
【００２３】
そして、依存関係抽出部１０１は、その処理群に含まれているプログラム要素を特定し、そのプログラム要素が定義された定義ファイルを、依存ファイルとして特定する。依存関係抽出部１０１は、プログラム要素が依存しているファイルとの依存関係を依存関係記憶部１０２に記憶させる。
【００２４】
図２を使用して、依存関係抽出部１０１が行う処理について以下に詳述する。図２は、プログラム解析の対象とするプログラムファイルの例を示す説明図である。図２に示す例では、依存関係抽出部１０１は、プログラム要素として、ファイル「ｆ．ｃ」からプログラム要素ｆ，ａ，ｂを、ファイル「ａ．ｈ」からプログラム要素ａを、ファイル「ｂ．ｈ」からプログラム要素ｂを、それぞれ抽出する。そして、依存関係抽出部１０１は、プログラム要素ｆ，ａ，ｂの定義ファイルとして、それぞれファイル「ｆ．ｃ」，「ａ．ｈ」，「ｂ．ｈ」と特定する。さらに、プログラム要素ｆが示す処理群には、プログラム要素ａ，ｂが含まれていることから、依存関係抽出部１０１は、プログラム要素ｆがプログラム要素ａ，ｂが定義されている定義ファイル「ａ．ｈ」，「ｂ．ｈ」に依存している（すなわち、プログラム要素ｆの依存ファイルは、ファイル「ａ．ｈ」，「ｂ．ｈ」）と特定する。依存関係抽出部１０１は、これらの依存関係を依存関係記憶部１０２に記憶させる。
【００２５】
依存関係記憶部１０２は、依存関係抽出部１０１が特定した依存関係、すなわち、プログラム要素と依存ファイルの情報とを対応付けて記憶する記憶装置である。例えば、プログラム要素ｆがファイル「ａ．ｈ」，「ｂ．ｈ」に依存している場合、依存関係記憶部１０２は、「プログラム要素ｆとファイル「ａ．ｈ」」及び「プログラム要素ｆとファイル「ｂ．ｈ」」を対応付けて記憶する。
【００２６】
分岐箇所抽出部１０３は、プログラムファイル記憶部１００から解析対象ファイルを読み取り、構文要素に分解する。分岐箇所抽出部１０３は、分解した構文要素の中からプログラムの処理が分岐する箇所（以下、分岐箇所と記す。）を抽出する。なお、構文要素とは、例えば、関数・プロシージャの呼び出し、変数への代入、分岐、繰り返しといったプログラムの実際の挙動を示すものであり、多くのプログラミング言語で「式」や「文」などと呼ばれているものである。構文要素は文法に従って構成されているため、文法通りに解釈することにより、構文要素へ分解することができる。なお、構文要素へ分解する方法は、既存の構文解析の技術により実現でき、この方法についても広く知られているため、説明を省略する。
【００２７】
また、分岐箇所を抽出する方法も広く知られている。例えば、分岐箇所抽出部１０３は、構文要素として「ｉｆ」や「ｃａｓｅ」などの分岐処理を示す文字列が発見された場合、その後に出現する { などの記号に対応する } までを、プログラム内の分岐箇所として抽出してもよいが、分岐箇所を抽出する方法は、上記方法に限定されない。分岐箇所抽出部１０３は、抽出した分岐箇所の情報を分岐箇所記憶部１０４に記憶させる。
【００２８】
分岐箇所記憶部１０４は、分岐箇所抽出部１０３が抽出した分岐箇所の情報を記憶する記憶装置である。分岐箇所記憶部１０４は、例えば、ファイル名や行番号の範囲などにより、分岐箇所が存在する位置を記憶してもよい。例えば、図２に示す例では、分岐箇所記憶部１０４は、分岐箇所として、ファイル名「ｆ．ｃ」と、行番号の範囲「５〜９行目」とを対応付けて記憶してもよい。もしくは、分岐箇所記憶部１０４は、分岐箇所として、ファイル名「ｆ．ｃ」と、行番号の範囲「５〜９行目」とに加え、その分岐箇所のプログラムの内容を併せて記憶してもよい。以下の説明では、分岐箇所記憶部１０４が、分岐箇所のプログラムの内容を併せて記憶する場合について説明する。
【００２９】
排他的分岐箇所検出部１０５は、分岐箇所記憶部１０４から分岐箇所の情報を読み取り、その分岐箇所の分岐先の情報を抽出する。分岐先とは、分岐によって選択される構文要素の集まりを示し、例えば、Ｃ言語などのプログラミング言語では「ブロック」と呼ばれるものに相当する。ただし、分岐先は、Ｃ言語における「ブロック」に限定されない。例えば、図２に示す例では、５行目の｛から７行目の｝までを１つの分岐先として、また、７行目の｛から９行目の｝までを１つの分岐先としてそれぞれ抽出する。なお、分岐箇所から分岐先の情報を抽出する方法は、既存の構文解析の技術により実現でき、この方法も広く知られているため、説明を省略する。
【００３０】
排他的分岐箇所検出部１０５は、抽出した分岐先の依存ファイルを特定する。排他的分岐箇所検出部１０５は、例えば、分岐先に含まれるプログラム要素を分岐先ごとに抽出し、そのプログラム要素が依存するファイルを依存関係記憶部１０２に記憶された依存関係をもとに特定する。なお、依存関係記憶部１０２に記憶された依存関係は依存関係抽出部１０１が特定した依存関係であるから、排他的分岐箇所検出部１０５は、分岐先ごとに、依存関係抽出部１０１が特定した依存ファイルを利用して、その分岐先の依存ファイルを特定しているといえる。
【００３１】
また、排他的分岐箇所検出部１０５は、特定したファイルを分岐先ごとに比較し、分岐先が依存するファイルが他の分岐先が依存するファイルと排他的関係がある場合に、それらの分岐先が含まれる分岐箇所の情報を抽出する。以下、これらの排他的関係にある分岐箇所を、排他的分岐箇所と記す。排他的分岐箇所検出部１０５は、その排他的分岐箇所の情報を排他的分岐箇所記憶部１０６に記憶させる。
【００３２】
プログラムは習慣的に、密接に関連する機能のまとまりを一つのファイルとして作成される。したがって、異なるプログラムファイルに依存する分岐先に分岐する分岐箇所は、プログラムの挙動が大きく変換する部分と考えられる。この部分は、プログラム解析者が特に関心のある部分である。したがって、このような分岐箇所を抽出することにより、プログラム解析の対象とする分岐箇所の解析作業を効率化できる。
【００３３】
なお、上記説明では、排他的分岐箇所検出部１０５が、依存関係記憶部１０２に記憶された依存関係をもとに分岐先の依存ファイルを特定する場合について説明したが、排他的分岐箇所検出部１０５が分岐先の依存ファイルを特定する方法は、上記方法に限定されない。例えば、排他的分岐箇所検出部１０５が、分岐先ごとにプログラム要素を定義するファイルを特定することにより、その分岐先の依存ファイルを特定してもよい。この場合、依存関係抽出部１０１は、プログラム要素と定義ファイルとの関係を依存関係記憶部１０２に記憶させなくてもよい。
【００３４】
排他的分岐箇所記憶部１０６は、排他的分岐箇所検出部１０５が抽出した排他的分岐箇所の情報を記憶する記憶装置である。排他的分岐箇所記憶部１０６は、分岐箇所記憶部１０４が記憶するフォーマットと同一の形式で排他的分岐箇所の情報を記憶してもよいし、他の形式で記憶してもよい。
【００３５】
なお、上記説明では、依存関係記憶部１０２と、分岐箇所記憶部１０４と、排他的分岐箇所記憶部１０６とは、別の記憶装置である場合について説明しているが、依存関係記憶部１０２と、分岐箇所記憶部１０４と、排他的分岐箇所記憶部１０６とは、別の記憶装置であってもよく、また同一の記憶装置であってもよい。
【００３６】
依存関係抽出部１０１と、分岐箇所抽出部１０３と、排他的分岐箇所検出部１０５とは、例えば、プログラム（プログラム解析プログラム）に従って動作するコンピュータのＣＰＵによって実現される。例えば、プログラムは、プログラム解析装置が備える記憶部（図示せず）に記憶され、ＣＰＵは、そのプログラムを読み込み、プログラムに従って依存関係抽出部１０１、分岐箇所抽出部１０３及び排他的分岐箇所検出部１０５として動作してもよい。
【００３７】
排他的分岐箇所検出部１０５が排他的分岐箇所を抽出する方法について、以下に詳述する。例えば、図２に示す例において、排他的分岐箇所検出部１０５は、５行目の｛から７行目の｝までの分岐先（以下、分岐箇所Ａと記す。）からプログラム要素ａ、７行目の｛から９行目の｝までの分岐先（以下、分岐先Ｂと記す。）からプログラム要素ｂをそれぞれ抽出する。依存関係記憶部１０２を参照すると、プログラム要素ａはファイル「ａ．ｈ」に依存し、プログラム要素ｂはファイル「ｂ．ｈ」に依存することから、排他的分岐箇所検出部１０５は、分岐箇所Ａがファイル「ａ．ｈ」に依存し、分岐箇所Ｂがファイル「ｂ．ｈ」に依存していることを特定できる。この場合、分岐箇所Ａはファイル「ｂ．ｈ」に依存せず、分岐箇所Ｂはファイル「ａ．ｈ」に依存していない。このように、処理が分岐することにより、完全にファイル「ａ．ｈ」が選ばれるか、完全にファイル「ｂ．ｈ」が選ばれるかという排他的な関係が発生する。このような関係を排他的関係と呼ぶ。このような関係の場合、排他的分岐箇所検出部１０５は、排他的関係があると判断し、その分岐先が含まれる分岐箇所の情報（例えば、ファイル「ｆ．ｃ」の５〜９行目）を排他的分岐箇所として抽出し、その排他的分岐箇所の情報を排他的分岐箇所記憶部１０６に記憶させる。
【００３８】
また、排他的分岐箇所検出部１０５は、排他的分岐箇所を特定する情報として、排他的分岐箇所を含むプログラム要素名や、排他的分岐箇所のプログラム要素上の位置などを抽出してもよい。例えば、図２に示す例において、排他的分岐箇所検出部１０５は、排他的分岐箇所を含むプログラム要素として、プログラム要素ｆを抽出してもよい。また、排他的分岐箇所検出部１０５は、排他的分岐箇所がプログラム要素ｆ上の「２行目から６行目」に位置するという情報を抽出してもよい。なお、抽出する情報は１つであってもよく、複数であってもよい。このように、排他的分岐箇所の詳細な情報を知ることにより、プログラム解析者は、プログラム解析の対象とする分岐箇所の解析作業をより効率化できる。
【００３９】
図３は、プログラム解析の対象とする他のプログラムファイルの例を示す説明図である。図３に示す例では、解析するプログラムファイルが、ファイルＦ１，Ｆ２，Ｆ３の３種類存在し、プログラム要素ａ１，ａ２がファイルＡに、プログラム要素ｂ１，ｂ２がファイルＢに、プログラム要素ｃ１，ｃ２がファイルＣに、それぞれ定義されていることを示す。
【００４０】
ファイルＦ１の場合、プログラム要素ａ１，ａ２が含まれる分岐先はファイルＡに依存しており、ファイルＢやファイルＣには依存していない。同様に、プログラム要素ｂ１，ｂ２が含まれる分岐先はファイルＢに依存しており、ファイルＡやファイルＣには依存せず、プログラム要素ｃ１，ｃ２が含まれる分岐先はファイルＣに依存しており、ファイルＡやファイルＢには依存してない。つまり、完全にファイルＡが選ばれるか、完全にファイルＢが選ばれるか、完全にファイルＣが選ばれるかという排他的な選択が行われることになるため、このような場合、排他的分岐箇所検出部１０５は、排他的関係があると判断する。
【００４１】
一方、ファイルＦ２の場合、プログラム要素ａ１，ｂ１が含まれる分岐先はファイルＡ及びファイルＢに依存しており、プログラム要素ａ２，ｂ２が含まれる分岐先もファイルＡ及びファイルＢに依存している。つまり、完全にファイルＡが選ばれるか、完全にファイルＢが選ばれるかという排他的な選択が行われていないため、このような場合、排他的分岐箇所検出部１０５は、排他的関係がないと判断する。
【００４２】
ファイルＦ３の場合、プログラム要素ａ１，ｂ１が含まれる分岐先はファイルＡ及びファイルＢに依存しており、プログラム要素ａ２，ｂ２が含まれる分岐先もファイルＡ及びファイルＢに依存している。しかし、プログラム要素ｃ１，ｃ２が含まれる分岐先はファイルＣに依存している。つまり、完全にファイルＣが選ばれるかという排他的な選択が行われることになるため、このような場合、排他的分岐箇所検出部１０５は、排他的関係があると判断する。このように、排他的分岐箇所検出部１０５は、ある分岐先で呼び出されるファイルがその分岐先以外の他の分岐先で呼び出されない場合に、その分岐先とその分岐先以外の他の分岐先とを含む分岐箇所を排他的関係があると判断して抽出すればよい。
【００４３】
次に、動作について説明する。図４は、依存関係抽出部１０１が行う処理の例を示すフローチャートである。依存関係抽出部１０１は、プログラムファイル記憶部１００から解析対象ファイルを読み取る（ステップＳ３１）。次に、依存関係抽出部１０１は、読み込んだ解析対象ファイルからプログラム要素を抽出する（ステップＳ３２）。依存関係抽出部１０１は、抽出した各プログラム要素について、そのプログラム要素を定義するプログラムファイル（すなわち、定義ファイル）を特定し、依存ファイルを特定する（ステップＳ３３）。依存関係抽出部１０１は、特定した依存関係を依存関係記憶部１０２に記憶させる（ステップＳ３４）。
【００４４】
図５は、分岐箇所抽出部１０３が行う処理の例を示すフローチャートである。分岐箇所抽出部１０３は、プログラムファイル記憶部１００から解析対象ファイルを読み取る（ステップＳ３５）。次に、分岐箇所抽出部１０３は、読み込んだ解析対象ファイルから分岐箇所を抽出する（ステップＳ３６）。分岐箇所抽出部１０３は、抽出した分岐箇所の情報をまとめて分岐箇所記憶部１０４に記憶させる（ステップＳ３７）。
【００４５】
図６は、排他的分岐箇所検出部１０５が行う処理の例を示すフローチャートである。排他的分岐箇所検出部１０５は、分岐箇所記憶部１０４に記憶された分岐箇所の情報を読み取る（ステップＳ３８）。次に、排他的分岐箇所検出部１０５は、読み込んだ分岐箇所の情報から分岐先の情報を抽出する（ステップＳ３９）。排他的分岐箇所検出部１０５は、プログラム要素が依存するファイルの情報（すなわち、依存関係）を依存関係記憶部１０２から読み取る（ステップＳ４０）。排他的分岐箇所検出部１０５は、ステップＳ３９で抽出した各分岐先について、分岐先が依存するファイルを、ステップＳ４０で読み取った依存関係をもとに特定する（ステップＳ４１）。排他的分岐箇所検出部１０５は、特定したファイルを分岐先ごとに比較する（ステップＳ４２）。排他的分岐箇所検出部１０５は、分岐先が依存するファイルが他の分岐先が依存するファイルと排他的関係にあるか否か判断する（ステップＳ４３）。排他的関係がある場合（ステップＳ４３におけるＹＥＳ）、排他的分岐箇所検出部１０５は、その分岐先が含まれる分岐箇所を排他的分岐箇所として排他的分岐箇所記憶部１０６に記憶させる（ステップＳ４４）。排他的関係がない場合（ステップＳ４３におけるＮＯ）には処理を終了する。
【００４６】
本発明によれば、解析対象のプログラムから、処理群を識別するプログラム要素を抽出し、プログラム要素が識別する処理群ごとに、その処理群から呼び出されるプログラム要素の処理内容が記載された依存ファイルを特定する。また、その特定内容を利用して、解析対象のプログラムから抽出した分岐箇所から分岐した分岐先ごとの依存ファイルを特定する。そして、分岐先が依存する依存ファイルが他の分岐先が依存する依存ファイルと排他的関係にある場合に、その分岐先と他の分岐先とを含む排他的分岐箇所を抽出する。よって、プログラム解析の対象とする分岐箇所の解析作業を効率化できる。
【００４７】
プログラムは習慣的に、密接に関連する機能のまとまりを一つのファイルとして作成する。よって、異なるファイル内の分岐とは、密接に関連する機能を越えた分岐と言い換えることが出来る。密接に関連する機能を越えた分岐とは、機能を丸ごと切り替えるような分岐であると言える。機能が丸ごと切り替わるとは、プログラムの挙動が大きく変わることだと言う事が出来る。対して、同一ファイル内の分岐は、機能を丸ごと切り替えるような分岐ではないため、プログラムの挙動を大きく変えると言うことはできない。
【００４８】
プログラム解析者が特に関心のあるプログラムの挙動を大きく変化させる分岐箇所は、複数のプログラムの機能に分岐する傾向にある。また、複数のプログラムの機能は、それぞれ複数のプログラムファイルに分けて記述される傾向にある。これらのことから、異なるプログラムファイルに依存する分岐先に分岐する分岐箇所を抽出することで、プログラム内に存在する全ての分岐箇所からプログラム解析者が特に関心があるプログラムの挙動を大きく変化させる分岐箇所だけを抽出することができる。
【実施例】
【００４９】
以下、具体的な実施例により本発明を説明するが、本発明の範囲は以下に説明する内容に限定されない。
【００５０】
図２の例に示すプログラムファイルを使用して動作を説明する。図２の例に示すプログラムファイル「ｆ．ｃ」には、Ｃ言語で作成されたソースコードが記載されていることを示す。依存関係抽出部１０１は、このプログラムファイルを読み込むと、プログラム要素である関数ｆを定義するプログラムファイルが「ｆ．ｃ」、プログラム要素ａを定義するプログラムファイルが「ａ．ｈ」、プログラム要素ｂを定義するプログラムファイルが「ｂ．ｈ」と特定する。また、依存関係抽出部１０１は、プログラムファイルが「ｆ．ｃ」が依存するファイルがプログラムファイル「ａ．ｈ」及び「ｂ．ｈ」であると特定し、依存関係記憶部１０２にプログラム要素ｆと、プログラムファイル「ａ．ｈ」及び「ｂ．ｈ」と対応付けて記憶する。ここで、「プログラム要素ｆとファイル「ａ．ｈ」」、「プログラム要素ｆとファイル「ｂ．ｈ」」の関係が依存の関係であり、「プログラム要素ｆとファイル「ｆ.ｃ」」、「プログラム要素ａとファイル「ａ．ｈ」」、「プログラム要素ｂとファイル「ｂ．ｈ」」の関係が定義の関係である。
【００５１】
分岐箇所抽出部１０３は、このプログラムファイルを読み込むと、ファイル「ｆ．ｃ」の５行目「if(arg<0){」から、９行目「} 」までの分岐箇所を分岐箇所記憶部１０４に記憶させる。排他的分岐箇所検出部１０５は、これらの結果から、この分岐箇所の分岐先「a();」と「b();」を抽出し、プログラム要素ａがプログラムファイル「ａ．ｈ」に依存し，プログラム要素ｂがプログラムファイル「ｂ．ｈ」に依存することを特定する。これらプログラムファイルを比較すると排他的な関係であるため、排他的分岐箇所検出部１０５は、この分岐箇所を依存関係が排他的な分岐箇所（すなわち、排他的分岐箇所）として排他的分岐箇所記憶部１０６に記憶させる。
【００５２】
なお、本実施例ではＣ言語を使用した場合の例を説明したが、プログラムに使用する言語はＣ言語に限定されない。複数のプログラムファイルと分岐箇所を持ち合わせたその他のプログラムにおいて、他の言語を用いた場合でも同様の解析処理を行うことができる。
【００５３】
図７は、本発明におけるプログラム解析装置の最小構成を示すブロック図である。本発明によるプログラム解析装置は、解析対象のプログラムから、処理の集合である処理群（例えば、関数など）を識別する情報である処理群識別情報（例えば、プログラム要素、関数名など）を抽出する処理群識別情報抽出手段８１（例えば、依存関係抽出部１０１）と、処理群識別情報が識別する処理群ごとに、その処理群から呼び出される処理群識別情報の処理内容が記載されたファイルである呼出ファイル（例えば、依存ファイル）を特定する呼出ファイル特定手段８２（例えば、依存関係抽出部１０１、もしくは、排他的分岐箇所検出部１０５）と、処理が分岐する分岐箇所をプログラムから抽出する分岐箇所抽出手段８３（例えば、分岐箇所抽出部１０３）と、分岐箇所から分岐した先の処理である分岐先ごとに、呼出ファイル特定手段８２が特定した呼出ファイルを利用してその分岐先の呼出ファイルを特定する分岐先呼出ファイル特定手段８４（例えば、排他的分岐箇所検出部１０５）と、分岐先呼出ファイル特定手段８４が特定した一の分岐先で呼び出される呼出ファイルと、他の分岐先で呼び出される呼出ファイルとが排他的関係にある場合に、その一の分岐先と他の分岐先とを含む分岐箇所である排他的分岐箇所を抽出する排他的分岐箇所抽出手段８５（例えば、排他的分岐箇所検出部１０５）とを備える。
【００５４】
そのような構成により、プログラム解析の対象とする分岐箇所の解析作業を効率化できる。
【００５５】
すなわち、異なるプログラムファイルに依存する分岐先に分岐する分岐箇所は、プログラムの挙動が大きく変換する部分と考えられ、この部分は、プログラム解析者が特に関心のある部分である。そのため、排他的分岐箇所検出部１０５が、このような分岐箇所を抽出することにより、プログラム解析の対象とする分岐箇所の解析作業を効率化できる。
【００５６】
また、上記実施形態には、処理群識別情報と呼出ファイルの情報とを対応付けて記憶する呼出ファイル記憶手段（例えば、依存関係記憶部１０２）と、呼出ファイル特定手段が特定した処理群識別情報に対する呼出ファイルの情報を登録する呼出ファイル登録手段（例えば、依存関係抽出部１０１）とを備え、分岐先呼出ファイル特定手段８４が、分岐先に含まれる処理群識別情報に対応する呼出ファイルの情報を呼出ファイル記憶手段から読み取って分岐先ごとの呼出ファイルを特定する構成が開示されている。
【００５７】
また、排他的分岐箇所抽出手段８５が、一の分岐先で呼び出される呼出ファイルが一の分岐先以外の他の分岐先で呼び出されない場合に、その一の分岐先と一の分岐先以外の他の分岐先とを含む分岐箇所を抽出してもよい。
【００５８】
また、排他的分岐箇所抽出手段８５は、排他的分岐箇所を特定する情報として、分岐箇所を含むプログラムファイル名（例えば、図２におけるファイル「ｆ．ｃ」）、その分岐箇所のプログラムファイル上の位置（例えば、図２におけるファイル「ｆ．ｃ」の「５〜９行目」）、その分岐箇所を含む処理群識別情報（例えば、図２におけるプログラム要素ｆ）、その分岐箇所の処理群識別情報の位置（例えば、図２における、プログラム要素ｆ上の「２行目から６行目」）のうちのいずれかを含む情報を抽出してもよい。
【００５９】
また、分岐箇所抽出手段８３が、プログラムを構文要素に分解し、構文要素が所定の文字列（例えば、「ｉｆ」、「ｃａｓｅ」）を含む場合に分岐箇所として抽出してもよい。
【産業上の利用可能性】
【００６０】
本発明は、プログラム解析の負担を軽減するプログラム解析装置に好適に適用される。
【符号の説明】
【００６１】
１００  プログラムファイル記憶部
１０１  依存関係抽出部
１０２  依存関係記憶部
１０３  分岐箇所抽出部
１０４  分岐箇所記憶部
１０５  排他的分岐箇所検出部
１０６  排他的分岐箇所記憶部
【図１】
2010191622.tif 000003
【図２】
2010191622.tif 000004
【図３】
2010191622.tif 000005
【図４】
2010191622.tif 000006
【図５】
2010191622.tif 000007
【図６】
2010191622.tif 000008
【図７】
2010191622.tif 000009