(57)【要約】【課題】  実際に動作させた機能の他に、実装されているが動作させていない機能に対応するソースコード上での実装箇所の指定を可能にする。【解決手段】  本発明は、プログラムをシナリオにより実行した実行トレース情報を取得し、実行トレース記憶手段に格納し、実行トレース情報を用いて第１形式文脈を作成し、形式概念分析処理により概念束を生成し、概念束に含まれる各概念から、実行トレース情報を参照して、実行されなかったが呼び出し依存関係が存在し実行される可能性のあった到達可能モジュール群を特定し、到達可能モジュール群を形式文脈記憶手段に追加することにより第１形式文脈を含む第２形式文脈を作成し、第２形式文脈を用いて、再度、形式概念分析を実行させ、概念束を得る。【選択図】  図１
2015215834.tif 000002
【特許請求の範囲】
【請求項１】
プログラムを起動するシナリオを実行し、該プログラムを分析するプログラム分析装置であって、
前記プログラムを前記シナリオにより実行した実行トレース情報を取得し、実行トレース記憶手段に格納する実行トレース取得手段と、
前記シナリオをオブジェクトとし、前記プログラムの機能で実施されるモジュールを属性として、前記実行トレース情報を用いて第１形式文脈を作成し、形式文脈記憶手段に格納する第１形式文脈作成手段と、
前記形式文脈記憶手段の前記第１形式文脈を読み出して、形式概念分析処理により第１概念束を生成して第１概念束記憶手段に格納する形式概念分析手段と、
前記第１概念束記憶手段から前記第１概念束を読み出し、該第１概念束に含まれる各概念から、前記実行トレース記憶手段の前記実行トレース情報を参照して、実行されなかったが呼び出し依存関係が存在し実行される可能性のあった到達可能モジュール群を特定し、可到達モジュール記憶手段に格納する可到達モジュール抽出手段と、
前記可到達モジュール記憶手段の前記到達可能モジュール群を前記形式文脈記憶手段に追加することにより前記第１形式文脈を含む第２形式文脈を作成する第２形式文脈作成手段と、
前記形式文脈記憶手段に格納された前記第２形式文脈を用いて、再度、前記形式概念分析手段に形式概念分析を実行させ、得られた第２概念束を第２概念束記憶手段に格納する手段と、
を有することを特徴とするプログラム分析装置。
【請求項２】
前記可到達モジュール抽出手段は、
前記実行トレース記憶手段の前記実行トレース情報に基づいて、概念ci（i=1,k:但しkは希薄な概念束中の最下位の概念を除く全ての概念の数）に属するモジュール群mc_iを特定する手段と、
モジュールをノード、呼び出し依存関係をエッジとした有向グラフを格納した可到達行列記憶手段を参照して、前記モジュール群mc_iに含まれるモジュールが呼び出しの起点となっているような未実行依存関係を抽出する手段と、
前記未実行依存関係の呼び出し先のモジュール群を特定し、前記到達可能モジュール群を取得し、可到達モジュール記憶手段に格納する手段と、
を含む
請求項１記載のプログラム分析装置。
【請求項３】
前記可到達モジュール抽出手段は、
前記可到達モジュール記憶手段に、前記実行トレース情報の呼び出し元が格納されていない場合は、該可到達モジュール記憶手段に該実行トレース情報の呼び出し元に対応する値を代入し、
前記可到達モジュール記憶手段の前記実行トレース情報の呼び出し元に対応する行に、重複を避けて、前記可到達行列記憶手段の呼び出し先のモジュール名を代入する手段を含む請求項２記載のプログラム分析装置。
【請求項４】
プログラムを起動するシナリオを実行し、該プログラムを分析する装置におけるプログラム分析方法であって、
前記プログラムを前記シナリオにより実行した実行トレース情報を取得し、実行トレース記憶手段に格納する実行トレース取得ステップと、
前記シナリオをオブジェクトとし、前記プログラムの機能で実施されるモジュールを属性として、前記実行トレース情報を用いて第１形式文脈を作成し、形式文脈記憶手段に格納する第１形式文脈作成ステップと、
前記形式文脈記憶手段の前記第１形式文脈を読み出して、形式概念分析処理により第１概念束を生成して第１概念束記憶手段に格納する形式概念分析ステップと、
前記第１概念束記憶手段から前記第１概念束を読み出し、該第１概念束に含まれる各概念から、前記実行トレース記憶手段の前記実行トレース情報を参照して、実行されなかったが呼び出し依存関係が存在し実行される可能性のあった到達可能モジュール群を特定し、可到達モジュール記憶手段に格納する可到達モジュール抽出ステップと、
前記可到達モジュール記憶手段の前記到達可能モジュール群を前記形式文脈記憶手段に追加することにより前記第１形式文脈を含む第２形式文脈を作成する第２形式文脈作成ステップと、
前記形式文脈記憶手段に格納された前記第２形式文脈を用いて、再度、前記形式概念分析ステップを行い、得られた第２概念束を第２概念束記憶手段に格納するステップと、
を行うことを特徴とするプログラム分析方法。
【請求項５】
前記可到達モジュール抽出ステップにおいて、
前記実行トレース記憶手段の前記実行トレース情報に基づいて、概念ci（i=1,k:但しkは希薄な概念束中の最下位の概念を除く全ての概念の数）に属するモジュール群mc_iを特定し、
モジュールをノード、呼び出し依存関係をエッジとした有向グラフを格納した可到達行列記憶手段を参照して、前記モジュール群mc_iに含まれるモジュールが呼び出しの起点となっているような未実行依存関係を抽出し、
前記未実行依存関係の呼び出し先のモジュール群を特定し、前記到達可能モジュール群を取得し、可到達モジュール記憶手段に格納する
請求項４記載のプログラム分析方法。
【請求項６】
前記可到達モジュール抽出ステップにおいて、
前記可到達モジュール記憶手段に、前記実行トレース情報の呼び出し元が格納されていない場合は、該可到達モジュール記憶手段に該実行トレース情報の呼び出し元に対応する値を代入し、
前記可到達モジュール記憶手段の前記実行トレース情報の呼び出し元に対応する行に、重複を避けて、前記可到達行列記憶手段の呼び出し先のモジュール名を代入する
請求項５記載のプログラム分析方法。
【請求項７】
コンピュータを、
請求項１乃至３のいずれか１項に記載のプログラム分析装置の各手段として機能させるためのプログラム分析プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム分析装置及び方法及びプログラムに係り、情報システムの保守や機能拡充を行う際に、プログラムの対象となる機能の実装箇所を特定するための分析を行うプログラム分析装置及び方法及びプログラムに関する。
【背景技術】
【０００２】
従来、プログラムを分析して対象となる機能を特定する方法として、情報システムの典型的な利用方法を示すシナリオにより実行されるモジュールの情報を入力として、束論を用いて分析を行う形式概念分析手法（FCA: Formal Concept Analysis）を適用することにより、プログラムの機能の実装箇所を特定する方法がある（例えば、非特許文献１参照）。
【０００３】
ここで、「機能」とは、システム利用者が実施する操作を入力とし、プログラムにより記述された手順に従った処理が実行され、その処理の結果が出力されるものをいう。「ログイン機能」を例にとると、入力として、ユーザによりＩＤやパスワードが入力されると、処理として、ＩＤとパスワードの照合処理を行い、出力として、照合結果の出力及び次の画面への移動を行う。
【０００４】
また、「シナリオ」とは、ユーザが目的を果たすためにシステム上で実施する一連の操作、つまりプログラムへの入力の順序付きの集合をいう。シナリオは複数の機能を呼び出すことにより、ユーザの目的を満たすことが可能である。例えば、「商品購入シナリオ」が、商品を購入する目的である場合は、シナリオにはこれを達成するための一連の操作が含まれる。操作により起動される機能としては、ログイン機能、商品一覧表示機能、商品詳細表示機能、購入機能、ログアウト機能等がある。
【０００５】
「モジュール」とは、上記「機能」中で実施される一連の処理の際に必要となる手順やデータが記載された塊をいう。「モジュール」は「機能」により呼び出され、「機能」は「シナリオ」により起動されるため、「モジュール」は「シナリオ」により起動されることとなる。例えば、Java（登録商標）のクラス、メソッド等を指す。
【０００６】
また、形式概念分析手法を用いる方法として、識別された特徴の関連性に基づいてモジュールの呼び出しの静的及び動的な依存関係の違いを分析する方法がある（例えば、非特許文献２参照）。
【０００７】
また、モジュール（メソッド、関数）レベルのプログラム依存関係グラフを探索して、機能の実装箇所を捜索する方法がある（例えば、非特許文献３，４参照）。
【先行技術文献】
【非特許文献】
【０００８】
【非特許文献１】Thomas Eisenbarth, Rainer Koschke, Daniel Simon: Locating Features in Source Code. IEEE Trans. Software Eng. 29(3): 210-224 (2003)
【非特許文献２】Hiroshi Kazato, Shinpei Hayashi, Takashi Kobayashi, Tsuyoshi Oshima, Satoshi Okada, Shunsuke Miyata, Takashi Hoshino, Motoshi Saeki: Incremental Feature Location and Identification in Source Code. CSMR 2013: 371-374
【非特許文献３】Kunrong Chen, Vaclav Rajlich: Case Study of Feature Location Using Dependence Graph. IWPC 2000: 241-249
【非特許文献４】Neil Walkinshaw, Marc Roper, Murray Wood: Feature Location and Extraction using Landmarks and Barriers. ICSM 2007: 54-63
【発明の概要】
【発明が解決しようとする課題】
【０００９】
しかしながら、上記の非特許文献１の技術は、プログラムに含まれる機能の塊と、それを実装するモジュールを特定できるが、解析範囲はシナリオによって実行されたモジュールに限られ、システムの典型的な用法から外れる部分（未実行の部分）に関する解析はできない。また、非特許文献２の技術は、実際に動作させた機能の他に、実装されているが動作させていない機能に対応するソースコード上の実装箇所を人手でのソースコード探索無しには特定することができない。
【００１０】
非特許文献３及び４の技術は、グラフ上での探索の開始点を見つけることは容易ではなく、開始点の選択の仕方にもよるが、結果に不要なモジュールが含まれることが多い。
【００１１】
上記の非特許文献１〜４の技術を単に組み合わせただけでは以下のような問題が存在する。
【００１２】
まず、システムの典型的な用法に対する実装以外を特定出来ないという問題がある。シナリオの実行による動的解析では、保守の対象となる機能の正常系の実行トレースを取得することは比較的容易であるが、異常系を含めた全ての実行パターンの実行トレースを取得し解析するのは困難である。
【００１３】
また、網羅的なシナリオの準備が必要となる。典型的な用法以外を解析するためには、意図的に異常な値を入力しエラーを出力する、または、権限の異なるユーザでの実行、等の様々な派生シナリオを網羅的に用意する必要となる。
【００１４】
本発明は、上記の点に鑑みなされたもので、実際に動作させた機能の他に、実装されているが動作させていない機能に対応する実装箇所を特定することが可能であり、少ないシナリオ数でシステムが持つ機能の実装箇所を特定することが可能なプログラム分析装置及び方法及びプログラムを提供することを目的とする。
【課題を解決するための手段】
【００１５】
一態様によれば、プログラムを起動するシナリオを実行し、該プログラムを分析するプログラム分析装置であって、
前記プログラムを前記シナリオにより実行した実行トレース情報を取得し、実行トレース記憶手段に格納する実行トレース取得手段と、
前記シナリオをオブジェクトとし、前記プログラムの機能で実施されるモジュールを属性として、前記実行トレース情報を用いて第１形式文脈を作成し、形式文脈記憶手段に格納する第１形式文脈作成手段と、
前記形式文脈記憶手段の前記第１形式文脈を読み出して、形式概念分析処理により第１概念束を生成して第１概念束記憶手段に格納する形式概念分析手段と、
前記第１概念束記憶手段から前記第１概念束を読み出し、該第１概念束に含まれる各概念から、前記実行トレース記憶手段の前記実行トレース情報を参照して、実行されなかったが呼び出し依存関係が存在し実行される可能性のあった到達可能モジュール群を特定し、可到達モジュール記憶手段に格納する可到達モジュール抽出手段と、
前記可到達モジュール記憶手段の前記到達可能モジュール群を前記形式文脈記憶手段に追加することにより前記第１形式文脈を含む第２形式文脈を作成する第２形式文脈作成手段と、
前記形式文脈記憶手段に格納された前記第２形式文脈を用いて、再度、前記形式概念分析手段に形式概念分析を実行させ、得られた第２概念束を第２概念束記憶手段に格納する手段と、を有するプログラム分析装置が提供される。
【発明の効果】
【００１６】
一態様によれば、形式概念分析を用いて機能捜索する際に、実際に動作させた機能の他に、実装されているが動作させていない機能に対応する実装箇所を指定することが可能となり、「システムが持つ機能」の実装箇所の特定に必要な、入力するシナリオ数を削減することができる。
【図面の簡単な説明】
【００１７】
【図１】本発明の一実施の形態におけるプログラム分析装置の構成例。
【図２】本発明の一実施の形態における概要動作のフローチャート。
【図３】本発明の一実施の形態における可到達モジュール抽出部の処理の詳細フローチャート。
【図４】本発明の一実施の形態におけるS３４０の詳細フローチャート。
【図５】本発明の一実施の形態における実行トレース記憶部の配列データの例。
【図６】本発明の一実施の形態における可到達行列記憶部の可到達行列B[i][j]の例。
【図７】本発明の一実施の形態における可到達モジュール記憶部のC[i][j]の例。
【図８】本発明の一実施の形態における第２形式文脈作成部の処理の詳細フローチャート。
【図９】本発明の一実施例におけるモジュール呼び出しグラフの例。
【図１０】本発明の一実施例におけるＳ２２０により得られる第１形式文脈の例。
【図１１】本発明の一実施例における概念束と概念のＩＤの対応関係の例。
【図１２】本発明の一実施例における概念束の例。
【図１３】本発明の一実施例における可到達モジュール群の特定処理の例。
【図１４】本発明の一実施例における第２形式文脈作成処理の例。
【図１５】本発明の一実施例における第２形式文脈を用いた形式概念分析により得られた第２概念束の例。
【発明を実施するための形態】
【００１８】
以下、図面と共に本発明の実施の形態を説明する。
【００１９】
最初に、本明細書で用いる用語について定義する。
【００２０】
・「理解したい機能」とは、システム利用者が、目的を果たすためにシステム上で実施した操作により機動される、一連の機能のうち、選択した機能を指す。選択した「理解したい機能」は、以上のうちのどれかの機能と対応する。また、これらの機能に関係するモジュールは概念束中の概念と対応する。
【００２１】
・「実装箇所」とは、本発明ではある特定の目的を満たすモジュール（Java（登録商標）であればメソッド）の集合を指す。例えば、「ログイン機能の実装箇所」とは、ログイン機能を実現するために記述されたモジュールの集合を指す。
【００２２】
・「システムの典型的な利用方法」とは、上記のシナリオのうち、システムのユーザマニュアルに記載があるような代表的な用法を指す。
【００２３】
・「実行トレース」とは、上記「シナリオ」を実行した際に起動された「モジュール」が、実行された順に記録された系列をいう。シナリオを起動してログを録ることにより作成され、形式概念分析手法（FCA: Formal Concept Analysis）の入力として使用される。
【００２４】
・「形式文脈」とは、どのオブジェクトが、どの属性を保有するのかを記述した対応表をいう。本発明においては、図２のＳ２２０で作成される形式文脈を第1形式文脈、図２のＳ２５０で作成される形式文脈を第２形式文脈と呼ぶ．
・「概念」とは、形式概念分析により発見される「実行トレース」の部分集合が保有する「モジュール」の部分集合をいう。本発明では、プログラムの機能を実現するモジュール集合とシナリオ集合のペアを形式概念として発見する。
【００２５】
・「概念束」とは、概念を数学の束（そく）として表現したものをいう。FCAを実施可能なツールによって得られる。また、本発明においては、下位の概念の属性として上位の概念の属性との差分のみを記述する「希薄な概念束」を以て概念束とする。この「希薄な概念束」は、非特許文献1中に記載がある概念束の「Sparse Representation」と同様である。本発明においては、図２のＳ２３０で作成される概念束を第１形概念束、図２のＳ２６０で作成される概念束を第２概念束と呼ぶ。
【００２６】
・「可到達モジュール」とは、上記シナリオにより実行されていないが、「理解したい機能」と対応する概念に含まれるモジュールから「呼び出し依存関係が存在」し、呼び出される可能性があったモジュール群を指す。
【００２７】
・「モジュール呼び出しグラフ」とは、モジュールをノード、呼び出し依存関係をエッジとした有向グラフを指す。
【００２８】
図１は、本発明の一実施の形態におけるプログラム分析装置の構成例を示す。
【００２９】
同図に示すプログラム分析装置は、ＣＰＵ９１０、メモリ９２０、磁気ディスク９３０のハードウェア構成を有する。
【００３０】
ＣＰＵ９１０は、実行トレース取得部９１１、第１形式文脈作成部９１２、形式概念分析部９１３、可到達モジュール抽出部９１４、第２形式文脈作成部９１５を有する。
【００３１】
メモリ９２０は、第１形式文脈作成部９１２で作成された形式文脈を格納する形式文脈記憶部９２１、可到達モジュール抽出部９１４で抽出された可到達モジュール群（C[i][j]）を格納する可到達モジュール記憶部９２２、モジュールをノード、呼び出し依存関係をエッジとした有向グラフを想定し、それより定まる可到達行列(B[i][j])が格納された可到達行列記憶部９２３を有する。当該可到達行列は、プログラムに含まれるモジュールの呼び出し依存関係からモジュール呼び出しグラフを書くことにより予め導出されているものとする。
【００３２】
磁気ディスク９３０は、実行トレース取得部９１１で取得した実行トレース情報（A[i][j]）を格納する実行トレース記憶部９３１、形式概念分析部９１３で得られた第１概念束を格納する第１概念束記憶部９３２、第２形式文脈作成部９１５で得られた２回目の第２概念束を格納する第２概念束記憶部９３３を有する。
【００３３】
以下に、上記の構成における処理を説明する。
【００３４】
図２は、本発明の一実施の形態における概要動作のフローチャートである。
【００３５】
ステップ２１０）  実行トレース取得部９１１は、解析対象となるシステムの機能を起動する入力操作の集合（シナリオ）を、プログラムの典型的な機能を網羅するように用意して実行し、実行トレース情報を取得し実行トレース記憶部９３１に格納する。実行トレース記憶部９３１には、実行トレース情報として、モジュールが実行済みか否か、呼び出し元モジュール名、呼び出し先モジュール名が格納される。
【００３６】
ステップ２２０）  第１形式文脈作成部９１２は、実行トレース記憶部９３１に格納されている実行トレースを読み込み、シナリオを「オブジェクト」とし、実行されたモジュールを「属性」として、「形式文脈」を生成して、形式文脈記憶部９２１に格納する。
【００３７】
ステップ２３０）  形式概念分析部９１３は、形式文脈記憶部９２１に格納されている形式文脈を読み込み、非特許文献１等で用いている形式概念分析（FCA）を適用し、「第１概念束」を得て、第１概念束記憶部９３２に格納する。
【００３８】
ステップ２３５）  形式概念分析部９１３は、ステップ２３０の形式概念分析が終了した時点で、どのモジュールがどのコンセプト（概念）に含まれるかという対応関係（コンセプトＩＤとモジュール名）が得られ、呼び出し元コンセプトＩＤを実行トレース記憶部９３１に書き込む。
【００３９】
ステップ２４０）  可到達モジュール抽出部９１４は、実行トレース記憶部９３１に格納されている実行トレース情報と、第１概念束記憶部９３２に格納されている第１概念束を読み込み、得られた「第１概念束」に含まれる各概念から、可到達モジュール群を特定し、可到達モジュール記憶部９２２に格納する。当該処理の詳細については図３で後述する。
【００４０】
ステップ２５０）  第２形式文脈作成部９１５は、形式文脈記憶部９２１に格納されている形式文脈に、可到達モジュール記憶部９２２に格納されているか到達モジュール群を追加して第２形式文脈を作成し、形式文脈記憶部９２１に格納する。当該処理の詳細については図８で後述する。
【００４１】
ステップ２６０）  形式概念分析部９１３は、ステップ２５０の処理により形式文脈記憶部９２１に格納されている第２形式文脈を読み込み、再度形式概念分析(FCA)を実行し、第２概念束を得て、第２概念束記憶部９３３に格納する。格納される第２概念束に含まれる概念の中には、モジュール（メソッド等）のリストが含まれている。したがって、得られた概念束には機能の塊である概念があり、当該概念はソースコード中のモジュール名毎の塊になっている。
【００４２】
次に、上記のステップ２４０の詳細な処理について説明する。
【００４３】
図３は、本発明の一実施の形態における可到達モジュール抽出部の処理の詳細フローチャートである。以下の記載において、モジュールmi(i=1,n)はプログラム内のモジュールであり、nはモジュールの数、→⊆M×Mは呼び出し依存関係であり、M={m1,m2,…,mn}である。→exe⊆→は実行済みの依存関係、→non⊆→は未実行の依存関係（→＝→exe∪→non）である。
【００４４】
ステップ３１０）  可到達モジュール抽出部９１４は、概念ci(i=1,k：kは希薄な概念束中の最下位の概念を除く全ての概念の数)を取り出すループ（以下のステップ３２０〜３４０の処理）を実行する。
【００４５】
ステップ３２０）  選択した概念ciに属するモジュール群
【００４６】
【数１】
2015215834.tif 000003
を特定する。なお、本発明での概念束は「希薄な概念束」なので、
【００４７】
【数２】
2015215834.tif 000004
は、上位概念に含まれる属性集合の要素とは重複しない。
【００４８】
ステップ３３０）  実行トレース記憶部９３１を参照して、モジュール群
【００４９】
【数３】
2015215834.tif 000005
に含まれるモジュールが呼び出しの起点となっているような未実行依存関係を抽出する。
【００５０】
ステップ３４０）  抽出した未実行依存関係の呼び出し先のモジュール群
【００５１】
【数４】
2015215834.tif 000006
を特定し、可到達モジュール群
【００５２】
【数５】
2015215834.tif 000007
を取得し、C[i][j]として可到達モジュール記憶部９２２に格納する。但し、→nonは、未実行の依存関係を示し、→*は可到達な関係の推移閉包を示す。
【００５３】
当該ステップ３４０の詳細処理のフローチャートを図４に示す。
【００５４】
ステップ５１０）  可到達モジュール抽出部９１４は、図５に示す実行トレース記憶部９３１の配列A[i][j]の行 (i=1〜l)について、以下の処理を実行する。ここで、図５に示す配列は、ステップ２１０において実行トレース取得部９１１によって全依存関係の実行済／未実行が記録されたA[i][j]のデータ（実行トレース情報）が、ステップ２３０の形式概念分析部９１３の処理により、どのモジュールがどのコンセプト（概念）に含まれるかという対応関係が得られるため、A[i][2]のモジュール（呼び出し元のモジュール）についてコンセプト分類されたA[i][1]のデータ（呼出元コンセプトＩＤ）が得られる。同図の「TRUE」は実行済みを示し、「FALSE」は未実行を示す。同図の例ではA[i][2],A[i][3]の組(呼び出し元モジュール、呼び出し先モジュール)で１つの呼び出し依存関係を表している。A[i][2],A[i][3]には、対象システム内の呼び出し依存関係数i(i=1〜k)（kは呼び出し依存関係数）が格納されている。
【００５５】
ステップ５２０）  次に、可到達モジュール抽出部９１４は、実行トレース記憶部９３１の図５のA[i][0]を参照し、実行済み（TRUE）であるかを判断し、実行済みであれば当該処理を終了する。未実行（FALSE）であればステップ５３０の処理に移行する。
【００５６】
ステップ５３０）  ステップ５２０において、Ａ[i][0]が未実行である場合は、図６に示す可到達行列記憶部９２３に予め格納されている可到達行列B[p][q]の行（p=1〜n）について以下の操作を実行する。図６に示す可到達行列の行のB[i][0](i=0〜n)には呼び出し元モジュール名が並び、列のB[0][j](j=0〜n)には呼び出し先モジュール名が並び、B[i][j](i>0,j>0)には、Module iからModule jに、呼び出しを順方向に追って到達できる場合に、「0でない数字」が格納される。それ以外の場合は「0」が格納される。
【００５７】
ステップ５４０）  可到達モジュール抽出部９１４は、図６の可到達行列記憶部９２３を参照し、A[i][3]＝B[p][0]であるかを判断し、A[i][3]＝B[p][0]である場合はステップ５５０の処理に移行し、A[i][3]≠B[p][0]である場合は、当該処理を終了する。
【００５８】
ステップ５５０）  可到達モジュール抽出部９１４は、可到達行列記憶部９２３の図６に示す可到達行列B[p][q]を参照し、列（q=1〜n）について以下の操作を実行する。
【００５９】
ステップ５６０）  B[p][q]≠0である場合は、ステップ５７０に移行し、そうでない場合は当該処理を終了する。
【００６０】
ステップ５７０）  可到達モジュール抽出部９１４は、図７に示す可到達モジュール記憶部９２２の可到達モジュール群の行列C[r][0]にA[i][1]が既に存在するかを判定する。存在する場合はステップ６００に移行し、存在しない場合はステップ５８０に移行する。可到達モジュール記憶部９２２は図７に示すように、C[i][0]はコンセプト(Concept)IDが並び、C[i][j]にはモジュール(Module)名が並ぶ。当該C[i][j]はコンセプトごとの可到達モジュール群を格納するために用いられる。例えば、図７の点線で示される部分は、Concept2に含まれるモジュールから呼び出し関係を順方向に追跡して到達し得るモジュールの集合を示している。
【００６１】
ステップ５８０）  可到達モジュール抽出部９１４は、C[r][0]にA[i][j]に格納されている値を代入する（但し、rの初期値は０とする）。
【００６２】
ステップ５９０）  rの値を１加算する。
【００６３】
ステップ６００）  C[r][0]=A[i][1]となる行rに、重複を避けつつ、可到達行列記憶部９２３のB[0][q]に格納されているモジュール名を代入する。これにより、ステップ３４０の可到達モジュール群
【００６４】
【数６】
2015215834.tif 000008
が作成され、可到達モジュール記憶部９２２に格納される。
【００６５】
上記の図４のステップ５５０〜６００の処理を行うことにより、シナリオによって実行されてはいないが、シナリオに関係のあるモジュール群を抽出できるため、実際に動作させた機能の他に、「実装されているが動作させていない機能」に対応するソースコード上での実装箇所を指定することが可能となる。
【００６６】
さらに、ステップ５５０〜６００の処理により、シナリオによって実行されてはいないがシナリオに関係のあるモジュール群が抽出可能となるので、シナリオの亜種を作る必要がなく、「システムが持つ機能」の実装箇所の特定に必要な、入力とするシナリオ数を削減することができる。
【００６７】
次に、図２のステップ２５０の詳細な処理について説明する。
【００６８】
図８は、本発明の一実施の形態における第２形式文脈作成部の処理の詳細フローチャートである。
【００６９】
ステップ４１０）  第２形式文脈作成部９１５は、
【００７０】
【数７】
2015215834.tif 000009
(i=1,k：kは希薄な概念束中の最下位の概念を除く全ての概念の数)を取り出すループを実行する。
【００７１】
ステップ４２０）  可到達モジュール群
【００７２】
【数８】
2015215834.tif 000010
であるかを判定し、可到達モジュール群が0である場合は当該処理を終了し、0でない場合は、既存の形式文脈の最下位に、可到達モジュール記憶部９２２に保持されている
【００７３】
【数９】
2015215834.tif 000011
の情報を追加し、形式文脈記憶部９２１に書き込み、ステップ２６０の処理に移行する。
【実施例】
【００７４】
以下に、上記の実施の形態における具体的な処理について説明する。
【００７５】
図９は、本発明の一実施例におけるシステムのモジュール呼び出しグラフを示す。
【００７６】
以下では、図９のような、モジュールをノード、呼び出し関係をエッジとするモジュール呼出しグラフが記述できるシステムを想定して説明する。
【００７７】
同図に示すシステムでは、「登録」、「参照」、「削除」の３つの機能（シナリオ）が存在し、１つのメニュー画面から上記の3つの機能を実行できる。同図において、実線は各機能が正常に動作した際に実行される呼び出し関係を示し、点線は異常時に実行される可能性のある呼び出し関係を示している。
【００７８】
前述の図２のステップ２１０において、実行トレース取得部９１１が「登録」「参照」「削除」の３つのシナリオを実行し、実行トレース情報を取得し、ステップ２２０において、第１形式文脈作成部９１２が、取得した実行トレース情報を用いて第１形式文脈を作成すると図１０の結果を得る。図１０の「登録」機能の例では、m1，m2，m5，m8，m9の処理を行うことを示している。そして、ステップ２３０において、形式概念分析部９１３が図１０の第１形式文脈を用いて形式概念分析を実施すると図１１に示すような概念束と概念のIDの対応関係が作成される。C1,…C5は各概念のIDを示す。図１０と図１１から得られる形式文脈は図１２に示すようになり、形式文脈記憶部９２１に格納される。
【００７９】
次に、ステップ２４０において、可到達モジュール抽出部９１４が、形式文脈記憶部９２１から概念束に含まれる各概念から「実行されなかったが、依存関係が存在し実行させる可能性があった」到達可能モジュール群を特定する。まず、図３のステップ３１０〜３４０において、図１３において点線で示される各概念内の未実行依存関係を見つけ、ステップ３５０〜３６０において、見つけた未実行依存関係の呼び出し先を起点としてその先の全てのモジュールを、実行される可能性のあったモジュール群
【００８０】
【数１０】
2015215834.tif 000012
として抽出する。図１３において、実行される可能性のあるモジュールを太線で示す。
【００８１】
次に、第２形式文脈作成部９１５は、上記のステップ２４０で得られた可到達モジュール群を取得し、図１４に示す第２形式文脈を出力する。図８のステップ２５０（ステップ４１０〜４３０）により、図１０の形式文脈（オリジナル）に、可到達モジュール群の情報が追加され、第２形式文脈が得られ、形式文脈記憶部９２１に格納される。
【００８２】
形式概念分析部９１３は、上記のステップ２５０の処理により得られた第２形式文脈を形式文脈記憶部９２１から取得してFCAを行うことにより、図１５に示すような第２概念束を取得し、第２概念束記憶部９３３に格納する。図１５において、点線よりも右側の部分は実行済みモジュールが含まれる概念であり、点線よりも左の部分は、ステップ２４０，２５０により追加された情報により、概念が増えている。図１５の例では、元のC1（全シナリオ共通）に関するするモジュールa、「「削除」「参照」がシナリオ共通の概念」と「「登録」シナリオ固有の概念」が共通して実行する可能性のあったモジュールb、元のC2（「削除」「参照」シナリオ共通）に関係する概念と「削除」「参照」で共通して実行される可能性があったモジュールc、元のC3（「登録」シナリオ固有）に関する概念と「登録」シナリオで実行される可能性があったモジュールdが加えられている。
【００８３】
本発明は、第２形式文脈作成部９１５において、図１４に示すような第２形式文脈を作成し、形式概念分析部９１３で２回目の形式概念分析を行っている。
【００８４】
なお、本発明は、図１に示すプログラム分析装置のCPU９１０の各構成要素の動作をプログラムとして構築し、プログラム分析装置として利用されるコンピュータにインストールして実行させる、または、ネットワークを介して流通させることが可能である。
【００８５】
本発明は、上記の実施の形態及び実施例に限定されることなく、特許請求の範囲内において、種々変更・応用が可能である。
【符号の説明】
【００８６】
９１０  CPU
９１１  実行トレース取得部
９１２  第１形式文脈作成部
９１３  形式概念分析部
９１４  可到達モジュール抽出部
９１５  第２形式文脈作成部
９２０  メモリ
９２１  形式文脈記憶部
９２２  可到達モジュール記憶部
９２３  可到達行列記憶部
９３０  磁気ディスク
９３１  実行トレース記憶部
９３２  第１概念束記憶部
９３３  第２概念束記憶部
【図１】
2015215834.tif 000013
【図２】
2015215834.tif 000014
【図３】
2015215834.tif 000015
【図４】
2015215834.tif 000016
【図５】
2015215834.tif 000017
【図６】
2015215834.tif 000018
【図７】
2015215834.tif 000019
【図８】
2015215834.tif 000020
【図９】
2015215834.tif 000021
【図１０】
2015215834.tif 000022
【図１１】
2015215834.tif 000023
【図１２】
2015215834.tif 000024
【図１３】
2015215834.tif 000025
【図１４】
2015215834.tif 000026
【図１５】
2015215834.tif 000027