(57)【要約】【課題】分岐やループを含むソースコードからリソース捕捉関数とリソース解放関数のペアを抽出する。【解決手段】ソースコード中、第１の関数が呼び出された位置から処理が辿る可能性のある実行パスにループが含まれる場合に、プログラム解析装置は、当該ループを１回からｎ回（ｎは２以上の自然数）まで繰り返して実行した場合のそれぞれについて、処理が辿る可能性のある実行パスを生成する。そして、プログラム解析装置は、生成した実行パスにおいて、第１の関数と、第１の関数の戻り値を格納する変数と、第１の関数とは異なり該第１の関数の戻り値を格納する変数を引数とする第２の関数と、の出現パタンが、リソース捕捉関数とリソース解放関数の出現パタンに合致するか判定する。合致する場合、プログラム解析装置は、第１の関数と第２の関数とをリソース捕捉関数とリソース解放関数のペアとして抽出する。【選択図】図１８
2018028879.tif 000002
【特許請求の範囲】
【請求項１】
ソースコード中、第１の関数が呼び出された位置から処理が辿る可能性のある実行パスにループが含まれる場合に、当該ループを１回からｎ回（ｎは２以上の自然数）まで繰り返して実行した場合のそれぞれについて、処理が辿る可能性のある実行パスを生成する生成部と、
生成した前記実行パスにおいて、前記第１の関数と、前記第１の関数の戻り値を格納する変数と、前記第１の関数とは異なり該第１の関数の戻り値を格納する前記変数を引数とする第２の関数と、の出現パタンが、リソース捕捉関数とリソース解放関数の出現パタンに合致する場合、前記第１の関数と前記第２の関数とをリソース捕捉関数とリソース解放関数のペアとして抽出する抽出部と、
を備えることを特徴とするプログラム解析装置。
【請求項２】
前記生成部は、前記第１の関数の戻り値を前記変数に格納する第１の処理と、当該変数を引数とし、前記第１および第２の関数と異なる第３の関数を呼び出す第２の処理と、前記変数を引数とする前記第２の関数を呼び出す第３の処理と、の出現順序のみを示す実行パスを生成することを特徴とする請求項１に記載のプログラム解析装置。
【請求項３】
前記生成部は、生成した前記実行パスに、前記第１および第２の関数がリソース捕捉関数とリソース解放関数であるとした場合に、リソース捕捉関数とリソース解放関数の出現パタンに合致しない箇所がある場合、合致しない箇所を一部を残して削除することにより、前記実行パスを短くすることを特徴とする請求項２に記載のプログラム解析装置。
【請求項４】
前記生成部は、生成した前記実行パスが、
（１）前記第３の処理を３以上含む場合、２回目の前記第３の処理の出現より後の処理を削除し、
（２）前記第１の処理の後、前記第２の処理を２以上含む場合、２回目以降の前記第２の処理を削除し、
（３）前記第３の処理の後、前記第２の処理を２以上含む場合、２回目以降の前記第２の処理を削除する、
ことにより、前記実行パスを短くすることを特徴とする請求項３に記載のプログラム解析装置。
【請求項５】
前記生成部は、前記ループをｎ回実行した場合に得られる実行パスと、前記ループを（ｎ−１）回実行した場合に得られる実行パスと、が等しくなった場合に、前記実行パスの生成を終了することを特徴とする請求項１から４のいずれか１項に記載のプログラム解析装置。
【請求項６】
前記抽出部は、前記ソースコード中に、前記第１の関数を呼び出して戻り値を変数に格納する位置が複数ある場合に、各位置から辿ることができる１以上の実行パスのうち、前記出現パタンに合致する実行パスが少なくとも一つ存在することを条件として、前記第１の関数と前記第２の関数とを抽出することを特徴とする請求項１から５のいずれか１項に記載のプログラム解析装置。
【請求項７】
ソースコード中、第１の関数が呼び出された位置から処理が辿る可能性のある実行パスにループが含まれる場合に、当該ループを１回からｎ回（ｎは２以上の自然数）まで繰り返して実行した場合のそれぞれについて、処理が辿る可能性のある実行パスを生成する生成工程と、
生成した前記実行パスにおいて、前記第１の関数と、前記第１の関数の戻り値を格納する変数と、前記第１の関数とは異なり前記変数を引数とする第２の関数と、の出現パタンが、リソース捕捉関数とリソース解放関数の出現パタンに合致する場合、前記第１の関数と前記第２の関数とをリソース捕捉関数とリソース解放関数のペアとして抽出する抽出工程と、
をコンピュータが実行することを特徴とするプログラム解析方法。
【請求項８】
コンピュータを請求項１〜６のいずれか１項に記載のプログラム解析装置として機能させるためのプログラム解析プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム解析装置、プログラム解析方法およびプログラム解析プログラムに関する。
【背景技術】
【０００２】
プログラム作成時に誤りを検出する技術が研究されている。そのひとつに、静的コード解析によりプログラムの誤りの可能性のある箇所を検出する技術がある。
【０００３】
静的コード解析による誤り検出技術の例として、Ｃプログラムを対象としたｍａｌｌｏｃ関数で確保したメモリがｆｒｅｅ関数で解放されていない箇所を検出する技術、ｍａｌｌｏｃ関数で確保した未初期化メモリを参照している箇所を検出する技術などがある（例えば非特許文献１参照）。
【先行技術文献】
【非特許文献】
【０００４】
【非特許文献１】W.  R.  Bush,  J.  D.  Pincus,  and  D.  J.  Sielaff,  “A  static  analyzer  for  finding  dynamic  programming  errors”,  Software  Practice  and  Experience,  2000年,  vol.  30,  No.  7,  pp.  775-802
【発明の概要】
【発明が解決しようとする課題】
【０００５】
ところで、プログラム作成者は、ｍａｌｌｏｃ関数やｆｒｅｅ関数などの一般的なリソース捕捉関数、リソース解放関数を使用するだけでなく、独自のリソース捕捉関数とリソース解放関数を用いてプログラムを作成することがある。
【０００６】
既存の静的コード解析ツールは、ｍａｌｌｏｃ関数やｆｒｅｅ関数などの一般的な関数で捕捉したリソースの未初期化参照やリソース解放漏れを検出できる。しかし、既存の静的コード解析ツールでは、プログラム作成者が独自のリソース捕捉関数とリソース解放関数を使用してプログラムを作成した場合に、プログラム作成者独自のリソース捕捉関数を用いて捕捉されたリソースの未初期化参照やリソース解放漏れを検出することができなかった。
【０００７】
そこで、既存の静的コード解析ツールに、プログラム作成者独自のリソース捕捉関数やリソース解放関数を登録し、ｍａｌｌｏｃ関数やｆｒｅｅ関数と同様に静的コード解析をすることも考えられる。すなわち、プログラム作成者独自のリソース捕捉関数が捕捉したリソースを、ｍａｌｌｏｃ関数が捕捉したメモリと同様に扱い、また、プログラム作成者独自のリソース捕捉関数が捕捉したリソースが独自の解放関数で解放されるべきという関係性を、ｍａｌｌｏｃ関数で捕捉されたメモリがｆｒｅｅ関数で解放されるべきという関係性と同様に扱うことによって、捕捉されたリソースの未初期化参照やリソース解放漏れを検出できると考えられる。
【０００８】
プログラム作成者独自の関数を静的コード解析ツールに登録するためには、静的コード解析ツールのユーザがリソース捕捉・解放関数を管理し登録することが必要となる。しかし、そのためには、静的コード解析を行うために、ユーザがリソース捕捉・解放関数を管理しておき、かつ、ツールに誤りなく登録する手間がかかり、利便性が悪い。
【０００９】
そこで、プログラム作成者独自のリソース捕捉・解放関数を、プログラムから自動的に検出する技術を開発することが考えられる。本発明者はこれまでに、リソース捕捉関数とリソース解放関数とがソースコード上に対になって出現することに着目して、ソースコードを解析して自動的にリソース捕捉関数とリソース解放関数のペアを検出する技術を提案している（特願２０１５−０２８４５６号）。また、本発明者は、作成されたプログラムがリソース解放漏れを含む可能性があることを前提として、リソース解放漏れの誤りを含む可能性がある経路を検出する技術も提案している（特願２０１５−１５６９４５号）。
【００１０】
開示の実施形態は、上記に鑑みてなされたものであり、分岐やループを含むソースコードからリソース捕捉関数とリソース解放関数のペアを抽出することを目的とする。
【課題を解決するための手段】
【００１１】
開示するプログラム解析装置、プログラム解析方法およびプログラム解析プログラムは、ソースコード中、第１の関数が呼び出された位置から処理が辿る可能性のある実行パスにループが含まれる場合に、当該ループを１回からｎ回（ｎは２以上の自然数）まで繰り返して実行した場合のそれぞれについて、処理が辿る可能性のある実行パスを生成する。そして、プログラム解析装置、プログラム解析方法およびプログラム解析プログラムは、生成した実行パスにおいて、第１の関数と、第１の関数の戻り値を格納する変数と、第１の関数とは異なり該第１の関数の戻り値を格納した変数を引数とする第２の関数と、の出現パタンが、リソース捕捉関数とリソース解放関数の出現パタンに合致する場合、第１の関数と第２の関数とをリソース捕捉関数とリソース解放関数のペアとして抽出する。
【発明の効果】
【００１２】
開示するプログラム解析装置、プログラム解析方法およびプログラム解析プログラムは、分岐やループを含むソースコードからリソース捕捉関数とリソース解放関数のペアを抽出するという効果を奏する。
【図面の簡単な説明】
【００１３】
【図１】図１は、本実施の形態におけるプログラム解析処理の概要について説明するための図である。
【図２】図２は、ソースコード中、関数ｆが複数回呼び出される場合の関数ペアの抽出手法について説明するための図である。
【図３】図３は、本実施の形態におけるプログラム解析装置の構成の一例を示すブロック図である。
【図４】図４は、本実施の形態におけるプログラム解析処理の流れの一例を示すフローチャートである。
【図５】図５は、ソースコード解析処理の流れの一例を示すフローチャートである。
【図６】図６は、プログラム解析装置の解析対象であるソースコードの一例を示す図である。
【図７】図７は、図６のソースコードから作成したサブルーチン展開コードの例を示す図である。
【図８】図８は、図７のサブルーチン展開コードから抽出した関数の、全関数集合と全関数ペア集合とを示す図である。
【図９】図９は、ソースコードに含まれる分岐やループの構造を簡略化して示す図である。
【図１０】図１０は、実行パス生成処理を説明するための、非決定的実行パスのセットの一例を示す図である。
【図１１】図１１は、実行パス生成処理を説明するための、ラベルパスのセットの一例を示す図である。
【図１２】図１２は、実行パス生成処理においてループを１回実行して縮約実行パスを生成する場合について説明するための図である。
【図１３】図１３は、実行パス生成処理においてループを２回実行して縮約実行パスを生成する場合について説明するための図である。
【図１４】図１４は、実行パス生成処理においてループを３回実行して縮約実行パスを生成する場合について説明するための図である。
【図１５】図１５は、実行パス生成処理においてループを４回実行して縮約実行パスを生成する場合について説明するための図である。
【図１６】図１６は、実行パス生成処理においてループを５回実行して縮約実行パスを生成する場合について説明するための図である。
【図１７】図１７は、実行パス生成処理においてループを６回実行して縮約実行パスを生成する場合について説明するための図である。
【図１８】図１８は、図１２乃至図１７に示す実行パス生成処理において生成される縮約実行パスを説明するための図である。
【図１９】図１９は、実施の形態に係る実行パス生成処理の流れの一例を示すフローチャートである。
【図２０】図２０は、実施の形態に係る実行パス生成処理により生成され、実行パス記憶部に記憶される情報の構成の一例を示す図である。
【図２１】図２１は、実施の形態に係る関数ペア抽出処理の流れの一例を示すフローチャートである。
【図２２】図２２は、開示の技術にかかるプログラム解析プログラムによる情報処理がコンピュータを用いて具体的に実現されることを示す図である。
【図２３】図２３は、アプリケーションプログラムがリソースを管理して動的に捕捉および解放を行う場合について説明するための図である。
【発明を実施するための形態】
【００１４】
以下に、開示する装置、方法およびプログラムの実施形態を図面に基づいて詳細に説明する。なお、この実施形態によりこの発明が限定されるものではない。また、各実施形態は適宜組み合わせることができる。
【００１５】
［リソースの初期化漏れの一例］
リソースを捕捉した後に解放漏れ（初期化誤り）が発生する例として、アプリケーションプログラムがリソースを管理して動的に捕捉および解放を行うような仕組みの場合が考えられる。例としては、システムと一定数のＦＡＸボードが接続されている場合に、アプリケーションプログラムがＦＡＸボードを操作するためにリソースを設けるような仕組みのプログラムを作成する場合が挙げられる。
【００１６】
図２３は、アプリケーションプログラムがリソースを管理して動的に捕捉および解放を行う場合について説明するための図である。図２３の例（１）の場合、アプリケーションプログラム（ＡＰ）が実行されると、最初に複数のリソース（Ｍ１〜Ｍ７）が生成される。そして、アプリケーションプログラムが実行される中で、最初に生成された複数のリソースの中から所定のリソースが捕捉されて使用され、使用後に解放される。たとえば、図２３の例では、リソースＭ１からＭ４までが順に捕捉されて、それぞれ、値Ａ，Ａ，Ｂ，Ａが書き込まれている。リソースＭ５，６，７は未使用であるため初期値となっている。
【００１７】
図２３の例（２）では、アプリケーションは、リソースＭ１からＭ７までを既に順番に使用し、再びリソースＭ１を使用しようとしている。このとき、リソースＭ１の１回目の使用が終了して初期化すべきところを、初期化されないままとなっていると、値Ａが記憶された状態のままである。このように、リソース捕捉後にリソースの初期化を行うべきところ、初期化されないままとなっている状態をリソース初期化漏れの誤りという。かかるリソース初期化漏れの誤りが発生すると、前の処理によってリソースに書き込まれた内容がそのまま残った状態で次の処理が行われることになり、意図しない結果が生じてしまうことがある。
【００１８】
以下に説明する実施形態では、このように同じ処理（リソースＭ１の捕捉、使用、解放）が繰り返し実行されるループを含むプログラムについて、独自に設定されたリソース捕捉関数とリソース解放関数のペアを抽出する。
【００１９】
［実施形態に係るプログラム解析処理の流れ］
図１は、本実施の形態に係るプログラム解析処理の概要について説明するための図である。本実施の形態に係るプログラム解析装置は、ソースコードを解析して、ソースコードの中からリソース捕捉関数とリソース解放関数のペアを抽出する。具体的には、プログラム解析装置は、ソースコードの解析結果に基づき、所定の出現パタンに合致する関数のペアをリソース捕捉関数とリソース解放関数のペアとして抽出する。また、本実施形態に係るプログラム解析装置は、ソースコードに分岐やループが含まれることを前提として、ソースコード解析を実行した上で、リソース捕捉関数とリソース解放関数のペアを抽出する。
【００２０】
図１を参照し、実施形態に係るプログラム解析処理において、プログラム解析装置は、まず、ソースコードの入力を受ける（図１の（１））。プログラム解析装置は、入力されるソースコードを解析して、ソースコード中に含まれる関数を抽出する。そして、プログラム解析装置は、ソースコードに含まれる関数全ての集合である全関数集合Ｆを生成する（図１の（２））。また、プログラム解析装置は、生成した全関数集合Ｆから、二つの関数のペアを抽出し、全関数ペア集合Ｆ×Ｆを生成する（図１の（３））。
【００２１】
また、プログラム解析装置は、ソースコードを解析して、ソースコードに含まれる分岐やループ構造を抽出する（図１の（４））。プログラム解析装置は、分岐やループ構造を解析して、ソースコードを実行した場合に生じうる処理の流れを実行パスとして生成する。本実施の形態においては、ソースコード中に分岐やループが含まれるとき、当該分岐やループを実行した場合に処理がたどる可能性がある複数の実行パスの中から一つの実行パスが非決定的に実行されるものとみなす。以下、ソースコードを実行した場合に処理がたどる可能性がある複数の実行パスを非決定的実行パスと呼ぶ（図１の（５））。
【００２２】
プログラム解析装置は、（３）で生成した全関数ペア集合Ｆ×Ｆから１つの関数ペア（ｆ，ｇ）を抽出する。そして、プログラム解析装置は、非決定的実行パス中の関数ペア（ｆ，ｇ）の出現パタンがリソース捕捉関数とリソース解放関数について予測されるパタンに合致するか否かを判定する（図１の（６））。
【００２３】
たとえば、リソース捕捉関数とリソース解放関数が使われる一般的なパタンとしては、リソース捕捉関数が呼び出されて、その結果がリソース格納変数に代入され、リソース格納変数を介してリソースが使われた後で、リソース解放関数が呼び出されるパタンがある。この場合、リソース捕捉関数が呼び出された後にリソース格納変数が参照される。リソース解放関数より後にリソース格納変数が参照されることはない。また、リソース捕捉関数が呼び出された後にリソース解放関数が呼び出されるが、リソース解放関数が２回以上呼び出されることはない。
【００２４】
ここで、関数ペア（ｆ，ｇ）が、リソース捕捉関数とリソース解放関数であると仮定する。すると、ソースコード中には、まずリソースを捕捉するために関数ｆの戻り値をリソース格納変数ｒに代入するコードが出現すると考えられる。次に、捕捉したリソースを使用するコードが出現し、最後に、関数ｇによってリソースを解放すると考えられる。すなわち、ソースコード中には、以下のようなコードが（１）〜（３）の順に出現すると予想される。
【００２５】
（１）ｒ＝ｆ（）
（２）ｆｕｎｃ（ｒ）
（３）ｇ（ｒ）
つまり、関数ペア（ｆ，ｇ）がリソース捕捉関数とリソース解放関数のペアであれば、（１）のように関数ｆが出現すれば、その後常に（２）（３）が出現すると考えられる。なお以下、説明の便宜上、適宜（１）に対応するコードを「ＡＬＬＯＣ」（略して「Ａ」）、（２）に対応するコードを「ＵＳＥ」（略して「Ｕ」）、（３）に対応するコードを「ＦＲＥＥ」（略して「Ｆ」）と呼ぶ。なお、以下の説明中、（２）のｆｕｎｃ（ｒ）はｓｏｍｅ＿ｆｕｎｃ（ｒ）とも表記する。
【００２６】
プログラム解析装置は、上の前提に基づき、生成した非決定的実行パス中に関数ペア（ｆ，ｇ）が、上記のパタンで出現するか否かを判定する。そして、プログラム解析装置は、関数ペア（ｆ，ｇ）が上記のパタンで出現する非決定的実行パスが存在する場合、関数ペア（ｆ，ｇ）をリソース捕捉関数とリソース解放関数のペアとして抽出する（図１の（７））。他方、いずれの非決定的実行パスにおいても関数ペア（ｆ，ｇ）が上記のパタンで出現しない場合、プログラム解析装置は、関数ペア（ｆ，ｇ）をリソース捕捉関数とリソース解放関数のペアとして抽出しない（図１の（８））。
【００２７】
プログラム解析装置は、全関数ペア集合Ｆ×Ｆに含まれるすべての関数ペアについて処理を繰り返すことで、ソースコードに含まれる関数ペアのうち、リソース捕捉関数とリソース解放関数のペアである可能性が高い関数ペアを抽出することができる。その後は、プログラム解析装置は、抽出した関数ペアを用いて任意の静的コード解析の手法を適用しソースコードをさらに解析することができる（図１の（９））。
【００２８】
なお、ソースコード中に関数ｆが呼び出される場合、戻り値が格納される変数は一つであるとは限らない。図２は、ソースコード中、関数ｆが複数回呼び出される場合の関数ペアの抽出手法について説明するための図である。図２の例では、ソースコード中、関数ｆは３回呼び出されている。そして、１回目に呼び出されたときには、関数ｆの戻り値は変数ｒに代入されている。また、２回目に呼び出されたときには、関数ｆの戻り値は変数ｒ’に代入されている。また、３回目に呼び出されたときには、関数ｆの戻り値は変数ｒ”に代入されている。この場合には、関数（ｆ，ｇ）がリソース捕捉関数とリソース解放関数のペアであるか否かを判断するにあたり、プログラム解析装置はまず、変数ｒに対応する処理について非決定的実行パスを生成する（図２の（１））。そして、プログラム解析装置は、生成した非決定的実行パスのうち、上記パタン「Ａ−Ｕ−Ｆ」に対応する実行パスがあるか否かを判定する。図２の例では、プログラム解析装置は、パタン「Ａ−Ｕ−Ｆ」に対応する実行パスあり（「条件に合致」）と判定する（図２の（２））。次に、プログラム解析装置は、変数ｒ’に対応する処理について非決定的実行パスを生成する（図２の（３））。そして、プログラム解析装置は、生成した非決定的実行パスのうち、上記パタン「Ａ−Ｕ−Ｆ」に対応する実行パスがあるか否かを判定する。図２の例では、プログラム解析装置は、パタン「Ａ−Ｕ−Ｆ」に対応する実行パスあり（「条件に合致」）と判定する（図２の（４））。最後に、プログラム解析装置は変数ｒ”に対応する処理について非決定的実行パスを生成する（図２の（５））。そして、プログラム解析装置は、生成した非決定的実行パスのうち、上記パタン「Ａ−Ｕ−Ｆ」に対応する実行パスがあるか否かを判定する。図２の例では、プログラム解析装置は、パタン「Ａ−Ｕ−Ｆ」に対応する実行パスあり（「条件に合致」）と判定する（図２の（６））。そして、プログラム解析装置は、すべての変数に対応する非決定的実行パスの中に少なくとも一つ、パタン「Ａ−Ｕ−Ｆ」に合致する実行パスが存在する場合、関数ペア（ｆ，ｇ）はリソース捕捉関数とリソース解放関数のペアであると判定する（図２の（７））。このように複数の変数に対応する関数ペア（ｆ，ｇ）の出現パタンに基づいてリソース捕捉関数とリソース解放関数のペアであるか否かを判定することで、判定精度をさらに向上させることができる。
【００２９】
［プログラム解析装置の構成の一例］
図３は、本実施の形態に係るプログラム解析装置１の構成の一例を示すブロック図である。
【００３０】
図３に示すプログラム解析装置１は、入力部１０と、制御部２０と、記憶部３０と、出力部４０と、を備える。
【００３１】
入力部１０は、情報の入力を受け付ける処理部である。たとえば、入力部１０は、プログラム解析装置１の解析対象となるソースコードの入力を受け付ける。後述する例においては、Ｃ言語のソースコードを説明する。ただし、本実施の形態のプログラム解析方法は、Ｃ言語のみに限らず他のプログラミング言語にも適用できる。
【００３２】
制御部２０は、プログラム解析装置１を制御する。制御部２０はたとえば、ＣＰＵ（Central  Processing  Unit）、ＭＰＵ（Micro  Processing  Unit）や、ＡＳＩＣ（Application  Specific  Integrated  Circuit）等で構成することができる。制御部２０は、解析部２１、生成部２２、および抽出部２３を備える。
【００３３】
解析部２１は、入力部１０が入力を受付けたソースコードを解析する。具体的には、解析部２１は、ソースコード中でサブルーチン呼出し（関数呼出し）している箇所に、そのサブルーチン（関数）の定義コードを書き足してサブルーチン展開コードを作成し、サブルーチン展開コードの各行について、関数呼出しをしているか、関数の返却値を格納する変数はなにか、関数の引数はなにか、分岐しているか、分岐後の合流地点はどこか、利用されている変数はなにか、などの情報を解析する。解析部２１による処理は、特願２０１５−１５６９４５号に記載の処理と同様である。
【００３４】
解析部２１はまた、ソースコードに含まれる関数を抽出して全関数集合Ｆおよび全関数ペア集合Ｆ×Ｆを作成する。
【００３５】
生成部２２は、解析部２１の解析結果を基に実行パスを生成する。実行パスは、ソースコードの処理の流れを表す。生成部２２は、解析結果に基づき、ソースコード中の分岐やループを展開して、可能性がある複数の実行パス（非決定的実行パス）を生成する。たとえば、図１の（４）の例には、ループ構造と分岐を含む処理の流れが示されている。生成部２２はたとえば、図１の（４）の場合、ループ内を１回実行する以下のような非決定的実行パスを生成する。
（１）１−２−３−４−１１
（２）１−２−５−６−１１
（３）１−２−７−８−１１
（４）１−２−９−１０−１１
【００３６】
生成部２２はさらに、非決定的実行パスの処理のうち、上記「ＡＬＬＯＣ」、「ＵＳＥ」、「ＦＲＥＥ」のいずれかに合致する処理のみを抽出したラベルパスを生成する。たとえば、上の例で、「２」が「ＡＬＬＯＣ」に合致し、「７」と「１０」が「ＵＳＥ」に合致し、「８」が「ＦＲＥＥ」に合致したとする。この場合、生成部２２は、上の非決定的実行パスから以下のようなラベルパスを生成する。
（１）Ａ
（２）Ａ
（３）Ａ−Ｕ−Ｆ
（４）Ａ−Ｕ
【００３７】
生成部２２はさらに、ラベルパスのうち、リソース捕捉関数とリソース解放関数のペアの判定に影響しないパタンを捨象して、縮約実行パスを生成する。縮約実行パスの生成手法については、後で詳述する。さらに、生成部２２は、生成した縮約実行パスに同じパスが複数含まれている場合、重複がなくなるよう調整する。
【００３８】
生成部２２は、ループ内を複数回実行する場合についても同様の処理を繰り返し、ループ内をｎ回実行した場合に生成される縮約実行パスと、ループ内をｎ＋１回実行した場合に生成される縮約実行パスとが同一となった時点で実行パス生成処理を終了する。
【００３９】
生成部２２による非決定実行パス、ラベルパスおよび縮約実行パスの生成処理（実行パス生成処理）についてはさらに詳しく後述する。なお、本明細書で「実行パス」とは、ソースコードが含む各処理について可能性がある実行順序を示す情報である。また、「実行パス」は、「非決定的実行パス」、「ラベルパス」、「縮約実行パス」を含む概念であるとする。「非決定的実行パス」は、各処理について可能性がある実行順序を全ての処理について表示し、実際のソースコードの実行時には非決定的実行パスのうち１のパスが実行される。「ラベルパス」は、「非決定的実行パス」に含まれる各処理のうち、「Ａ」「Ｕ」「Ｆ」に対応づけられる処理のみを表示する。同じ非決定的実行パスに基づいてラベルパスを生成する場合でも、「Ａ」「Ｕ」「Ｆ」に対応づけられる関数ペアによって異なるラベルパスが生成される。「縮約実行パス」は、「ラベルパス」のうち、リソース捕捉関数とリソース解放関数の判定上、捨象可能な「Ａ」「Ｕ」「Ｆ」の並び部分を削除したものである。
【００４０】
抽出部２３は、生成部２２が生成した関数ペア（ｆ，ｇ）および変数ｒについての実行パスが、関数ペア（ｆ，ｇ）および変数ｒについてパタン「Ａ−Ｕ−Ｆ」を含むか否かを判定する。抽出部２３はまた、同じ関数ペア（ｆ，ｇ）と他の変数ｒ１についての実行パスが、関数ペア（ｆ，ｇ）および変数ｒ１についてパタン「Ａ−Ｕ−Ｆ」を含むか否かを判定する。抽出部２３は、呼び出された関数ｆの戻り値が格納されている変数が複数ある場合は、全ての変数に対応する実行パスについて同様の判定を行う。そして、抽出部２３は、関数ｆの戻り値を格納する全ての変数について「Ａ−Ｕ−Ｆ」を含む実行パスが一以上あれば、関数ペア（ｆ，ｇ）をリソース捕捉関数とリソース解放関数のペアとして抽出する。抽出部２３による抽出処理についても後でさらに詳述する。
【００４１】
記憶部３０は、プログラム解析装置１における各部の処理に使用する情報や、各部の処理によって生成される情報を記憶する。記憶部３０はたとえば、ハードディスク、光ディスク等の記憶装置でもよい。また、記憶部３０は、ＲＡＭ（Random  Access  Memory）やフラッシュメモリ等の半導体メモリであってもよい。
【００４２】
記憶部３０は、ソースコード記憶部３１と、サブルーチン展開コード記憶部３２と、関数記憶部３３と、実行パス記憶部３４と、関数ペア集合記憶部３５と、を備える。
【００４３】
ソースコード記憶部３１は、入力部１０が入力を受付けたソースコードを記憶する。サブルーチン展開コード記憶部３２は、解析部２１がソースコードから作成したサブルーチン展開コードを記憶する。関数記憶部３３は、解析部２１がサブルーチン展開コードから抽出した全関数集合Ｆおよび全関数ペア集合Ｆ×Ｆを記憶する。実行パス記憶部３４は、生成部２２が生成した実行パスを記憶する。関数ペア集合記憶部３５は、抽出部２３による処理の結果得られる関数ペア集合すなわちリソース捕捉関数とリソース解放関数のペアと判定された関数ペアを記憶する。
【００４４】
なお、記憶部３０の各部に記憶されるソースコード、サブルーチン展開コード、関数、実行パス、関数ペア集合の詳細については後述する。ただし、記憶部３０の各部に記憶されるソースコードおよびサブルーチン展開コードは、特願２０１５−１５６９４５号に記載のソースコードおよびサブルーチン展開コードと同様である。また、記憶部３０は、特願２０１５−１５６９４５号に記載の制御フローグラフや解析結果も記憶するように構成してもよい。
【００４５】
出力部４０は、プログラム解析装置１による処理の結果、取得される情報を出力する。出力部４０はたとえば、抽出部２３が抽出する関数ペアを、視認可能な形式で出力する。出力部４０は、モニタ等の表示部またはプリンタ等と接続され表示部またはプリンタ等に情報を出力するように構成してもよく、出力部４０が表示部またはプリンタ等を備えるように構成してもよい。
【００４６】
［プログラム解析処理の流れの一例］
次に、本実施の形態におけるプログラム解析装置１の動作について説明する。
【００４７】
図４は、本実施の形態におけるプログラム解析処理の流れの一例を示すフローチャートである。
【００４８】
入力部１０は、解析対象のソースコードの入力を受け付ける（ステップＳ１）。
【００４９】
解析部２１は、ソースコードを解析する（ソースコード解析処理、ステップＳ２）。ソースコードの解析処理については後述する。
【００５０】
生成部２２は、ソースコードの解析結果を基に、実行パスを生成する（実行パス生成処理、ステップＳ３）。実行パス生成処理の詳細については後述する。
【００５１】
そして、抽出部２３は、生成部２２による処理結果に基づき、リソース捕捉関数とリソース解放関数の出現パタンに合致する関数ペアを抽出する（関数ペア抽出処理、ステップＳ４）。関数ペア抽出処理の詳細については後述する。
【００５２】
出力部４０は、抽出部２３が抽出した結果（関数ペア）を出力する（ステップＳ５）。
【００５３】
これでプログラム解析装置１によるプログラム解析処理が終了する。
【００５４】
［ソースコード解析処理の流れの一例］
次に、ソースコード解析処理（図４のステップＳ２に対応）について説明する。なお、以下に説明する本実施の形態におけるソースコード解析処理は、特願２０１５−１５６９４５号に記載の解析処理と同様である。ただし、本実施の形態では、解析部２１は関数一覧（全関数集合Ｆと同様）に代えて、全関数集合Ｆおよび全関数ペア集合Ｆ×Ｆを作成する点が異なる。
【００５５】
図５は、ソースコード解析処理の流れの一例を示すフローチャートである。図６は、プログラム解析装置１の解析対象であるソースコードの一例を示す図である。以下では、図６に示すソースコードを入力した具体例とともにソースコードの解析処理を説明する。
【００５６】
解析部２１は、入力部１０が入力したソースコードからサブルーチン展開コードを作成する（ステップＳ２１）。作成されたサブルーチン展開コードは、サブルーチン展開コード記憶部３２に記憶される。図７に、図６のソースコードから作成したサブルーチン展開コードの例を示す。図７の例では、解析部２１は、ｍａｉｎ関数から呼び出されているｆｉｎｉｓｈ関数とａｂｏｒｔ＿ｐｒｏｇｒａｍ関数のソースコードを呼び出した箇所の下に展開して追記している。解析部２１は、さらにｆｉｎｉｓｈ関数から呼び出されているａｂｏｒｔ＿ｐｒｏｇｒａｍ関数も展開して追記している。具体的には、符号１０１Ａ，１０１Ｂで示す箇所にａｂｏｒｔ＿ｐｒｏｇｒａｍ関数を展開し、符号１０２で示す箇所にｆｉｎｉｓｈ関数を展開した。符号１０１Ｂで示す箇所に展開したａｂｏｒｔ＿ｐｒｏｇｒａｍ関数はｆｉｎｉｓｈ関数から呼び出されたものである。
【００５７】
サブルーチン展開コードでは、関数を展開した箇所の行番号として、呼出し元の行番号に元々のソースコードの行番号を付与した行番号（以下、「コールスタック付き行番号」と称する。）を付与する。例えば、符号１０１Ａで示した箇所のａｂｏｒｔ＿ｐｒｏｇｒａｍ関数は、ｍａｉｎ関数の９行目で呼び出されており、ａｂｏｒｔ＿ｐｒｏｇｒａｍ関数は、図６のソースコードの２５−２７行目に記述されているので、９行目に展開したａｂｏｒｔ＿ｐｒｏｇｒａｍ関数の各行に行番号９−２５，９−２６，９−２７を付与する。別の例では、符号１０２で示した箇所のｆｉｎｉｓｈ関数はｍａｉｎ関数の１３行目で呼び出されており、符号１０１Ｂで示した箇所のａｂｏｒｔ＿ｐｒｏｇｒａｍ関数はｆｉｎｉｓｈ関数の２４行目で呼び出されているので、符号１０１Ｂで示した箇所のａｂｏｒｔ＿ｐｒｏｇｒａｍ関数の各行に行番号１３−２４−２５，１３−２４−２６，１３−２４−２７を付与する。なお、サブルーチン（関数）の定義が得られない場合は定義コードは書き足さない。
【００５８】
続いて、解析部２１は、サブルーチン展開コードから関数を抽出して全関数集合Ｆを作成する（ステップＳ２２）。作成した全関数集合Ｆは、関数記憶部３３に記憶される。図８の（Ａ）に、図７のサブルーチン展開コードから抽出した全関数集合Ｆを示す。解析部２１は、抽出した関数に関数ＩＤ（Identifier）を付与する。図８は、図７のサブルーチン展開コードから抽出した関数の、全関数集合と全関数ペア集合とを示す図である。図８の（Ａ）の例に示すように、関数記憶部３３は、関数ＩＤに対応付けて各関数名を記憶する。
【００５９】
解析部２１はまた、作成した全関数集合Ｆに基づき、全関数ペア集合Ｆ×Ｆを作成する。図８の（Ｂ）に、全関数集合Ｆから作成された全関数ペア集合Ｆ×Ｆの例を示す。図８の（Ｂ）に示すように、関数記憶部３３は、各関数ペアに対して付与したペアＩＤに対応付けて、当該関数ペアに含まれる関数の関数ＩＤを記憶する。
【００６０】
［実行パス生成処理の一例］
次に、生成部２２による実行パス生成処理（図４のステップＳ３に対応）について説明する。
【００６１】
ソースコード中にループが含まれている場合、可能性がある実行パスを作成していくと無限に実行パスが作成される、という問題がある。この問題について、図９を参照して説明する。図９は、ソースコードに含まれる分岐やループの構造を簡略化して示す図である。
【００６２】
［非決定的実行パスの生成］
図９に示すような分岐とループ構造を含むソースコードから非決定的実行パスを作成する場合を考える。図９の例を、ループ内を１回実行すると仮定して展開すると、以下の非決定的実行パスが得られる。
（１）１−２−３−４−１１
（２）１−２−５−６−１１
（３）１−２−７−８−１１
（４）１−２−９−１０−１１
【００６３】
さらにループ内を２回実行すると仮定して展開すると、たとえば以下の非決定的実行パスが得られる。
（５）１−２−３−４−２−３−４−１１
（６）１−２−３−４−２−５−６−１１
（７）１−２−３−４−２−７−８−１１
（８）１−２−３−４−２−９−１０−１１
ループ内を２回実行する場合、上の（５）〜（８）に加え、分岐内の処理順序によってさらに１２通りの非決定的実行パスが得られる。
【００６４】
さらにループ内の実行回数を３回、４回と増やしていくと、ループ内の実行回数を無限に増加させることができるため、非決定的実行パスが無限に増加する。
【００６５】
［ラベルパスの生成］
しかし、本実施の形態に係るプログラム解析装置１では、リソース捕捉関数とリソース解放関数のペアの抽出を目的とするため、ペア抽出に関連しない情報の生成は省略することができる。たとえば、分岐とループ構造を含むソースコードから非決定的実行パスを作成した結果、図１０に示す非決定的実行パスが得られたとする。図１０は、実行パス生成処理を説明するための、非決定的実行パスのセットの一例を示す図である。
【００６６】
そして、プログラム解析装置１が、図１０の非決定的実行パスのセットに基づいて、関数ｆと関数ｇが、リソース捕捉関数とリソース解放関数のペアであるか否かを判定すると仮定する。この場合、プログラム解析装置１は、非決定的実行パスが、関数ｆ、変数ｒ、関数ｇを次の順序で含むか否かを判定する。
（１）ｒ＝ｆ（）
（２）ｓｏｍｅ＿ｆｕｎｃ（ｒ）
（３）ｇ（ｒ）
とすると、非決定的実行パスに基づきリソース捕捉関数とリソース解放関数のペアを抽出するためには、非決定的実行パスに含まれる上記（１）、（２）、（３）の情報があればよい。
【００６７】
たとえば、図１０の例では、上記（１）を「Ａ」、（２）を「Ｕ」、（３）を「Ｆ」で表示する。１番目の非決定的実行パスは、「Ａ」のみを含む。２番目の非決定的実行パスは、「Ａ」「Ｆ」「Ｆ」を含む。このように、各非決定的実行パスから「Ａ」「Ｕ」「Ｆ」の情報のみを抽出すると、図１１に示すラベルパスを得ることができる。図１１は、実行パス生成処理を説明するための、ラベルパスのセットの一例を示す図である。図１０の一番目の非決定的実行パスは、「Ａ」、「Ｕ」、「Ｆ」のうち、「Ａ」しか含まないため、ラベルパスは「Ａ」となる。また、図１０の２番目の非決定的実行パスは「Ａ，Ｆ，Ｆ」、３番目の非決定的実行パスは「Ａ，Ｆ，Ｆ」、４番目の非決定的実行パスは、「Ａ，Ｕ，Ｆ」、５番目の非決定的実行パスは「Ａ，Ｆ，Ｆ，Ｆ」とあらわすことができる。リソース捕捉関数とリソース解放関数のペアの抽出に関係する情報のみを抽出することで、図１１に示すように非決定的実行パスを短縮することができる。このように、リソース捕捉関数とリソース解放関数のペアであるか否かの判定対象となる関数（ｆ，ｇ）と関数ｆ（）の戻り値が代入される変数ｒを特定し、上記（１）〜（３）に該当する処理のみを非決定的実行パスから抽出して作成した実行パスを、ラベルパスと呼ぶ。
【００６８】
［縮約実行パスの生成］
しかし、ラベルパスを生成しただけでは、非決定的実行パスを短縮することはできるが、判定対象の実行パスが無限に増加するという問題は解消されない。そこで、生成部２２は、次に、ラベルパスを所定の条件に基づき縮約すなわち短くする。本実施の形態では、以下の３つを縮約のための所定の条件、縮約ルールとする。
（１）「Ｆ」が３回以上出現する場合、２回目の「Ｆ」の出現より後のラベルパスは削除する。
（２）「Ａ」の後に「Ｕ」が２回以上出現する場合、２回目以降の「Ｕ」は削除する。
（３）「Ｆ」の後に「Ｕ」が２回以上出現する場合、２回目以降の「Ｕ」は削除する。
【００６９】
まず、上記縮約ルール（１）について説明する。「Ｆ」はリソース解放関数に対応する。リソース解放は、リソースが捕捉され使用された後に１回実行すればよく、同じリソースを捕捉されていないのに何度も解放する必要はない。したがって、「Ａ」が１回出現した後に「Ｆ」が何度も出現する場合、「Ｆ」はリソース捕捉関数ではない、と推定される。プログラム解析装置１は、実行パスが「Ａ，Ｕ，Ｆ」のパタンに合致するか否かを判定する。たとえば、プログラム解析装置１は、「Ａ，Ｕ，Ｆ，Ｆ」も「Ａ，Ｕ，Ｆ，Ｆ，Ｆ」も、「Ａ，Ｕ，Ｆ」に合致しないと判定する。したがって、プログラム解析装置１が判定対象とする情報としては、実行パス「Ａ，Ｕ，Ｆ，Ｆ，Ｆ」は「Ａ，Ｕ，Ｆ，Ｆ」に包含することができる。したがって、プログラム解析装置１は、ラベルパス「Ａ，Ｕ，Ｆ，Ｆ，Ｆ」を縮約実行パス「Ａ，Ｕ，Ｆ，Ｆ」に縮約する。このように、プログラム解析装置１は、ラベルパス中、１つの「Ａ」の後、「Ｆ」が３回以上出現した場合、２回目の「Ｆ」より後のラベルパス（この場合は３回目の「Ｆ」）を削除する。
【００７０】
次に、縮約ルール（２）について説明する。「Ａ」がリソース捕捉関数であるとすると、捕捉したリソースは「Ａ」の後解放されるまで何度でも使用することができる。したがって、「Ａ」の後の「Ｕ」の出現回数にはプログラム解析装置１による判定上意味はなく、少なくとも１度「Ｕ」が出現すればよい。そこで、「Ａ」の後、２回以上「Ｕ」が出現した場合、２回目以降の「Ｕ」は削除する。たとえば、「Ａ，Ｕ，Ｕ」というラベルパスが作成された場合、プログラム解析装置１は、当該ラベルパスを縮約して「Ａ，Ｕ」という縮約実行ラベルを作成する。
【００７１】
次に、縮約ルール（３）について説明する。「Ｆ」がリソース解放関数であるとすると、Ｆによってリソースが解放された後、当該リソースを捕捉することなく使用する、という処理はありえない。したがって、「Ｆ」の後に「Ｕ」が出現することはない。仮に「Ｕ」が出現した場合、その回数に関わらず、「Ｆ」は「Ａ」と対をなすリソース解放関数ではない、と推定することができる。したがって、ラベルパス中「Ｆ」の後に「Ｕ」が２回以上出現した場合、２回目以降の「Ｕ」は削除する。たとえば、ラベルパス「Ａ，Ｕ，Ｆ，Ｕ，Ｕ」が生成された場合、プログラム解析装置１は、「Ｆ」の後の２つの「Ｕ」の一つを削除して、縮約実行パス「Ａ，Ｕ，Ｆ，Ｕ」とする。
【００７２】
［重複する縮約実行パスの削除］
以上のように、実施の形態に係るプログラム解析装置１は、非決定的実行パスからラベルパス、ラベルパスから縮約実行パスを生成する。この処理により、非決定的実行パスの冗長な部分が削除されるため、異なる非決定的実行パスから同じ縮約実行パスが生成される場合が考えられる。そこで、同じ関数（ｆ，ｇ）、変数ｒについて作成された縮約実行パス中に重複がある場合は重複する縮約実行パスを削除する。
【００７３】
［ループの回数の制限］
次に、ループの無限展開を防止するための処理について説明する。上記のように非決定的実行パスを、リソース捕捉関数およびリソース解放関数の抽出に必要な情報に還元し、縮約した場合、所定回数ループを繰り返した後は同じ縮約実行パスしか得られなくなる。たとえば、「Ａ，Ｕ」という縮約パスのうち、ループ部分が「Ｕ」であるとすると、何度ループを繰り返しても上記縮約ルール（２）により、２回目以降の「Ｕ」が削除されるため、「Ａ，Ｕ」にしかならない。そこで、本実施の形態に係るプログラム解析装置１では、ｎ回ループを繰り返して生成された縮約実行パスから重複を除去した縮約実行パスの組み合わせと、ｎ−１回ループを繰り返して生成された縮約実行パスから重複を除去した縮約実行パスの組み合わせと、が同じになった時点で、ループの繰り返しすなわち実行パス生成処理を終了する。
【００７４】
［生成部２２による実行パス生成処理の流れの一例］
次に、図１２乃至図１７を参照し、実行パス生成処理についてさらに具体的に説明する。図１２乃至図１７は各々、実行パス生成処理においてループを１回乃至６回実行して縮約実行パスを生成する場合について説明するための図である。
【００７５】
［ループ１回実行時］
まず、プログラム制御装置１は、図１２の（Ａ）に示すループ構造を有するソースコードについて非決定的実行パスを生成する。処理対象とする関数ペアは（ｆ，ｇ）、リソース格納変数はｒである。図１２の（Ａ）において、処理「１」は関数ｆ（）を呼び出して変数に格納する処理（「Ａ」）であり、処理「３」は捕捉したリソースｒを使用する処理（「Ｕ」）であり、処理「５」は捕捉したリソースｒを引数とする関数ｇ（）（「Ｆ」）である。処理「１」「３」「５」以外に、「Ａ」「Ｕ」「Ｆ」に該当する処理はないとする。
【００７６】
まず、生成部２２は、ループを１回実行した場合の非決定的実行パスを生成する（図１２の（Ｂ））。
（１）１−２−３−４−７
（２）１−２−５−６−７
【００７７】
そして、生成部２２は、上記非決定的実行パスをラベルパスに変換する。すなわち、生成部２２は、「１」、「３」、「５」をそれぞれ、「Ａ」、「Ｕ」、「Ｆ」に置換し、他の処理を削除して以下のラベルパスを生成する（図１２の（Ｃ））。
（１）ＡＵ
（２）ＡＦ
【００７８】
上記ラベルパスのうち、縮約ルール（１）〜（３）に合致するものはないため、縮約実行パスは、ラベルパスと同じとなる（図１２の（Ｄ））。
【００７９】
さらに、重複する縮約実行パスはないため、削除される縮約実行パスはない（図１２の（Ｅ））。
【００８０】
［ループ２回実行時］
次に、生成部２２は、ループを２回実行する。この場合、非決定的実行パスは以下のようになる。
（１）１−２−３−４−２−３−４−７
（２）１−２−３−４−２−５−６−７
（３）１−２−５−６−２−３−４−７
（４）１−２−５−６−２−５−６−７
【００８１】
実際の生成部２２の処理では、ループ１回目の縮約実行パスが既に生成されているため、ループ２回目のラベルをループ１回目の縮約実行パスに追加してループ２回目のラベルパスを生成すればよい。ループ２回目のラベルパスは以下のようになる（図１３の（Ａ））。
（１）ＡＵＵ
（２）ＡＵＦ
（３）ＡＦＵ
（４）ＡＦＦ
【００８２】
生成されたラベルパスのうち、（１）は縮約ルール（２）に合致するため、「ＡＵ」に縮約される（図１３の（Ｂ））。（１）以外には縮約ルールに合致するラベルパスはない。また、重複もないため、ループ２回の実行により生成される縮約実行パスは、以下のようになる（図１３の（Ｃ））。
（１）ＡＵ
（２）ＡＵＦ
（３）ＡＦＵ
（４）ＡＦＦ
【００８３】
ループ１回実行時の縮約実行パスと、ループ２回実行時の縮約実行パスとは相違する。このため、ループの繰り返しは終了せず、生成部２２はループ３回実行時の実行パス生成処理に移る。
【００８４】
［ループ３回実行時］
次に、生成部２２は、ループを３回実行した場合のラベルパスを生成する（図１４の（Ａ））。
（１）ＡＵＵ
（２）ＡＵＦ
（３）ＡＵＦＵ
（４）ＡＵＦＦ
（５）ＡＦＵＵ
（６）ＡＦＵＦ
（７）ＡＦＦＵ
（８）ＡＦＦＦ
【００８５】
上記ラベルパスのうち、「ＡＵＵ」は縮約ルール（２）に合致するため、生成部２２は、「ＡＵＵ」を「ＡＵ」に縮約する。また、「ＡＦＵＵ」は縮約ルール（３）に合致するため、生成部２２は、「ＡＦＵＵ」を「ＡＦＵ」に縮約する。また、「ＡＦＦＦ」は縮約ルール（１）に合致するため、生成部２２は、「ＡＦＦＦ」を「ＡＦＦ」に縮約する。この結果、縮約実行パスは以下のようになる（図１４の（Ｂ））。以下ラベルパスを縮約した後の縮約実行パスを矢印右側に示す。
（１）ＡＵＵ→ＡＵ
（２）ＡＵＦ
（３）ＡＵＦＵ
（４）ＡＵＦＦ
（５）ＡＦＵＵ→ＡＦＵ
（６）ＡＦＵＦ
（７）ＡＦＦＵ
（８）ＡＦＦＦ→ＡＦＦ
【００８６】
上記（１）〜（８）の縮約実行パスには重複はない（図１４の（Ｃ））。また、ループ２回実行時の縮約実行パスとループ３回実行時の縮約実行パスとは同じではないため、プログラム解析装置１は、ループ４回実行時の実行パス生成処理に進む。
【００８７】
［ループ４回実行時］
次に、生成部２２は、ループを４回実行した場合のラベルパスを生成する（図１５の（Ａ））。
（１）ＡＵＵ      （２）ＡＵＦ
（３）ＡＵＦＵ    （４）ＡＵＦＦ
（５）ＡＵＦＵＵ  （６）ＡＵＦＵＦ
（７）ＡＵＦＦＵ  （８）ＡＵＦＦＦ
（９）ＡＦＵＵ    （１０）ＡＦＵＦ
（１１）ＡＦＵＦＵ  （１２）ＡＦＵＦＦ
（１３）ＡＦＦＵＵ  （１４）ＡＦＦＵＦ
（１５）ＡＦＦＵ  （１６）ＡＦＦＦ
【００８８】
このうち、「ＡＵＦＦＦ」、「ＡＦＵＦＦ」、「ＡＦＦＵＦ」、「ＡＦＦＦ」は、「Ｆ」が３回出現し、縮約ルール（１）に合致する。また、「ＡＵＵ」は縮約ルール（２）に合致する。また、「ＡＵＦＵＵ」、「ＡＦＵＵ」、「ＡＦＦＵＵ」は縮約ルール（３）に合致する。このためループ４回実行時の縮約実行パスは以下のようになる（図１５の（Ｂ））。
（１）ＡＵＵ→ＡＵ            （２）ＡＵＦ
（３）ＡＵＦＵ                （４）ＡＵＦＦ
（５）ＡＵＦＵＵ→ＡＵＦＵ    （６）ＡＵＦＵＦ
（７）ＡＵＦＦＵ              （８）ＡＵＦＦＦ→ＡＵＦＦ
（９）ＡＦＵＵ→ＡＦＵ        （１０）ＡＦＵＦ
（１１）ＡＦＵＦＵ            （１２）ＡＦＵＦＦ→ＡＦＵＦ
（１３）ＡＦＦＵＵ→ＡＦＦＵ  （１４）ＡＦＦＵＦ→ＡＦＦ
（１５）ＡＦＦＵ              （１６）ＡＦＦＦ→ＡＦＦ
【００８９】
上記縮約実行パス中、（３）と（５）、（４）と（８）、（１０）と（１２）、（１３）と（１５）、（１４）と（１６）、がそれぞれ重複する。そこで、生成部２２は、重複がなくなるよう、（５）、（８）、（１２）、（１４）、（１５）の計５個を削除し、残りの１１個を縮約実行パスとして残す（図１５の（Ｃ））。結果として、図１５の（Ｄ）の縮約実行パスのセットが得られる。
【００９０】
ループ３回実行時の縮約実行パスとループ４回実行時の縮約実行パスとは同じではないため、プログラム解析装置１は、ループ５回実行時の実行パス生成処理に進む。
【００９１】
［ループ５回実行時］
次に、生成部２２は、ループを５回実行した場合のラベルパスを生成する（図１６の（Ａ））。
（１）ＡＵＵ      （２）ＡＵＦ
（３）ＡＵＦＵ    （４）ＡＵＦＦ
（５）ＡＵＦＵＵ  （６）ＡＵＦＵＦ
（７）ＡＵＦＦＵ  （８）ＡＵＦＦＦ
（９）ＡＵＦＵＦＵ（１０）ＡＵＦＵＦＦ
（１１）ＡＵＦＦＵＵ（１２）ＡＵＦＦＵＦ
（１３）ＡＦＵＵ    （１４）ＡＦＵＦ
（１５）ＡＦＵＦＵ  （１６）ＡＦＵＦＦ
（１７）ＡＦＵＦＵＵ（１８）ＡＦＵＦＵＦ
（１９）ＡＦＦＵＵ（２０）ＡＦＦＵＦ
（２１）ＡＦＦＵ  （２２）ＡＦＦＦ
【００９２】
このうち、（８）ＡＵＦＦＦ、（１０）ＡＵＦＵＦＦ、（１２）ＡＵＦＦＵＦ、（１６）ＡＦＵＦＦ、（１８）ＡＦＵＦＵＦ、（２０）ＡＦＦＵＦ、（２２）ＡＦＦＦは、縮約ルール（１）に合致する。また、（１）ＡＵＵは縮約ルール（２）に合致する。また、（５）ＡＵＦＵＵ、（１１）ＡＵＦＦＵＵ、（１３）ＡＦＵＵ、（１７）ＡＦＵＦＵＵ、（１９）ＡＦＦＵＵは縮約ルール（３）に合致する。そこで、生成部２２は、縮約ルールに合致するラベルパスをそれぞれ縮約し、以下の縮約実行パスを生成する（図１６の（Ｂ））。
（１）ＡＵＵ→ＡＵ              （２）ＡＵＦ
（３）ＡＵＦＵ                  （４）ＡＵＦＦ
（５）ＡＵＦＵＵ→ＡＵＦＵ      （６）ＡＵＦＵＦ
（７）ＡＵＦＦＵ                （８）ＡＵＦＦＦ→ＡＵＦＦ
（９）ＡＵＦＵＦＵ              （１０）ＡＵＦＵＦＦ→ＡＵＦＵＦ
（１１）ＡＵＦＦＵＵ→ＡＵＦＦＵ  （１２）ＡＵＦＦＵＦ→ＡＵＦＦ
（１３）ＡＦＵＵ→ＡＦＵ          （１４）ＡＦＵＦ
（１５）ＡＦＵＦＵ                （１６）ＡＦＵＦＦ→ＡＦＵＦ
（１７）ＡＦＵＦＵＵ→ＡＦＵＦＵ  （１８）ＡＦＵＦＵＦ→ＡＦＵＦ
（１９）ＡＦＦＵＵ→ＡＦＦＵ    （２０）ＡＦＦＵＦ→ＡＦＦ
（２１）ＡＦＦＵ                （２２）ＡＦＦＦ→ＡＦＦ
【００９３】
上記縮約実行パスのうち、（３）と（５）、（７）と（１１）、（６）と（１０）、（１９）と（２１）、（４）と（８）と（１２）、（１５）と（１７）、（１４）と（１６）と（１８）、（２０）と（２２）、は、それぞれ重複する。そこで、生成部２２は、（３）、（８）、（１０）、（１１）、（１２）、（１６）、（１７）、（１８）、（２０）、（２１）の計１０個を削除する。この結果、ループ５回実行時の縮約実行パスは以下の１２個となる（図１６の（Ｃ））。
（１）ＡＵ
（２）ＡＵＦ
（４）ＡＵＦＦ
（５）ＡＵＦＵ
（６）ＡＵＦＵＦ
（７）ＡＵＦＦＵ
（９）ＡＵＦＵＦＵ
（１３）ＡＦＵ
（１４）ＡＦＵＦ
（１５）ＡＦＵＦＵ
（１９）ＡＦＦＵ
（２２）ＡＦＦ
【００９４】
ループ４回実行時の縮約実行パスとループ５回実行時の縮約実行パス（図１６の（Ｄ））とは同じではないため、プログラム解析装置１は、ループ６回実行時の実行パス生成処理に進む。
【００９５】
［ループ６回実行時］
次に、生成部２２は、ループを６回実行した場合のラベルパスを生成する（図１７の（Ａ））。
（１）ＡＵＵ              （２）ＡＵＦ
（３）ＡＵＦＵＵ          （４）ＡＵＦＵＦ
（５）ＡＵＦＵＦＵＵ      （６）ＡＵＦＵＦＵＦ
（７）ＡＦＵＵ            （８）ＡＦＵＦ
（９）ＡＵＦＵ            （１０）ＡＵＦＦ
（１１）ＡＵＦＦＵ        （１２）ＡＵＦＦＦ
（１３）ＡＵＦＵＦＵ      （１４）ＡＵＦＵＦＦ
（１５）ＡＵＦＦＵＵ      （１６）ＡＵＦＦＵＦ
（１７）ＡＦＵＦＵ        （１８）ＡＦＵＦＦ
（１９）ＡＦＵＦＵＵ      （２０）ＡＦＵＦＵＦ
（２１）ＡＦＦＵＵ        （２２）ＡＦＦＵＦ
（２３）ＡＦＦＵ          （２４）ＡＦＦＦ
【００９６】
上記ラベルパスのうち、（６）ＡＵＦＵＦＵＦ、（１２）ＡＵＦＦＦ、（１４）ＡＵＦＵＦＦ、（１６）ＡＵＦＦＵＦ、（１８）ＡＦＵＦＦ、（２０）ＡＦＵＦＵＦ、（２２）ＡＦＦＵＦ、（２４）ＡＦＦＦは、縮約ルール（１）に合致する。また、（１）ＡＵＵは縮約ルール（２）に合致する。また、（３）ＡＵＦＵＵ、（５）ＡＵＦＵＦＵＵ、（７）ＡＦＵＵ、（１５）ＡＵＦＦＵＵ、（１９）ＡＦＵＦＵＵ、（２１）ＡＦＦＵＵは、縮約ルール（３）に合致する。そこで、生成部２２は、縮約ルールに合致するラベルパスをそれぞれ縮約し、以下の縮約実行パスを生成する（図１７の（Ｂ））。
（１）ＡＵＵ→ＡＵ                  （２）ＡＵＦ
（３）ＡＵＦＵＵ→ＡＵＦＵ          （４）ＡＵＦＵＦ
（５）ＡＵＦＵＦＵＵ→ＡＵＦＵＦＵ  （６）ＡＵＦＵＦＵＦ→ＡＵＦＵＦ
（７）ＡＦＵＵ→ＡＦＵ              （８）ＡＦＵＦ
（９）ＡＵＦＵ                      （１０）ＡＵＦＦ
（１１）ＡＵＦＦＵ                  （１２）ＡＵＦＦＦ→ＡＵＦＦ
（１３）ＡＵＦＵＦＵ                （１４）ＡＵＦＵＦＦ→ＡＵＦＵＦ
（１５）ＡＵＦＦＵＵ→ＡＵＦＦＵ    （１６）ＡＵＦＦＵＦ→ＡＵＦＦ
（１７）ＡＦＵＦＵ                  （１８）ＡＦＵＦＦ→ＡＦＵＦ
（１９）ＡＦＵＦＵＵ→ＡＦＵＦＵ    （２０）ＡＦＵＦＵＦ→ＡＦＵＦ
（２１）ＡＦＦＵＵ→ＡＦＦＵ        （２２）ＡＦＦＵＦ→ＡＦＦ
（２３）ＡＦＦＵ                    （２４）ＡＦＦＦ→ＡＦＦ
【００９７】
上記縮約実行パスのうち、（３）と（９）、（４）と（６）と（１４）、（５）と（１３）、（８）と（１８）と（２０）、（１０）と（１２）と（１６）、（１１）と（１５）、（１７）と（１９）、（２１）と（２３）、（２２）と（２４）、はそれぞれ同一である。そこで生成部２２は、（３）、（４）、（５）、（６）、（８）、（１０）、（１１）、（１６）、（１７）、（１８）、（２１）、（２２）の計１２個を削除する（図１７の（Ｃ））。この結果、ループ６回実行時の縮約実行パスは以下の１２個となる（図１７の（Ｄ））。
（１）ＡＵ
（２）ＡＵＦ
（７）ＡＦＵ
（９）ＡＵＦＵ
（１２）ＡＵＦＦ
（１３）ＡＵＦＵＦＵ
（１４）ＡＵＦＵＦ
（１５）ＡＵＦＦＵ
（１９）ＡＦＵＦＵ
（２０）ＡＦＵＦ
（２３）ＡＦＦＵ
（２４）ＡＦＦ
【００９８】
ループ５回実行時の縮約実行パスとループ６回実行時の縮約実行パスとは同じである。このため、生成部２２は、７回以上ループを繰り返すことなく、実行パス生成処理を終了する。
【００９９】
図１８は、図１２乃至図１７に示す実行パス生成処理において生成される縮約実行パスを説明するための図である。図１８中、縮約ルールに従い削除されるラベルには二重取消線を付し、重複により削除される縮約実行パスには網掛けを付している。
【０１００】
［実行パス生成処理の流れの一例］
図１９は、実施の形態に係る実行パス生成処理の流れの一例を示すフローチャートである。生成部２２は、まず、ｎ＝１の設定を受け付ける（ステップＳ１８０１）。ここで、ｎはループ内の実行回数を設定するための自然数である。次に、生成部２２は、ループ内をｎ回実行して得られる非決定的実行パスを作成する（ステップＳ１８０２）。そして、生成部２２は、関数記憶部３３に記憶される全関数ペア集合Ｆ×Ｆの中から一つの関数ペア（ｆ，ｇ）を選択する（ステップＳ１８０３）。生成部２２は、さらに、リソース捕捉変数であるｒを選択する（ステップＳ１８０３）。生成部２２は、選択した関数ペア（ｆ，ｇ）と変数ｒに基づき、非決定的実行パスの各処理要素のうち「Ａ」「Ｕ」「Ｆ」のラベルに該当する処理要素を抽出し、ラベルパスを生成する（ステップＳ１８０４）。さらに、生成部２２は、生成したラベルパスに対して縮約ルール（１）、（２）、（３）を適用し、縮約実行パスを生成する（ステップＳ１８０５）。そして、生成部２２は、生成した縮約実行パスに重複がないか判定し、重複がある場合は重複する縮約実行パスを削除する（ステップＳ１８０６）。そして、生成部２２は、ループをｎ回実行したときの縮約実行パスと、ループをｎ−１回実行したときの縮約実行パスとが一致するか否かを判定する（ステップＳ１８０７）。一致すると判定した場合（ステップＳ１８０７、Ｙｅｓ）、生成部２２は、実行パス生成処理を終了する。他方、一致しないと判定した場合（ステップＳ１８０７、Ｎｏ）、生成部２２は、ｎ＝ｎ＋１と設定し（Ｓ１８０８）、ループの実行回数を増やしてステップＳ１８０２からＳ１８０７を繰り返す。これにより関数ペア（ｆ，ｇ）および変数ｒについての実行パス生成処理が終了する。
【０１０１】
関数記憶部３３の全関数ペア集合Ｆ×Ｆに含まれるすべての関数ペアについて、実行パス生成処理が繰り返される。また、リソース格納変数ｒは一つに限られないため、複数のリソース格納変数ｒと、各関数ペアについて、実行パス生成処理が繰り返される。この結果、関数ペアと変数ｒとの組み合わせごとに異なる縮約実行パスセットが生成される。図２０は、実施の形態に係る実行パス生成処理により生成され、実行パス記憶部３４に記憶される情報の構成の一例を示す図である。
【０１０２】
図２０に示すように、実行パス記憶部３４は、「関数ペア」、「変数」、「縮約実行パス」、「フラグ」を記憶する。「関数ペア」は、縮約実行パスの生成に使用した関数ペア（ｆ，ｇ）を示す。また、「変数」は、縮約実行パスの生成に使用した変数ｒを示す。また、「縮約実行パス」は、実行パス生成処理の結果生成された縮約実行パスのセットを示す。「フラグ」は、後述する関数ペア抽出処理において、所定のパタン「Ａ−Ｕ−Ｆ」を含むと判定された縮約実行パスに付与される標識である。
【０１０３】
［関数ペア抽出処理の流れの一例］
次に、抽出部２３による関数ペア抽出処理について説明する。図２１は、実施の形態に係る関数ペア抽出処理の流れの一例を示すフローチャートである。抽出部２３は、生成部２２による縮約実行パスの生成が完了し、生成された縮約実行パスの情報が実行パス記憶部３４に記憶されると、関数ペア抽出処理を実行する。
【０１０４】
抽出部２３はまず、関数ペア（ｆ，ｇ）と変数ｒとを選択する（ステップＳ２００１）。そして、抽出部２３は、実行パス記憶部３４に記憶された縮約実行パスのうち、選択した関数ペア（ｆ，ｇ）および変数ｒに対応付けて記憶されている縮約実行パスの一つを選択する（ステップＳ２００２）。抽出部２３は、選択した縮約実行パスが、リソース捕捉関数とリソース解放関数の出現パタン、すなわち「ＡＵＦ」に合致するか否かを判定する（ステップＳ２００３）。このとき、抽出部２３は、「ＡＵＦ」のみを含むか否かを判定する。すなわち、抽出部２３は、「ＡＵＦＵ」や「ＡＵＦＵＦ」「ＡＵＦＦ」等、「ＡＵＦ」の出現パタンを含むが「ＡＵＦ」以外のパタンを含む縮約実行パスは、「ＡＵＦ」の出現パタンに合致しないと判定する。
【０１０５】
そして、抽出部２３は、「ＡＵＦ」の出現パタンに合致すると判定した場合（ステップＳ２００３、ＹＥＳ）、当該縮約実行パスに対応づけて実行パス記憶部３４にフラグを格納する（ステップＳ２００４）。そして、抽出部２３は、関数ペア（ｆ，ｇ）と変数ｒに対応づけて記憶されている他の未選択の縮退実行パスがあるか否かを判定する（ステップＳ２００５）。抽出部２３は、「ＡＵＦ」の出現パタンを含まないと判定した場合（ステップＳ２００３、ＮＯ）、そのままステップＳ２００５に進む。
【０１０６】
抽出部２３は、未選択の縮退実行パスがあると判定した場合（ステップＳ２００５、ＹＥＳ）、次の未選択の縮約実行パスを選択する（ステップＳ２００６）。そして、抽出部２３は、選択した縮約実行パスについて、ステップＳ２００３からＳ２００５の処理を繰り返す。他方、抽出部２３は、未選択の縮約実行パスはないと判定した場合（ステップＳ２００５、ＮＯ）、他に関数ペア（ｆ，ｇ）に対応づけて実行パス記憶部３４に記憶されているリソース格納変数ｒがあるか否かを判定する（ステップＳ２００７）。他のリソース格納変数ｒがあると判定した場合（ステップＳ２００７、ＹＥＳ）、抽出部２３は、他のリソース格納変数ｒの一つを選択する（ステップＳ２００８）。そして、抽出部２３は、ステップＳ２００２からＳ２００７の処理を繰り返す。他方、他のリソース格納変数ｒはないと判定した場合（ステップＳ２００７、ＮＯ）、抽出部２３は、関数ペア（ｆ，ｇ）と各リソース格納変数ｒに対応付けて実行パス記憶部３４に記憶される縮約実行パスのセット各々のうち、少なくとも一つの縮約実行パスにフラグが付与されているか否かを判定する（ステップＳ２００９）。そして、抽出部２３は、全てのセットに、フラグが付与された縮約実行パスが少なくとも一つ含まれると判定した場合（ステップＳ２００９、ＹＥＳ）、関数ペア（ｆ，ｇ）を、リソース捕捉関数とリソース解放関数の候補ペアとして抽出する（ステップＳ２０１０）。抽出した関数ペアは、関数ペア集合記憶部３５に記憶される。そして、抽出部２３は、関数記憶部３３に記憶される全関数ペア集合Ｆ×Ｆに未選択の次の関数ペアがあるか否かを判定する（ステップＳ２０１１）。そして、次の関数ペアがあると判定した場合（ステップＳ２０１１、ＹＥＳ）、抽出部２３は、次の関数ペアと変数とを選択して（ステップＳ２０１２）、ステップＳ２００２に戻る。他方、次の関数ペアがないと判定した場合（ステップＳ２０１１、ＮＯ）すなわち、全関数ペア集合Ｆ×Ｆに格納される全ての関数ペアについて関数ペア抽出処理を終了した場合、抽出部２３は、関数ペア抽出処理を終了する。他方、ステップＳ２００９において、いずれの縮約実行パスにもフラグが付与されていない縮約実行パスのセットがあると判定した場合（ステップＳ２００９、ＮＯ）、抽出部２３は、当該関数ペアは抽出せず、ステップＳ２０１１に進む。
【０１０７】
［実施の形態の効果］
上記のように、本実施の形態に係るプログラム解析装置においては、ソースコード中、第１の関数（関数ｆ）が呼び出された位置から処理が辿る可能性のある実行パスにループが含まれる場合に対処する。プログラム解析装置は、当該ループを１回からｎ回（ｎは２以上の自然数）まで繰り返して実行した場合のそれぞれについて、処理が辿る可能性のある実行パスを生成する。そして、プログラム解析装置は、生成した実行パスにおいて、第１の関数（関数ｆ）と、第１の関数の戻り値を格納する変数（ｒ）と、第１の関数とは異なり該第１の関数の戻り値を格納する変数を引数とする第２の関数（関数ｇ）と、の出現パタンが、リソース捕捉関数とリソース解放関数の出現パタンに合致する場合、第１の関数と第２の関数とをリソース捕捉関数とリソース解放関数のペアとして抽出する。このため、実施形態のプログラム解析装置は、ソースコード中にループが含まれる場合に、所定回数ループを繰り返して実行した場合を考慮して、リソース捕捉関数とリソース解放関数とのペアを抽出することができる。
【０１０８】
また、本実施の形態に係るプログラム解析装置は、第１の関数の戻り値を変数に格納する第１の処理と、当該変数を引数とし、第１および第２の関数と異なる第３の関数を呼び出す第２の処理と、変数を引数とする第２の関数を呼び出す第３の処理と、の出現順序のみを示す実行パスを生成する。このため、プログラム解析装置は、リソース捕捉関数とリソース解放関数とのペアであるか否かの判定に影響を与えない要素を捨象して処理を実行することができる。このため、実施形態のプログラム解析装置は、処理効率および処理速度を向上させることができる。
【０１０９】
また、本実施の形態に係るプログラム解析装置は、生成した実行パスに、第１および第２の関数がリソース捕捉関数とリソース解放関数であるとした場合に、リソース捕捉関数とリソース解放関数の出現パタンに合致しない箇所がある場合、合致しない箇所を一部を残して削除することにより、実行パスを短くする。このため、実施の形態に係るプログラム解析装置は、明らかにリソース捕捉関数とリソース解放関数の出現パタンに合致しないパタンを含む実行パスについて簡易に判定をすることができる。
【０１１０】
また、本実施の形態に係るプログラム解析装置は、生成した実行パスが、
（１）第３の処理を３以上含む場合、２回目の第３の処理の出現より後の処理を削除し、
（２）第１の処理の後、第２の処理を２以上含む場合、２回目以降の第２の処理を削除し、
（３）第３の処理の後、第２の処理を２以上含む場合、２回目以降の第２の処理を削除する、
ことにより、実行パスを短くする。このため、実施の形態に係るプログラム解析装置は、明らかにリソース捕捉関数とリソース解放関数の出現パタンに合致しないパタンを含む実行パスについて簡易に判定をすることができる。
【０１１１】
また、本実施の形態に係るプログラム解析装置は、ループをｎ回実行した場合に得られる実行パスと、ループを（ｎ−１）回実行した場合に得られる実行パスと、が等しくなった場合に、実行パスの生成を終了する。このため、実施の形態に係るプログラム解析装置は、ループ内を無限に繰り返すことなく、効率的にリソース捕捉関数とリソース解放関数のペアを抽出することができる。
【０１１２】
また、本実施の形態に係るプログラム解析装置は、ソースコード中に、第１の関数を呼び出して戻り値を変数に格納する位置が複数ある場合に、各位置から辿ることができる１以上の実行パスのうち、リソース捕捉関数とリソース解放関数の出現パタンに合致する実行パスが少なくとも一つ存在することを条件として、第１の関数と第２の関数とを抽出する。このため、プログラム解析装置は、同じ関数が異なる位置で呼び出されている場合に、いずれの位置でもリソース捕捉関数とリソース解放関数の出現パタンに合致することを確認した上で、当該関数を抽出することができる。このため、プログラム解析装置は、高い精度でリソース捕捉関数とリソース解放関数を抽出することができる。
【０１１３】
［プログラム］
また、上記実施形態において説明したプログラム解析装置１が実行する処理をコンピュータが実行可能な言語で記述したプログラムを作成することもできる。例えば、実施形態に係るプログラム解析装置１が実行する処理をコンピュータが実行可能な言語で記述したプログラム解析プログラムを作成することもできる。この場合、コンピュータがプログラム解析プログラムを実行することにより、上記実施形態と同様の効果を得ることができる。さらに、かかるプログラム解析プログラムをコンピュータ読み取り可能な記録媒体に記録して、この記録媒体に記録されたプログラム解析プログラムをコンピュータに読み込ませて実行することにより上記実施形態と同様の処理を実現してもよい。
【０１１４】
図２２は、プログラム解析プログラムを実行するコンピュータ１０００を示す図である。図２２に例示するように、コンピュータ１０００は、例えば、メモリ１０１０と、ＣＰＵ１０２０と、ハードディスクドライブインタフェース１０３０と、ディスクドライブインタフェース１０４０と、シリアルポートインタフェース１０５０と、ビデオアダプタ１０６０と、ネットワークインタフェース１０７０とを有し、これらの各部はバス１０８０によって接続される。
【０１１５】
メモリ１０１０は、図２２に例示するように、ＲＯＭ（Read  Only  Memory）１０１１及びＲＡＭ１０１２を含む。ＲＯＭ１０１１は、例えば、ＢＩＯＳ（Basic  Input  Output  System）等のブートプログラムを記憶する。ハードディスクドライブインタフェース１０３０は、図２２に例示するように、ハードディスクドライブ１０３１に接続される。ディスクドライブインタフェース１０４０は、図２２に例示するように、ディスクドライブ１０４１に接続される。例えば磁気ディスクや光ディスク等の着脱可能な記憶媒体が、ディスクドライブ１０４１に挿入される。シリアルポートインタフェース１０５０は、図２２に例示するように、例えばマウス１０５１、キーボード１０５２に接続される。ビデオアダプタ１０６０は、図２２に例示するように、例えばディスプレイ１０６１に接続される。
【０１１６】
ここで、図２２に例示するように、ハードディスクドライブ１０３１は、例えば、ＯＳ１０９１、アプリケーションプログラム１０９２、プログラムモジュール１０９３、プログラムデータ１０９４を記憶する。すなわち、上記のプログラム解析プログラムは、コンピュータ１０００によって実行される指令が記述されたプログラムモジュールとして、例えばハードディスクドライブ１０３１に記憶される。
【０１１７】
また、上記実施形態で説明した各種データは、プログラムデータとして、例えばメモリ１０１０やハードディスクドライブ１０３１に記憶される。そして、ＣＰＵ１０２０が、メモリ１０１０やハードディスクドライブ１０３１に記憶されたプログラムモジュール１０９３やプログラムデータ１０９４を必要に応じてＲＡＭ１０１２に読み出し、各種処理手順を実行する。
【０１１８】
なお、プログラム解析プログラムに係るプログラムモジュール１０９３やプログラムデータ１０９４は、ハードディスクドライブ１０３１に記憶される場合に限られず、例えば着脱可能な記憶媒体に記憶され、ディスクドライブ等を介してＣＰＵ１０２０によって読み出されてもよい。あるいは、プログラム解析プログラムに係るプログラムモジュール１０９３やプログラムデータ１０９４は、ネットワーク（ＬＡＮ（Local  Area  Network）、ＷＡＮ（Wide  Area  Network）等）を介して接続された他のコンピュータに記憶され、ネットワークインタフェース１０７０を介してＣＰＵ１０２０によって読み出されてもよい。
【０１１９】
なお、本実施形態において説明した各処理のうち、自動的におこなわれるものとして説明した処理の全部または一部を手動的に行うこともでき、あるいは、手動的におこなわれるものとして説明した処理の全部または一部を公知の方法で自動的におこなうこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
【０１２０】
上記の実施形態やその変形は、本願が開示する技術に含まれると同様に、特許請求の範囲に記載された発明とその均等の範囲に含まれるものである。
【符号の説明】
【０１２１】
１  プログラム解析装置
１０  入力部
２０  制御部
２１  解析部
２２  生成部
２３  抽出部
３０  記憶部
３１  ソースコード記憶部
３２  サブルーチン展開コード記憶部
３３  関数記憶部
３４  実行パス記憶部
３５  関数ペア集合記憶部
４０  出力部
【図１】
2018028879.tif 000003
【図２】
2018028879.tif 000004
【図３】
2018028879.tif 000005
【図４】
2018028879.tif 000006
【図５】
2018028879.tif 000007
【図６】
2018028879.tif 000008
【図７】
2018028879.tif 000009
【図８】
2018028879.tif 000010
【図９】
2018028879.tif 000011
【図１０】
2018028879.tif 000012
【図１１】
2018028879.tif 000013
【図１２】
2018028879.tif 000014
【図１３】
2018028879.tif 000015
【図１４】
2018028879.tif 000016
【図１５】
2018028879.tif 000017
【図１６】
2018028879.tif 000018
【図１７】
2018028879.tif 000019
【図１８】
2018028879.tif 000020
【図１９】
2018028879.tif 000021
【図２０】
2018028879.tif 000022
【図２１】
2018028879.tif 000023
【図２２】
2018028879.tif 000024
【図２３】
2018028879.tif 000025