(57)【要約】【課題】本発明は、多数のサブルーチンを含む大規模なプログラムをユーザが解析する際の作業の効率を向上させることが可能なプログラム解析装置およびプログラム解析プログラムを提供することを目的とする。【解決手段】本発明によるプログラム解析装置は、呼び出し関係付加部３にて生成された有向グラフのデータに基づいて、サブルーチン内の条件式を用いる処理において参照される変数値を決定する処理に対応する節点を抽出し、変数値を決定する処理に対応する節点から条件式を用いる処理に対応する節点に向けて当該２つの節点を接続する、２つの節点のデータ依存関係を表す有向辺であるデータ依存辺のデータを生成し、当該データ依存辺のデータを有向グラフのデータに付加する条件式データ依存関係付加部４とを備える。【選択図】図１
2012164264.tif 000002
【特許請求の範囲】
【請求項１】
ユーザからの所定の入力によって解析対象プログラムの指定を受け付ける入力受付部と、
前記入力受付部にて指定された前記解析対象プログラムに含まれる複数のサブルーチンのコードに基づき、フローチャートを表す有向グラフのデータを生成するフローチャート生成部と、
前記フローチャート生成部にて生成された前記有向グラフのデータに基づいて前記サブルーチン間の呼び出し関係を抽出し、呼び出し元のサブルーチン内の呼び出し処理に対応する節点から呼び出し先のサブルーチンの入り口に対応する節点に向けて当該２つの節点を接続する、前記呼び出し関係を表す有向辺である呼び出し辺のデータを生成し、当該呼び出し辺のデータを前記有向グラフのデータに付加する呼び出し関係付加部と、
前記呼び出し関係付加部にて生成された前記有向グラフのデータに基づいて、前記サブルーチン内の条件式を用いる処理において参照される変数値を決定する処理に対応する節点を抽出し、前記変数値を決定する処理に対応する節点から前記条件式を用いる処理に対応する節点に向けて当該２つの節点を接続する、前記２つの節点のデータ依存関係を表す有向辺であるデータ依存辺のデータを生成し、当該データ依存辺のデータを前記有向グラフのデータに付加する条件式データ依存関係付加部と、
前記条件式データ依存関係付加部にて生成された前記有向グラフのデータに基づいて、前記フローチャートのレイアウトデータを生成するグラフレイアウト決定部と、
前記グラフレイアウト決定部にて生成された前記レイアウトデータに基づいて、前記フローチャートを出力して表示する表示部と、
を備える、プログラム解析装置。
【請求項２】
前記入力受付部にて前記解析対象プログラムとともに指定された解析対象サブルーチンと、前記条件式データ依存関係付加部にて生成された前記有向グラフのデータとに基づいて、前記解析対象サブルーチンに関連するサブルーチンのうちの前記データ依存辺を含まず前記条件式に影響しない非影響サブルーチンを抽出し、当該非影響サブルーチンのデータを生成する制御フロー非影響部分抽出部をさらに備え、
前記グラフレイアウト決定部は、前記条件式データ依存関係付加部にて生成された前記有向グラフのデータと、前記制御フロー非影響部分抽出部にて生成された前記非影響サブルーチンのデータとに基づいて、前記非影響サブルーチンを除く前記フローチャートのレイアウトデータを生成することを特徴とする、請求項１に記載のプログラム解析装置。
【請求項３】
前記条件式データ依存関係付加部にて生成された前記有向グラフのデータに基づいて、前記各サブルーチンをそれぞれまとめて代表節点とし、前記有向グラフのデータを、前記代表節点と当該代表節点間を接続する前記呼び出し辺および前記データ依存辺とを含むコールグラフのデータに変換して生成するコールグラフ変換部をさらに備え、
前記グラフレイアウト決定部は、前記コールグラフ変換部にて生成された前記コールグラフのデータに基づいて、前記コールグラフのレイアウトデータを生成することを特徴とする、請求項１に記載のプログラム解析装置。
【請求項４】
前記コールグラフ変換部にて生成された前記コールグラフのデータに基づいて、前記各代表節点をそれぞれクラス毎にまとめてクラス節点とし、前記コールグラフのデータを、前記クラス節点と当該クラス節点間を接続する前記呼び出し辺および前記データ依存辺とを含むクラス図のデータに変換して生成するクラス図変換部をさらに備え、
前記グラフレイアウト決定部は、前記クラス図変換部にて生成された前記クラス図のデータに基づいて、前記クラス図のレイアウトデータを生成することを特徴とする、請求項３に記載のプログラム解析装置。
【請求項５】
コンピュータをプログラム解析装置として機能させるためのプログラム解析プログラムであって、
（ａ）ユーザからの所定の入力によって解析対象プログラムの指定を受け付ける手順と、
（ｂ）前記手順（ａ）にて指定された前記解析対象プログラムに含まれる複数のサブルーチンのコードに基づき、フローチャートを表す有向グラフのデータを生成する手順と、
（ｃ）前記手順（ｂ）にて生成された前記有向グラフのデータに基づいて前記サブルーチン間の呼び出し関係を抽出し、呼び出し元のサブルーチン内の呼び出し処理に対応する節点から呼び出し先のサブルーチンの入り口に対応する節点に向けて当該２つの節点を接続する、前記呼び出し関係を表す有向辺である呼び出し辺のデータを生成し、当該呼び出し辺のデータを前記有向グラフのデータに付加する手順と、
（ｄ）前記手順（ｃ）にて生成された前記有向グラフのデータに基づいて、前記サブルーチン内の条件式を用いる処理において参照される変数値を決定する処理に対応する節点を抽出し、前記変数値を決定する処理に対応する節点から前記条件式を用いる処理に対応する節点に向けて当該２つの節点を接続する、前記２つの節点のデータ依存関係を表す有向辺であるデータ依存辺のデータを生成し、当該データ依存辺のデータを前記有向グラフのデータに付加する手順と、
（ｅ）前記手順（ｄ）にて生成された前記有向グラフのデータに基づいて、前記フローチャートのレイアウトデータを生成する手順と、
（ｆ）前記手順（ｅ）にて生成された前記レイアウトデータに基づいて、前記フローチャートを出力して表示する手順と、
をコンピュータに実行させることを特徴とする、プログラム解析プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムの解析を行うプログラム解析装置および当該プログラム解析装置によって実行されるプログラム解析プログラムに関し、特に、プログラムの処理フローがプログラムの実行時にどのようにして決定されるのかを人間（以下、ユーザとも称する）が解析することを支援するプログラム解析装置およびプログラム解析プログラムに関する。また、本発明の典型的な利用方法としては、例えば、本発明によるプログラム解析装置に入力されたプログラムを解析した結果をコンピュータディスプレイ上にグラフィカルに表示することに利用される。
【背景技術】
【０００２】
コンピュータプログラム（以下、単にプログラムとも称する）の開発作業では、既存のプログラムを再利用することが多い。また、プログラムの保守作業では、不具合のあるプログラムに修正を施す作業を行う。これらの作業において、再利用あるいは修正の対象となるプログラムがどのように動作するのかを事前に解析することが必要である。
【０００３】
一般にプログラムは、与えられた入力データに応じてそのプログラム独自の処理を実行して何らかのデータを出力する。通常、プログラム独自の処理には、入力データやプログラム外部の状況に応じて処理方法を切り替えるための条件分岐処理や、複数のデータを順次に処理するための繰り返し処理が含まれる。
【０００４】
このため、プログラムの実行時に実行される処理の手順（以下、制御フローとも称する）は一般に複数の経路を持ち、近年の大規模なプログラムには多数の経路が入り組んだ複雑な制御フローを有するものが多い。プログラムを再利用あるいは修正を行うユーザは、そのプログラムがどのような状況でどのような処理を実行するのかを理解する必要があるが、複雑な制御フローをプログラムコードからユーザが読み取ることは難しい。
【０００５】
従来では、プログラムの制御フローをユーザが理解しやすい図的表現で表す手段であるフローチャートがある（例えば、非特許文献１参照）。
【０００６】
また、プログラムの実行が特定のコード（例えば、ユーザにより任意に指定されたコード）に到達するまでの実行条件を抽出して出力するプログラム解析装置が開示されている（例えば、特許文献１参照）。特許文献１では、プログラムを解析して、着目するコードに至るまでの条件および状態変化をノードとして作成する条件依存グラフの中で、所定のノードに対応する条件によって経路が複数に分かれた後に再度一つのノードへ合流する部分である完全部分グラフを１本の経路で表すよう条件依存グラフを単純化することで、ユーザによるプログラムの解析が容易になると記載されている。
【先行技術文献】
【非特許文献】
【０００７】
【非特許文献１】「情報処理用流れ図・プログラム網図・システム資源図記号」、日本工業標準調査会、ＪＩＳＸ０１２１、１９８６年
【特許文献】
【０００８】
【特許文献１】特開２００６−１７８８３５号公報（段落［０００９］−段落［００１２］、第３，４図）
【発明の概要】
【発明が解決しようとする課題】
【０００９】
非特許文献１によれば、フローチャートは、プログラムの制御フローの形状をユーザが理解しやすい有向グラフの形で表現することができる。しかし、フローチャートは、条件分岐処理や繰り返し処理に用いられる条件式と、当該条件式で使用する変数の値を決定する処理との関係を表現していないため、制御フローがプログラム中のどこでどのように決まるか（以下、単に制御フローの決まり方とも称する）をユーザが理解することは難しい。また、フローチャートはサブルーチンごとに作成されるため、大規模なプログラムではフローチャートが非常に多くなり、ユーザがフローチャート間の関係性を把握するのが困難になりやすい。
【００１０】
また、特許文献１に記載の条件依存グラフの単純化によれば、非特許文献１に記載のフローチャートよりもグラフの規模は小さくなるが、条件分岐処理や繰り返し処理に用いられる条件式と、当該条件式で使用する変数の値を決定する処理との関係を表現していないため、制御フローの決まり方をユーザが理解することは難しい。また、プログラムに複数のサブルーチンが含まれていて、それらが相互に呼び出し合うようにプログラムが構成されている場合における条件依存グラフを作成する方法が開示されておらず、大規模なプログラムの全体をユーザが解析する作業をどのように支援するのか不明である。
【００１１】
このように、従来による図的表現をユーザが見ることによって、プログラムの制御フローの決まり方を理解することは難しい。また、特に多数のサブルーチンを含む大規模なプログラムを解析する場合には、多数の図的表現間の関係性をユーザが把握することが困難になりやすい。
【００１２】
本発明は、これらの問題を解決するためになされたものであり、多数のサブルーチンを含む大規模なプログラムをユーザが解析する際の作業の効率を向上させることが可能なプログラム解析装置およびプログラム解析プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１３】
上記の課題を解決するために、本発明によるプログラム解析装置は、ユーザからの所定の入力によって解析対象プログラムの指定を受け付ける入力受付部と、入力受付部にて指定された解析対象プログラムに含まれる複数のサブルーチンのコードに基づき、フローチャートを表す有向グラフのデータを生成するフローチャート生成部と、フローチャート生成部にて生成された有向グラフのデータに基づいてサブルーチン間の呼び出し関係を抽出し、呼び出し元のサブルーチン内の呼び出し処理に対応する節点から呼び出し先のサブルーチンの入り口に対応する節点に向けて当該２つの節点を接続する、呼び出し関係を表す有向辺である呼び出し辺のデータを生成し、当該呼び出し辺のデータを有向グラフのデータに付加する呼び出し関係付加部と、呼び出し関係付加部にて生成された有向グラフのデータに基づいて、サブルーチン内の条件式を用いる処理において参照される変数値を決定する処理に対応する節点を抽出し、変数値を決定する処理に対応する節点から条件式を用いる処理に対応する節点に向けて当該２つの節点を接続する、２つの節点のデータ依存関係を表す有向辺であるデータ依存辺のデータを生成し、当該データ依存辺のデータを有向グラフのデータに付加する条件式データ依存関係付加部と、条件式データ依存関係付加部にて生成された有向グラフのデータに基づいて、フローチャートのレイアウトデータを生成するグラフレイアウト決定部と、グラフレイアウト決定部にて生成されたレイアウトデータに基づいて、フローチャートを出力して表示する表示部とを備える。
【発明の効果】
【００１４】
本発明によると、ユーザからの所定の入力によって解析対象プログラムの指定を受け付ける入力受付部と、入力受付部にて指定された解析対象プログラムに含まれる複数のサブルーチンのコードに基づき、フローチャートを表す有向グラフのデータを生成するフローチャート生成部と、フローチャート生成部にて生成された有向グラフのデータに基づいてサブルーチン間の呼び出し関係を抽出し、呼び出し元のサブルーチン内の呼び出し処理に対応する節点から呼び出し先のサブルーチンの入り口に対応する節点に向けて当該２つの節点を接続する、呼び出し関係を表す有向辺である呼び出し辺のデータを生成し、当該呼び出し辺のデータを有向グラフのデータに付加する呼び出し関係付加部と、呼び出し関係付加部にて生成された有向グラフのデータに基づいて、サブルーチン内の条件式を用いる処理において参照される変数値を決定する処理に対応する節点を抽出し、変数値を決定する処理に対応する節点から条件式を用いる処理に対応する節点に向けて当該２つの節点を接続する、２つの節点のデータ依存関係を表す有向辺であるデータ依存辺のデータを生成し、当該データ依存辺のデータを有向グラフのデータに付加する条件式データ依存関係付加部と、条件式データ依存関係付加部にて生成された有向グラフのデータに基づいて、フローチャートのレイアウトデータを生成するグラフレイアウト決定部と、グラフレイアウト決定部にて生成されたレイアウトデータに基づいて、フローチャートを出力して表示する表示部とを備えるため、多数のサブルーチンを含む大規模なプログラムをユーザが解析する際の作業の効率を向上させることが可能となる。
【図面の簡単な説明】
【００１５】
【図１】本発明の実施形態１によるプログラム解析装置の構成を示すブロック図である。
【図２】本発明の実施形態１によるプログラム解析装置を実現するためのハードウェアの構成を示す図である。
【図３】本発明の実施形態１による解析対象プログラムの一例を示す図である。
【図４】本発明の実施形態１によるプログラム解析装置が図３に示す解析対象プログラムを解析して出力したフローグラフの一例を示す図である。
【図５】本発明の実施形態１によるプログラム解析装置が作成した図４に示すフローグラフに対応するデータの一例を示す図である。
【図６】本発明の実施形態１によるグラフレイアウト決定部が図４に示すフローグラフを作成する際におけるフローグラフの節点のレイアウトに関するデータの一例を示す図である。
【図７】本発明の実施形態１によるグラフレイアウト決定部が図４に示すフローグラフを作成する際におけるフローグラフの辺のレイアウトに関するデータの一例を示す図である。
【図８】本発明の実施形態１による図６に示す節点種別と当該節点種別に対応する図形との関係を示す図である。
【図９】本発明の実施形態１による図７に示す辺種別と当該辺種別に対応する図形との関係を示す図である。
【図１０】本発明の実施形態１によるフローチャート生成部が図３に示す解析対象プログラムを解析して作成した有向グラフのデータの一例を示す図である。
【図１１】本発明の実施形態１による図１０に示すデータに対応する有向グラフの一例を示す図である。
【図１２】本発明の実施形態１によるフローチャート生成部における図１０に示すデータの記録動作を示すフローチャートである。
【図１３】本発明の実施形態１による呼び出し関係付加部が図１０に示すデータに基づいて作成した有向グラフのデータの一例を示す図である。
【図１４】本発明の実施形態１による図１３に示すデータに対応する有向グラフの一例を示す図である。
【図１５】本発明の実施形態１による条件式データ依存関係付加部の動作を示すフローチャートである。
【図１６】本発明の実施形態２によるプログラム解析装置の構成を示すブロック図である。
【図１７】本発明の実施形態２によるプログラム解析装置が図３に示す解析対象プログラムを解析して出力したフローグラフの一例を示す図である。
【図１８】本発明の実施形態２による制御フロー非影響部分抽出部が図３に示す解析対象プログラムを解析して作成した非影響部分グラフのデータの一例を示す図である。
【図１９】本発明の実施形態２による制御フロー非影響部分抽出部の動作を示すフローチャートである。
【図２０】本発明の実施形態２による制御フロー非影響部分抽出部７の動作を示すフローチャートである。
【図２１】本発明の実施形態２によるグラフレイアウト決定部が作成したフローグラフのデータの一例を示す図である。
【図２２】本発明の実施形態３によるプログラム解析装置の構成を示すブロック図である。
【図２３】本発明の実施形態３によるプログラム解析装置が図３に示す解析対象プログラムを解析して出力したコールグラフの一例を示す図である。
【図２４】本発明の実施形態３によるコールグラフ変換部が作成したコールグラフのデータの一例を示す図である。
【図２５】本発明の実施形態３によるグラフレイアウト決定部が図２３に示すコールグラフを作成する際におけるコールグラフの節点のレイアウトに関するデータの一例を示す図である。
【図２６】本発明の実施形態３によるグラフレイアウト決定部が図２３に示すコールグラフを作成する際におけるコールグラフの辺のレイアウトに関するデータの一例を示す図である。
【図２７】本発明の実施形態３による図２５に示す節点種別と当該節点種別に対応する図形との関係を示す図である。
【図２８】本発明の実施形態３によるコールグラフ変換部におけるデータ依存辺接続先ＩＤの設定動作を示すフローチャートである。
【図２９】本発明の実施形態４によるプログラム解析装置の構成を示すブロック図である。
【図３０】本発明の実施形態４による解析対象プログラムの一例を示す図である。
【図３１】本発明の実施形態４によるプログラム解析装置が図３０に示す解析対象プログラムを解析して出力したクラス図の一例を示す図である。
【図３２】本発明の実施形態４によるクラス図変換部が図３３に示すデータに基づいて作成したクラス図のデータの一例を示す図である。
【図３３】本発明の実施形態４によるコールグラフ変換部が図３９に示すデータに基づいて作成したコールグラフのデータの一例を示す図である。
【図３４】本発明の実施形態４によるグラフレイアウト決定部が図３１に示すクラス図を作成する際におけるクラス図の節点のレイアウトに関するデータの一例を示す図である。
【図３５】本発明の実施形態４によるグラフレイアウト決定部が図３１に示すクラス図を作成する際におけるクラス図の辺のレイアウトに関するデータの一例を示す図である。
【図３６】本発明の実施形態４による図３４に示す節点種別と当該節点種別に対応する図形との関係を示す図である。
【図３７】フローチャート生成部が図３０に示す解析対象プログラムを解析して作成した有向グラフのデータの一例を示す図である。
【図３８】本発明の実施形態４による呼び出し関係付加部が図３７に示すデータに基づいて作成した有向グラフのデータの一例を示す図である。
【図３９】条件式データ依存関係付加部が図３８に示すデータに基づいて作成したフローグラフのデータの一例を示す図である。
【図４０】本発明の実施形態４によるクラス図変換部におけるコールグラフ中の呼び出し辺の設定動作を示すフローチャートである。
【図４１】本発明の実施形態４によるクラス図変換部におけるコールグラフ中のデータ依存辺の設定動作を示すフローチャートである。
【発明を実施するための形態】
【００１６】
本発明の実施形態について、図面に基づいて以下に説明する。
【００１７】
〈実施形態１〉
図１は、本発明の実施形態１によるプログラム解析装置１００の構成を示すブロック図である。
【００１８】
図１に示すように、本実施形態１によるプログラム解析装置１００は、入力受付部１と、フローチャート生成部２と、呼び出し関係付加部３と、条件式データ依存関係付加部４と、グラフレイアウト決定部５と、表示部６とを備えている。
【００１９】
入力受付部１は、ユーザから解析対象のプログラム（以下、解析対象プログラムとも称する）の指定（所定の入力）を受け付けて、フローチャート生成部２に対して当該解析対象プログラムを指定する。フローチャート生成部２は、入力受付部１から指定された解析対象プログラムに含まれる各サブルーチンについて、当該各サブルーチンのコード（ソースコード）に基づいてフローチャートを表す有向グラフのデータを作成する（以下、フローチャートにおいてノード（節点）間を接続する有向辺を「制御辺」とも称する）。
【００２０】
呼び出し関係付加部３は、フローチャート生成部２が作成した全てのフローチャート（サブルーチン）間の呼び出し関係を抽出して、呼び出し元の処理に対応する節点から呼び出し先のサブルーチンの入り口に対応する節点に向けた呼び出し関係を表す有向辺（以下、呼び出し辺とも称する）を付加して上記２つの節点を接続する。このように、呼び出し関係付加部３は、全ての呼び出し関係に対応する呼び出し辺を付加することによって、解析対象プログラムの入り口に対応する節点と直接的あるいは間接的に制御辺あるいは呼び出し辺で接続された有向グラフのデータを作成する。
【００２１】
条件式データ依存関係付加部４は、呼び出し関係付加部３が作成した有向グラフのデータにおける条件分岐処理に対応する全ての節点に対して、各節点に対応する処理で用いられる条件式が参照する全ての変数について、当該変数に値を設定する処理に対応する節点を制御辺あるいは呼び出し辺を逆向きに辿って（遡って）見つけ出し、変数に値を設定する処理に対応する節点から変数を参照する処理（条件分岐処理）に対応する節点に向けた有向辺（以下、データ依存辺とも称する）を付加して上記２つの節点を接続する。すなわち、条件式データ依存関係付加部４は、呼び出し関係付加部にて生成された有向グラフのデータに基づいて、サブルーチン内の条件式を用いる処理において参照される変数値を決定する処理に対応する節点を抽出し、変数値を決定する処理に対応する節点から条件式を用いる処理に対応する節点に向けて当該２つの節点を接続する、２つの節点のデータ依存関係を表す有向辺であるデータ依存辺のデータを生成し、当該データ依存辺のデータを有向グラフのデータに付加する。このように、条件式データ依存関係付加部４は、条件分岐処理に対応する全ての節点にデータ依存辺を付加した有向グラフ（以下、フローグラフとも称する）のデータを作成する。
【００２２】
グラフレイアウト決定部５は、条件式データ依存関係付加部４が作成したフローグラフ（フローチャート）を出力する際における節点と辺のレイアウトを決定してレイアウトデータを作成する。表示部６は、グラフレイアウト決定部５が作成したレイアウトデータ（すなわち、フローグラフ）を出力して表示する。
【００２３】
図２は、本発明の実施形態１によるプログラム解析装置１００を実現するためのコンピュータのハードウェアの構成を示す図である。図２に示すように、本実施形態１によるコンピュータは、キーボード１０１と、マウス１０２と、マイクロプロセッサ１０３と、ＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ：ハードディスク装置）１０４と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）１０５と、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）１０６と、グラフィックチップ１０７と、フレームバッファ１０８と、ディスプレイモニタ１０９とを備えている。
【００２４】
入力受付部１は、キーボード１０１およびマウス１０２で実現されている。フローチャート生成部２、呼び出し関係付加部３、条件式データ依存関係付加部４、およびグラフレイアウト決定部５は、それぞれの機能に対応したプログラムが、ＨＤＤ１０４、ＲＡＭ１０５、あるいはＲＯＭ１０６等の記憶領域に格納されており、これらのプログラムをマイクロプロセッサ１０３が実行することによって各機能が実現されている。表示部６は、グラフィックチップ１０７、フレームバッファ１０８およびディスプレイモニタ１０９で実現されている。
【００２５】
次に、有向グラフおよびフローグラフのデータについて説明する。なお、説明の簡単のため、以下では具体例を用いて説明する。
【００２６】
図３は、本発明の実施形態１による解析対象プログラムの一例を示す図である。また、図４は、本実施形態１によるプログラム解析装置が図３に示す解析対象プログラムを解析して出力したフローグラフの一例を示す図である。また、図５は、図４に示すフローグラフに対応するデータの一例を示す図である。以下、図５を用いてフローチャート生成部２、呼び出し関係付加部３、条件式データ依存関係付加部４、およびグラフレイアウト決定部５のそれぞれが取り扱うデータの内容を説明する。
【００２７】
図５に示すように、図４に示すフローグラフ（有向グラフ）に含まれる節点の１つが、図３に示す解析対象プログラムにおける１つの行に対応している。「節点ＩＤ」は、有向グラフの節点に固有の識別子である。有向グラフの各節点は図３のプログラム中のいずれか１つの文に対応しており、「ステートメント」は、各節点に対応するプログラム文の内容を示している。「節点種別」は、有向グラフの節点に対応するプログラム中の文がフローチャートにおける図的表現のいずれの種類に該当するのかを示している。「制御辺接続先ＩＤ」は、ある節点と制御辺で接続する接続先の節点の節点ＩＤを示し、「条件成立時制御辺接続先ＩＤ」は、「節点種別」が条件分岐処理である場合に、当該条件分岐処理に付随する条件式の成立時に条件分岐処理に対応する節点と制御辺で接続する接続先の節点ＩＤを示し、「条件不成立時制御辺接続先ＩＤ」は、「節点種別」が条件分岐処理である場合に、当該条件分岐処理に付随する条件式の不成立時に条件分岐処理に対応する節点と制御辺で接続する接続先の節点ＩＤを示している。「呼び出し辺接続先ＩＤ」は、「節点種別」が定義済み処理である場合に、当該定義済み処理に対応する節点と呼び出し辺で接続する接続先の節点ＩＤを示し、「データ依存辺接続先ＩＤ」は、変数の値を変更する節点とデータ依存辺で接続する接続先である変数の値を参照する節点の節点ＩＤを示している。
【００２８】
図６，７は、本実施形態１によるグラフレイアウト決定部５が図４に示すフローグラフを作成する際における図的表現のレイアウトに関するデータの一例を示す図である。以下、図６，７を用いてグラフレイアウト決定部５および表示部６が取り扱うデータの内容を説明する。
【００２９】
図６は、フローグラフの節点のレイアウトに関するデータの一例を示す図である。図６に示す１つの行は、フローグラフに含まれる節点の１つに対応している。図６において、「節点種別」は図５に示す「節点種別」と同じであり、各節点を出力する際には図８に例示されるような「接点種別」と「図形」との対応関係に従って、フローグラフに用いられる図形が定まる。また、図６において、「ラベル」は各節点を出力する際に当該節点に対応する図形の内部又は近傍に表示する文字列を示し、「座標」は各節点の座標位置を示している。
【００３０】
図７は、フローグラフの辺のレイアウトに関するデータの一例を示す図である。図７に示す１つの行は、フローグラフに含まれる辺の１つに対応する。図７において、「辺種別」は各辺が制御辺、呼び出し辺、またはデータ依存辺のいずれであるかを示しており、各辺を出力する際には図９に例示されるような「辺種別」と「図形」との対応関係に従ってフローグラフに用いられる図形が定まる。また、図７において、「始点座標」は辺の始点の座標位置を示し、「終点座標」は辺の終点の座標位置を示している。
【００３１】
次に、本実施形態１によるプログラム解析装置１００の動作について説明する。説明の簡単のため、以下では、図３に示す解析対象プログラムをユーザが解析対象として指定したものとする。
【００３２】
入力受付部１からユーザによる所定の動作で解析対象プログラムが指定されると、フローチャート生成部２に対して解析対象プログラムを解析するよう指示される。フローチャート生成部２は、図３に示すプログラムのコードをＨＤＤ１０４、ＲＡＭ１０５、またはＲＯＭ１０６等の記憶領域から読み込み、図３に示す解析対象プログラムに対応するフローチャートを表す有向グラフのデータを作成する。
【００３３】
図１０は、本実施形態１によるフローチャート生成部２が図３に示す解析対象プログラムを解析して作成した有向グラフのデータの一例を示す図である。また、図１１は、図１０に示すデータに対応する有向グラフの一例を示す図である。フローチャート生成部２は、解析対象プログラムを解析して、図１０に示されるデータの「節点ＩＤ」、「ステートメント」、「節点種別」、「制御辺接続先ＩＤ」、「条件成立時制御辺接続先ＩＤ」、および「条件不成立時制御辺接続先ＩＤ」の各々に値を記録する。
【００３４】
図１２は、本実施形態１によるフローチャート生成部２における図１０に示すデータの記録動作を示すフローチャートである。以下、図１２に示すフローチャートを参照して、フローチャート生成部２の動作を詳細に説明する。フローチャート生成部２は、解析対象プログラムの先頭から終端までの文を１つずつ順に読み込んで、図１２に示す動作を行う。
【００３５】
まず、解析対象プログラムの次の文を読み込む（ステップＳ１２０１）。以下、ステップＳ１２０１にて読み込んだプログラム文をｓとする。なお、解析対象プログラムを初めて読み込んだときは、上記「次の文」を「先頭の文」に置き換えるものとする。
【００３６】
次に、プログラム文ｓに対応する節点のデータとして、プログラム文ｓに固有のＩＤを「節点ＩＤ」に記録し、プログラム文ｓの内容を「ステートメント」に記録し、次に（次回）読み込むプログラム文に割り当てられる節点ＩＤを「制御辺接続先ＩＤ」に記録する（ステップＳ１２０２）。
【００３７】
ステップＳ１２０２の後、プログラム文ｓの種類（種別）を判定する（ステップＳ１２０３）。プログラム文ｓが条件分岐文である場合はステップＳ１２０４へ進む。また、プログラム文ｓが繰り返し文である場合はステップＳ１２１１へ進む。また、プログラム文ｓがサブルーチンの呼び出し文である場合はステップＳ１２１６へ進む。また、プログラム文ｓがサブルーチンの入り口である場合はステップＳ１２１７へ進む。また、プログラム文ｓがサブルーチンの出口である場合はステップＳ１２１８へ進む。また、上記のいずれのプログラム文でない場合はステップＳ１２１９へ進む。
【００３８】
プログラム文ｓが条件分岐文である場合において、プログラム文ｓの「節点種別」に「条件分岐処理」を記録し、プログラム文ｓの「制御辺接続先ＩＤ」を削除する。また、プログラム文ｓの「条件式成立時制御辺接続先ＩＤ」として、次に読み込む文に割り当てられる節点ＩＤを記録する（ステップＳ１２０４）。ステップＳ１２０４の後、条件成立時における処理の終端までプログラム文ｓを読み込んだか判定する（ステップＳ１２０５）。まだ読み込んでいないプログラム文ｓがある場合はステップＳ１２０６へ進む。それ以外の場合（処理の終端までプログラム文ｓを読み込んだ場合）はステップＳ１２０７へ進む。ステップＳ１２０４にてまだ読み込んでいないプログラム文ｓがあると判定されると、図１２に示すフローチャートの処理を呼び出し、条件成立時における処理の終端までプログラム文ｓを読み込んで処理を行う（ステップＳ１２０６）。
【００３９】
ステップＳ１２０５にて処理の終端までプログラム文ｓを読み込んだと判定されると、プログラム文ｓの「条件不成立時制御辺接続先ＩＤ」として、次に読み込むプログラム文ｓに割り当てられる節点ＩＤを記録する（ステップＳ１２０７）。
【００４０】
ステップＳ１２０７の後、条件不成立時における処理の終端までプログラム文ｓを読み込んだか判定する（ステップＳ１２０８）。まだ読み込んでいないプログラム文ｓがある場合はステップＳ１２０９へ進む。それ以外の場合（処理の終端までプログラム文ｓを読み込んだ場合）はステップＳ１２１０へ進む。ステップＳ１２０８にてまだ読み込んでいないプログラム文ｓがあると判定されると、図１２に示すフローチャートの処理を呼び出し、条件不成立時における処理の終端までプログラム文ｓを読み込んで処理を行う（ステップＳ１２０９）。
【００４１】
ステップＳ１２０８にて、条件不成立時における処理の終端までプログラム文ｓを読み込んだと判定されると、条件成立時の処理に対応する節点の系列の末尾である節点の「制御辺接続先ＩＤ」として、次に読み込むプログラム文ｓに割り当てられる節点ＩＤを記録する（ステップＳ１２１０）。
【００４２】
プログラム文ｓが繰り返し文である場合において、プログラム文ｓの「節点種別」に「繰り返し処理」を記録し、プログラム文ｓの「制御辺接続先ＩＤ」を削除する。また、プログラム文ｓの「条件式成立時制御辺接続先ＩＤ」として、次に読み込むプログラム文ｓに割り当てられる節点ＩＤを記録する（ステップＳ１２１１）。ステップＳ１２１１の後、条件成立時における処理の終端まで読み込んだか判定する（ステップＳ１２１２）。まだ読み込んでいないプログラム文ｓがある場合はステップＳ１２１３へ進む。それ以外の場合（処理の終端までプログラム文ｓを読み込んだ場合）はステップＳ１２１４へ進む。ステップＳ１２１２にてまだ読み込んでいないプログラム文ｓがあると判定されると、図１２に示すフローチャートの処理を呼び出し、条件成立時における処理の終端までプログラム文ｓを読み込んで処理を行う（ステップＳ１２１３）。
【００４３】
ステップＳ１２１２にて処理の終端までプログラム文ｓを読み込んだと判定されると、プログラム文ｓの「条件不成立時制御辺接続先ＩＤ」として、次に読み込むプログラム文ｓに割り当てられる節点ＩＤを記録する（ステップＳ１２１４）。
【００４４】
ステップＳ１２１４の後、条件成立時の処理に対応する節点の系列の末尾である節点の「制御辺接続先ＩＤ」として、次に読み込むプログラム文ｓに割り当てられる節点ＩＤを記録する（ステップＳ１２１５）。
【００４５】
プログラム文ｓがサブルーチンの呼び出し文である場合において、プログラム文ｓの「節点種別」に「定義済み処理」を記録する（ステップＳ１２１６）。
【００４６】
プログラム文ｓがサブルーチンの入り口である場合において、プログラム文ｓの「節点種別」に「入り口」を記録する（ステップＳ１２１７）。
【００４７】
プログラム文ｓがサブルーチンの出口である場合において、プログラム文ｓの「節点種別」に「出口」を記録する（ステップＳ１２１８）。
【００４８】
プログラム文ｓが上記のいずれのプログラム文でない場合において、プログラム文ｓの「節点種別」に「処理」を記録する（ステップＳ１２１９）。
【００４９】
次に、呼び出し関係付加部３の動作について説明する。呼び出し関係付加部３は、フローチャート生成部２が作成したデータ（例えば、図１０参照）に含まれる「節点種別」が「定義済み処理」である全ての節点について、呼び出し先のサブルーチンの入り口に対応する節点の節点ＩＤを「呼び出し辺接続先ＩＤ」に記録する。図１３は、本実施形態１による呼び出し関係付加部３が図１０に示すデータに基づいて作成した有向グラフのデータの一例を示す図である。また、図１４は、図１３に示すデータに対応する有向グラフの一例を示す図である。
【００５０】
次に、条件式データ依存関係付加部４の動作について説明する。条件式データ依存関係付加部４は、呼び出し関係付加部３が作成したデータ（例えば、図１３参照）に含まれる「節点種別」が「条件分岐処理」である節点ｎのそれぞれについて、以下に説明する動作を行う。以下の説明では、節点ｎのステートメントの条件式が参照する変数の集合をＲｎとし、節点ｎの節点ＩＤと集合Ｒｎとの組を要素とする集合をＴとする。また、制御辺接続先ＩＤ、条件成立時制御辺接続先ＩＤ、または条件不成立時制御辺接続先ＩＤが節点ｎの節点ＩＤである節点ｍの集合をＭと記す。条件式データ依存関係付加部４は、集合Ｍ中の節点ｍのそれぞれについて、図１５に示すフローチャートの通りの動作を行う。以下、図１５のフローチャートを参照して、条件式データ依存関係付加部４が節点ｍを処理する動作について詳細に説明する。
【００５１】
まず、節点ｍの「節点種別」を判定する（ステップＳ１５０１）。節点ｍの「節点種別」が「処理」である場合はステップＳ１５０２へ進む。また、節点ｍの「節点種別」が「条件分岐処理」である場合はステップＳ１５０８へ進む。また、節点ｍの「節点種別」が「入り口」である場合はステップＳ１５１０へ進む。また、節点ｍの「節点種別」が「定義済み処理」である場合はステップＳ１５１４へ進む。また、上記のいずれでもない場合は、呼び出し元へ戻る。
【００５２】
節点ｍの「節点種別」が「処理」である場合において、節点ｍのステートメント中で値を設定する変数の集合Ｗｍを作成する（ステップＳ１５０２）。ステップＳ１５０２の後、集合Ｗｍが空でないか（集合Ｗｍが存在するか否か）判定する（ステップＳ１５０３）。ステップＳ１５０３にて集合Ｗｍが空でない場合と判定されるとステップＳ１５０４へ進む。それ以外の場合（集合Ｗｍが空である場合）はステップＳ１５０８へ進む。ステップＳ１５０３にて集合Ｗｍが空でないと判定されると、集合Ｔの要素で、集合Ｗｍ中のいずれかの変数を含む集合Ｒｘのそれぞれについて、次の処理を行う。すなわち、集合Ｒｘ中の全ての節点ｘについて、節点ｍのデータ依存辺接続先ＩＤに節点ｘの節点ＩＤを記録し、集合Ｒｘから集合Ｗｍと共通する要素を取り除く処理を行う（ステップＳ１５０４）。
【００５３】
ステップＳ１５０４の後、節点ｍのステートメント中で値を参照する変数の集合Ｒｍを作成する（ステップＳ１５０５）。ステップＳ１５０５の後、集合Ｒｍが空でないか（集合Ｒｍが存在するか否か）判定する（ステップＳ１５０６）。ステップＳ１５０６にて集合Ｒｍが空でないと判定されるとステップＳ１５０７へ進む。それ以外の場合（集合Ｒｍが空である場合）はステップＳ１５０８へ進む。ステップＳ１５０６にて集合Ｒｍが空でないと判定されると、節点ｍの節点ＩＤと集合Ｒｍの組を集合Ｔに追加する（ステップＳ１５０７）。
【００５４】
節点ｍの「節点種別」が「条件分岐処理」である場合において、制御辺接続先ＩＤ、条件成立時制御辺接続先ＩＤ、または条件不成立時制御辺接続先ＩＤが、節点ｍの節点ＩＤである節点の集合Ｈを作成する（ステップＳ１５０８）。ステップＳ１５０８の後、集合Ｈ中の各節点をｍとして、図１５に示すフローチャートの処理を呼び出して順次処理を行う（ステップＳ１５０９）。
【００５５】
節点ｍの「節点種別」が「入り口」である場合において、呼び出し辺接続先ＩＤが節点ｍの節点ＩＤである節点の集合Ｐを作成する（ステップＳ１５１０）。ステップＳ１５１０の後、集合Ｐが空でないか（集合Ｐが存在するか否か）判定する（ステップＳ１５１１）。ステップＳ１５１１にて集合Ｐが空でないと判定されるとステップＳ１５１２へ進む。それ以外の場合（集合Ｐが空である場合）は、呼び出し元へ戻る。ステップＳ１５１１にて集合Ｐが空でないと判定されると、制御辺接続先ＩＤ、条件成立時制御辺接続先ＩＤ、または条件不成立時制御辺接続先ＩＤが、集合Ｐ中のいずれかの節点の節点ＩＤである節点の集合Ｑを作成する（ステップＳ１５１２）。ステップＳ１５１２の後、集合Ｑ中の各節点をｍとして、図１５に示すフローチャートの処理を呼び出して順次処理を行う（ステップＳ１５１３）。
【００５６】
節点ｍの「節点種別」が「定義済み処理」である場合において、節点ＩＤが節点ｍの呼び出し辺接続先ＩＤである節点から制御辺を辿って、「節点種別」が出口である節点ｅを取得する（ステップＳ１５１４）。ステップＳ１５１４の後、制御辺接続先ＩＤ、条件成立時制御辺接続先ＩＤ、または条件不成立時制御辺接続先ＩＤが節点ｅの節点ＩＤである節点の集合Ｋを作成する（ステップＳ１５１５）。ステップＳ１５１５の後、集合Ｋ中の各節点をｍとして、図１５に示すフローチャートの処理を呼び出して順次処理を行う（ステップＳ１５１６）。
【００５７】
次に、グラフレイアウト決定部５の動作について説明する。グラフレイアウト決定部５は、条件式データ依存関係付加部４が作成したデータ（例えば、図５参照）に含まれる全ての節点および辺についてディスプレイモニタ１０９上での座標位置を決定し、図６に示すデータの「座標」、および図７に示すデータの「始点座標」と「終点座標」に記録する。また、グラフレイアウト決定部５は、各節点の内部または近傍に出力する文字列を「ステートメント」から抜き出して図６に示すデータの「ラベル」に記録する。
【００５８】
次に、表示部６の動作について説明する。表示部６は、グラフレイアウト決定部５が作成した２つのデータ（図６，７に示すデータ）をディスプレイモニタ１０９に出力する。図４は、表示部６が図６，７に示すデータをディスプレイモニタ１０９に出力した際の表示画面の一例を示す図である。
【００５９】
以上のことから、本実施形態１によるプログラム解析装置１００は、解析対象プログラムに含まれる条件分岐処理や繰り返し処理の条件式と、当該条件式で参照される変数の値を決定する処理とを抽出し、これら２つの処理に対応する２つの節点をデータ依存辺で接続することを再帰的に繰り返して、解析対象プログラム中で条件式が参照する変数の値の決定に影響する全ての処理を抽出する条件式データ依存関係付加部４を備えているため、プログラム解析装置１００から出力される図的表現を見ることによって、解析対象プログラムの制御フローをユーザが解析する際の作業の効率を向上させることができる。すなわち、多数のサブルーチンを含む大規模なプログラムを解析する際の作業の効率を向上させることが可能となる。
【００６０】
〈実施形態２〉
図１６は、本発明の実施形態２によるプログラム解析装置２００の構成を示すブロック図である。
【００６１】
図１６に示すように、本実施形態２によるプログラム解析装置２００は、制御フロー非影響部分抽出部７を備えることを特徴としている。その他の構成は、実施形態１と同様であるため、ここでは説明を省略する。
【００６２】
入力受付部１は、ユーザから解析対象プログラムおよびサブルーチンの指定を受け付けて、フローチャート生成部２に対して解析対象プログラムを指定し、制御フロー非影響部分抽出部７に対して解析対象のサブルーチン（以下、解析対象サブルーチンとも称する）を指定する。
【００６３】
制御フロー非影響部分抽出部７は、入力受付部１から解析対象サブルーチンを指定され、かつ条件式データ依存関係付加部４がフローグラフを作成すると、当該フローグラフのうちで解析対象サブルーチンに対応する部分グラフ中の節点から制御辺または呼び出し辺を順方向に辿って到達可能なサブルーチンに対応する全ての部分グラフ（以下、下流部分グラフ集合とも称する）を抽出し、下流部分グラフ集合中の各部分グラフ（以下、下流部分グラフとも称する）について、下流部分グラフ中の部分グラフであり、かつ当該部分グラフ内から外部へ出るデータ依存辺が存在しない最大のもの（以下、非影響部分グラフとも称する）を抽出して非影響部分グラフのデータを作成する。すなわち、制御フロー非影響部分抽出部７は、入力受付部１にて解析対象プログラムとともに指定された解析対象サブルーチンと、条件式データ依存関係付加部４にて生成されたフローグラフ（有向グラフ）のデータとに基づいて、解析対象サブルーチンに関連するサブルーチンのうちのデータ依存辺を含まず条件式に影響しない非影響部分グラフ（非影響サブルーチン）を抽出し、当該非影響部分グラフのデータを生成する。
【００６４】
グラフレイアウト決定部５は、条件式データ依存関係付加部４が作成したフローグラフのデータと、制御フロー非影響部分抽出部７が作成した非影響部分グラフのデータとを組み合わせて出力する際の節点および辺のレイアウトを決定してレイアウトデータを作成する。すなわち、グラフレイアウト決定部は、条件式データ依存関係付加部４にて生成されたフローグラフ（有向グラフ）のデータと、制御フロー非影響部分抽出部７にて生成された非影響部分グラフ（非影響サブルーチン）のデータとに基づいて、記非影響部分グラフを除くフローグラフ（フローチャート）のレイアウトデータを生成する。その他の構成は実施形態１と同様であるため、ここでは説明を省略する。
【００６５】
本実施形態２のプログラム解析装置２００を実現するためのコンピュータのハードウェアの構成は、実施形態１と同じである（図２参照）。制御フロー非影響部分抽出部７は、その機能に対応したプログラムが、ＨＤＤ１０４、ＲＡＭ１０５、またはＲＯＭ１０６等の記憶領域に格納されており、このプログラムをマイクロプロセッサ１０３が実行することによって制御フロー非影響部分抽出部７の機能が実現されている。その他の各機能の実現方法は、実施形態１と同様であるため、ここでは説明を省略する。
【００６６】
次に、非影響部分グラフのデータについて説明する。なお、説明の簡単のため、以下では具体例を用いて説明する。また、本実施形態２では、解析対象プログラムの一例として図３に示すプログラムを使用するものとして説明する。
【００６７】
図１７は、本実施形態２によるプログラム解析装置２００が、ユーザから図３に示す解析対象プログラムおよびサブルーチンＳｕｂｒｏｕｔｉｎｅ＿Ａ（）を指定された際に出力するフローグラフの一例を示す図である。また、図１８は、制御フロー非影響部分抽出部７が図３に示す解析対象プログラムを解析して作成した非影響部分グラフのデータの一例を示す図である。以下、図１８を用いて制御フロー非影響部分抽出部７およびグラフレイアウト決定部５が取り扱うデータの内容を説明する。図１８において、有向グラフに含まれる節点の１つが図３に示す解析対象プログラムにおける１つの行に対応している。また、「節点ＩＤ」は図５に示す「節点ＩＤ」と同じである。図１８に示すように、「制御フロー非影響節点」の項目には、サブルーチンＳｕｂｒｏｕｔｉｎｅ＿Ａ（）の非影響部分グラフに含まれる節点については「Ｙｅｓ」が記録され、それ以外の節点については「Ｎｏ」が記録される。
【００６８】
次に、本実施形態２によるプログラム解析装置２００の動作について説明する。
【００６９】
入力受付部１からユーザによる所定の動作で解析対象プログラムおよび解析対象サブルーチンが指定されると、フローチャート生成部２に対して解析対象プログラムを解析するよう指示され、制御フロー非影響部分抽出部７に対して解析対象サブルーチンの識別子が入力される。説明の簡単のため、以下では、図３に示す解析対象プログラムおよびサブルーチンＳｕｂｒｏｕｔｉｎｅ＿Ａ（）をユーザが解析対象として指定したものとする。フローチャート生成部２、呼び出し関係付加部３、および条件式データ依存関係付加部４は、実施形態１と同じ動作をする。
【００７０】
次に、制御フロー非影響部分抽出部７の動作について説明する。
【００７１】
図１９および図２０は、本実施形態２による制御フロー非影響部分抽出部７の動作を示すフローチャートである。以下、図１９および図２０に示すフローチャートを参照して、制御フロー非影響部分抽出部７の動作について詳細に説明する。なお、サブルーチンＳｕｂｒｏｕｔｉｎｅ＿Ａ（）を実行する際にサブルーチンＳｕｂｒｏｕｔｉｎｅ＿Ａ（）から直接呼び出されるサブルーチンの入り口節点の集合をＣとする。また、集合Ｃ中の１つの節点ｃおよび節点ｃから制御辺または呼び出し辺を辿って到達できる節点の集合Ｄｃと記し、集合Ｄｃによって表されるグラフをサブルーチンＳｕｂｒｏｕｔｉｎｅ＿Ａ（）の下流部分グラフとする。さらに、サブルーチンＳｕｂｒｏｕｔｉｎｅ＿Ａ（）の全ての下流部分グラフからなる集合をＥとする。
【００７２】
図１９に示すように、まず、非影響部分グラフのデータ（図１８参照）の各行に対して、フローグラフのデータ（図5参照）に記録されている節点ＩＤを転記する（ステップＳ１９０１）。ステップＳ１９０１の後、非影響部分グラフのデータの各行における「制御フロー非影響節点」の項目に「Ｎｏ」を記録する（ステップＳ１９０２）。ステップＳ１９０２の後、サブルーチンＳｕｂｒｏｕｔｉｎｅ＿Ａ（）の入り口に対応する節点ｆを、フローグラフのデータから取得する（ステップＳ１９０３）。ステップＳ１９０３の後、節点ｆから制御辺を辿って到達できる節点で、かつ「節点種別」が「定義済み処理」である節点の呼び出し辺接続先ＩＤの集合Ｃを作成する（ステップＳ１９０４）。ステップＳ１９０４の後、集合Ｃ中の各節点ｃについて、節点ｃおよび節点ｃから制御辺または呼び出し辺を辿って到達できる節点の節点ＩＤの集合Ｄｃを作成して、下流部分グラフの集合Ｅに追加する（ステップＳ１９０５）。
【００７３】
次に、制御フロー非影響部分抽出部７は、集合Ｅの各要素Ｄｘについて、集合Ｅの内容が変化しなくなるまで図２０に示すフローチャートを繰り返し実行する。
【００７４】
図２０に示すように、まず、集合Ｄｘ中の節点で、集合Ｄｘに含まれない節点が接続先であるデータ依存辺を持つ節点の集合Ｌｘを作成する（ステップＳ２００１）。ステップＳ２００１の後、集合Ｌｘ中の節点から制御辺または呼び出し辺を辿って到達できる節点を、集合Ｄｘから削除する（ステップＳ２００２）。ステップＳ２００２の後、集合Ｌｘ中の節点から制御辺または呼び出し辺を１つだけ辿って到達できる節点の集合Ｇｘを作成する（ステップＳ２００３）。ステップＳ２００３の後、集合Ｇｘ中の節点ｇから制御辺または呼び出し辺を辿って到達できる節点の集合Ｄｇを作成する（ステップＳ２００４）。ステップＳ２００４の後、集合Ｄｇを下流部分グラフの集合Ｅへ追加する（ステップＳ２００５）。
【００７５】
以上の処理が完了した時点での集合Ｅは、サブルーチンＳｕｂｒｏｕｔｉｎｅ＿Ａ（）における全ての非影響部分グラフの集合である。制御フロー非影響部分抽出部７は、集合Ｅ中の各節点について、図１８に示すデータの「制御フロー非影響節点」の項目に「Ｙｅｓ」を記録する。上記の処理を行うことによって、制御フロー非影響部分グラフのデータ（図１８参照）の作成が完了する。
【００７６】
グラフレイアウト決定部５は、条件式データ依存関係付加部４が作成したフローグラフのデータ（図５参照）と、制御フロー非影響部分抽出部７が作成した非影響部分グラフのデータ（図１８参照）とを照合し、非影響部分グラフのデータにおける「制御フロー非影響節点」の項目に「Ｙｅｓ」が記録されている節点ＩＤの節点のデータをフローグラフのデータから消去する。次に、グラフレイアウト決定部５は、フローグラフのデータ中の呼び出し辺接続先ＩＤとして、フローグラフからグラフレイアウト決定部５が消去したいずれかの節点の節点ＩＤが記録されている全ての項目から当該節点ＩＤを消去する。図２１は、この時点でのフローグラフのデータを例示する図である。次に、グラフレイアウト決定部５は、実施形態１と同じ動作をする。また、表示部６も、実施形態１と同じ動作をする。
【００７７】
以上のことから、本実施形態２によるプログラム解析装置２００は、実施形態１による効果に加えて、解析対象サブルーチンの制御フローの決まり方に影響しない下流のサブルーチン呼び出しがディスプレイモニタ１０９に表示されないため、プログラム解析装置２００から出力される図的表現を見ることによって、解析対象プログラムの制御フローをユーザが解析する際の作業の効率をさらに向上させることができるという顕著な効果を奏する。すなわち、多数のサブルーチンを含む大規模なプログラムを解析する際の作業の効率を実施形態１よりもさらに向上させることが可能となる。
【００７８】
なお、説明の簡単のため、本実施形態２では、グラフレイアウト決定部５が非影響部分グラフ中の節点を消去する例について説明したが、節点を消去せずに、非影響部分グラフの画面上での表示色を薄い色にする、非影響部分グラフの画面上での大きさを小さくする、あるいは非影響部分グラフを非影響部分グラフ中の節点よりも少ない数の節点に置き換えるなどの方法によっても、上記と同様の効果を奏することは言うまでもない。
【００７９】
〈実施形態３〉
図２２は、本発明の実施形態３によるプログラム解析装置３００の構成を示すブロック図である。
【００８０】
図２２に示すように、プログラム解析装置３００は、コールグラフ変換部８を備えることを特徴としている。その他の構成は、実施形態１と同様であるため、ここでは説明を省略する。
【００８１】
コールグラフ変換部８は、条件式データ依存関係付加部４が作成したフローグラフ中の節点を当該節点のステートメントを含むサブルーチンごとに１つの節点（以下、代表節点とも称する）にまとめて、代表節点にまとめる前の節点が始点または終点になっていた全ての呼び出し辺とデータ依存辺を代表節点と接続するように移動（変更）させた後、代表節点のみを記録した有向グラフ（以下、コールグラフとも称する）のデータを作成する。すなわち、コールグラフ変換部８は、条件式データ依存関係付加部４にて生成されたフローグラフ（有向グラフ）のデータに基づいて、各サブルーチンをそれぞれまとめて代表節点とし、フローグラフのデータを、代表節点と当該代表節点間を接続する呼び出し辺およびデータ依存辺とを含むコールグラフのデータに変換して生成する。
【００８２】
グラフレイアウト決定部５は、コールグラフ変換部８が作成したコールグラフを出力する際の節点および辺のレイアウトを決定してコールグラフのレイアウトデータを作成する。
【００８３】
本実施形態３のプログラム解析装置３００を実現するためのコンピュータのハードウェアの構成は、実施形態１と同じである（図２参照）。コールグラフ変換部８は、その機能に対応したプログラムが、ＨＤＤ１０４、ＲＡＭ１０５、またはＲＯＭ１０６等の記憶領域に格納されており、このプログラムをマイクロプロセッサ１０３が実行することによってコールグラフ変換部８の機能が実現されている。その他の各機能の実現方法は、実施形態１と同様であるため、ここでは説明を省略する。
【００８４】
次に、コールグラフのデータについて説明する。なお、説明の簡単のため、以下では具体例を用いて説明する。また、本実施形態３では、解析対象プログラムの一例として図３に示すプログラムを使用するものとして説明する。図２３は、本実施形態３によるプログラム解析装置３００が、ユーザから図３に示す解析対象プログラムを指定された際に出力するコールグラフの一例を示す図である。また、図２４は、コールグラフ変換部８が作成したコールグラフのデータの一例を示す図である。以下、図２４を用いてコールグラフ変換部８およびグラフレイアウト決定部５が取り扱うデータの内容を説明する。図２４において、コールグラフに含まれる節点の１つが図３に示す解析対象プログラムにおける１つの行に対応する。また、「節点ＩＤ」、「ステートメント」、「呼び出し辺接続先ＩＤ」、および「データ依存辺接続先ＩＤ」は、図５に示したものと同じである。
【００８５】
図２５および図２６は、グラフレイアウト決定部５が図２３に示すコールグラフを作成する際におけるコールグラフのレイアウトに関するデータの一例を示す図である。図２５において、「節点種別」は図２７中の「節点種別」と同じであり、各節点を出力する際には図２７に例示される「接点種別」と「図形」との対応関係に従って用いる図形が定まる。
【００８６】
次に、本実施形態３によるプログラム解析装置３００の動作について説明する。
【００８７】
説明の簡単のため、以下では、入力受付部１からユーザによる所定の動作で図３に示す解析対象プログラムをユーザが解析の対象として指定したものとする。入力受付部１、フローチャート生成部２、呼び出し関係付加部３、および条件式データ依存関係付加部４は、実施形態１と同様の動作をするため、ここでは説明を省略する。
【００８８】
次に、コールグラフ変換部８の動作について説明する。
【００８９】
まず、コールグラフ変換部８は、フローグラフのデータ（図５参照）における「節点種別」が「入り口」である節点の集合Ｙを作成する。次に、コールグラフ変換部８は、集合Ｙ中の各節点について、「節点ＩＤ」および「ステートメント」をフローグラフのデータからコールグラフのデータ（図２４参照）に転記する。そして、コールグラフ変換部８は、集合Ｙ中の各節点ｙについて、節点ｙから制御辺を辿って到達でき、かつ節点種別が定義済み処理である節点の呼び出し辺接続先ＩＤの値を、コールグラフのデータにおける節点ｙの呼び出し辺接続先ＩＤに記録する。さらに、コールグラフ変換部８は、フローグラフのデータにおける各データ依存辺ｚについて、図２８に示すフローチャートの処理を実行する。
【００９０】
図２８に示すように、まず、データ依存辺ｚの接続元の節点から制御辺を逆向きに辿って到達でき、かつ「節点種別」が「入り口」である最初の節点ｉを取得する（ステップＳ２８０１）。ステップＳ２８０１の後、データ依存辺ｚの接続先の節点から制御辺を逆向きに辿って到達でき、かつ「節点種別」が「入り口」である最初の節点ｊを取得する（ステップＳ２８０２）。ステップＳ２８０２の後、コールグラフのデータにおける節点ｉのデータ依存辺接続先ＩＤに、節点ｊの節点ＩＤを記録する（ステップＳ２８０３）。
【００９１】
グラフレイアウト決定部５は、コールグラフ変換部８が作成したデータ（図２４参照）に含まれる全ての節点および辺についてディスプレイモニタ１０９上での座標位置を決定して、図２５に示すデータの「座標」、および図２６に示すデータの「始点座標」と「終点座標」に記録する。また、グラフレイアウト決定部５は、各節点の内部または近傍に出力する文字列を「ステートメント」から抜き出して図２５に示すデータの「ラベル」に記録する。表示部６の動作は実施形態１と同じである。図２３は、表示部６が図２５および図２６に示したデータをディスプレイモニタ１０９に出力した際の画面表示の一例を示す図である。
【００９２】
以上のことから、本実施形態３によるプログラム解析装置は、実施形態１による効果に加えて、サブルーチンという粗い粒度の図的表現で解析対象プログラムを見ることができるため、解析対象プログラムの大まかな制御フローをユーザが解析する際の作業の効率をさらに向上させることができるという顕著な効果を奏する。すなわち、多数のサブルーチンを含む大規模なプログラムを解析する際の作業の効率を実施形態１よりもさらに向上させることが可能となる。
【００９３】
〈実施形態４〉
図２９は、本発明の実施形態４によるプログラム解析装置４００の構成を示すブロック図である。図２９に示すように、本実施形態４によるプログラム解析装置４００は、クラス図変換部９を備えることを特徴としている。その他の構成は、実施形態３と同様であるため、ここでは説明を省略する。
【００９４】
クラス図変換部９は、コールグラフ変換部８が作成したコールグラフ中の節点に対応するサブルーチンをメソッドとして含むクラスごとに１つの節点（以下、クラス節点とも称する）にまとめて、クラス節点にまとめる前の節点が始点または終点になっていた全ての呼び出し辺およびデータ依存辺をクラス節点と接続するように移動（変更）させた後、クラス節点のみを記録した有向グラフ（以下、クラス図とも称する）のデータを作成する。すなわち、クラス図変換部９は、コールグラフ変換部８にて生成されたコールグラフのデータに基づいて、各代表節点をそれぞれクラス毎にまとめてクラス節点とし、コールグラフのデータを、クラス節点と当該クラス節点間を接続する呼び出し辺およびデータ依存辺とを含むクラス図のデータに変換して生成する。
【００９５】
グラフレイアウト決定部５は、クラス図変換部９が作成したクラス図のデータを出力する際の節点および辺のレイアウトを決定してクラス図のレイアウトデータを作成する。
【００９６】
本実施形態４のプログラム解析装置４００を実現するためのコンピュータのハードウェアの構成は、実施形態３と同様である。また、クラス図変換部９は、その機能に対応したプログラムが、ハードディスクＨＤＤ１０４、ＲＡＭ１０５、またはＲＯＭ１０６等の記憶領域に格納され、このプログラムをマイクロプロセッサ１０３が実行することでクラス図変換部９の機能が実現されている。その他の各機能の実現方法は、実施形態３と同様であるため、ここでは説明を省略する。
【００９７】
次に、クラス図のデータについて説明する。なお、説明の簡単のため、以下では具体例を用いて説明する。図３０は、本実施形態４による解析対象プログラムの一例を示す図であり、本実施形態４では図３０に示す解析対象プログラムを用いるものとして説明する。
【００９８】
図３１は、本実施形態４によるプログラム解析装置４００が、ユーザから図３０に示す解析対象プログラムを指定された際に出力するクラス図の一例を示す図である。また、図３２は、クラス図変換部９が作成したクラス図のデータの一例を示す図である。以下、図３２を用いてクラス図変換部９およびグラフレイアウト決定部５が取り扱うデータの内容を説明する。図３２において、クラス図に含まれる節点の１つが図３０に示す解析対象プログラムにおける１つの行に対応する。また、「節点ＩＤ」、「呼び出し辺接続先ＩＤ」、および「データ依存辺接続先ＩＤ」は、図５に示したものと同じである。図３２において、「ステートメント」は、コールグラフ変換部８が作成したコールグラフのデータ（図３３は、図３２に対応するコールグラフのデータの一例を示す図である）から、クラス図変換部９が抽出したクラス名である。
【００９９】
図３４および図３５は、グラフレイアウト決定部５が図３１に示すクラス図を作成する際におけるクラス図のレイアウトに関するデータの一例を示す図である。図３４において、「節点種別」は図３６に示す「節点種別」と同じであり、各節点を出力する際には図３６に例示されるような「接点種別」と「図形」との対応関係に従って用いる図形が定まる。
【０１００】
次に、本実施形態４によるプログラム解析装置４００の動作について説明する。
【０１０１】
説明の簡単のため、以下では、入力受付部１からユーザによる所定の動作で図３０に示す解析対象プログラムをユーザが解析の対象として指定したものとする。入力受付部１、フローチャート生成部２、呼び出し関係付加部３、条件式データ依存関係付加部４、およびコールグラフ変換部８は、実施形態３と同様の動作をするため、ここでは説明を省略する。
【０１０２】
図３７は、フローチャート生成部２が図３０に示す解析対象プログラムを解析して作成した有向グラフのデータの一例を示す図である。また、図３８は、呼び出し関係付加部３が図３７に示すデータに基づいて作成した有向グラフのデータの一例を示す図である。また、図３９は、条件式データ依存関係付加部４が図３８に示すデータに基づいて作成したフローグラフのデータの一例を示す図である。そして、図３３は、コールグラフ変換部８が図３９に示すフローグラフのデータに基づいて作成したコールグラフのデータの一例を示す図である。
【０１０３】
次に、クラス図変換部９の動作について説明する。
【０１０４】
まず、クラス図変換部９は、コールグラフのデータ（図３３参照）における節点の「ステートメント」からクラス名を重複がないように収集する。次に、クラス図変換部９は、収集した各クラス名について、クラス図のデータ（図３２参照）の「節点ＩＤ」に新たな節点ＩＤを記録し、「ステートメント」にクラス名を記録する。そして、クラス図変換部９は、コールグラフ中の各呼び出し辺ｕについて、図４０に示すフローチャートの処理を実行する。
【０１０５】
図４０に示すように、まず、呼び出し辺ｕの接続元の節点のクラス名ｃと接続先の節点のクラス名ｄを、コールグラフのデータから取得する（ステップＳ４００１）。ステップＳ４００１の後、クラス図のデータにおけるクラス名ｃに対応する節点の呼び出し辺接続先ＩＤに、クラス名ｄに対応する節点の節点ＩＤを記録する（ステップＳ４００２）。
【０１０６】
また、クラス図変換部９は、コールグラフ中の各データ依存辺ｖについて、図４１に示すフローチャートの処理を実行する。
【０１０７】
図４１に示すように、まず、データ依存辺ｖの接続元の節点のクラス名ｃと接続先の節点のクラス名ｄとを、コールグラフのデータから取得する（ステップＳ４１０１）。ステップＳ４１０１の後、クラス図のデータにおけるクラス名ｃに対応する節点のデータ依存辺接続先ＩＤに、クラス名ｄに対応する節点の節点ＩＤを記録する（ステップＳ４１０２）。
【０１０８】
グラフレイアウト決定部５は、クラス図変換部９が作成したデータ（図３２参照）に含まれる全ての節点および辺についてディスプレイモニタ１０９上での座標位置を決定して図３４に示すデータの「座標」、および図３５に示すデータの「始点座標」と「終点座標」とに記録する。また、グラフレイアウト決定部５は、各節点の内部または近傍に出力する文字列を「ステートメント」から抜き出して図３４に示すデータの「ラベル」に記録する。表示部６の動作は実施形態１と同様である。図３１は、表示部６が図３４および図３５に示すデータをディスプレイモニタ１０９へ出力した際の画面表示の一例を示す図である。
【０１０９】
以上のことから、本実施形態４によるプログラム解析装置４００は、実施形態３による効果に加えて、クラスというさらに粗い粒度の図的表現で解析対象プログラムを見ることができるため、解析対象プログラムが大規模である場合に、その大まかな制御フローをユーザが解析する際の作業の効率を向上させることができるという顕著な効果を奏する。すなわち、多数のサブルーチンを含む大規模なプログラムを解析する際の作業の効率を実施形態３よりもさらに向上させることが可能となる。
【符号の説明】
【０１１０】
１  入力受付部、２  フローチャート生成部、３  呼び出し関係付加部、４  条件式データ依存関係付加部、５  グラフレイアウト決定部、６  表示部、７  制御フロー非影響部分抽出部、８  コールグラフ変換部、９  クラス図変換部、１００  プログラム解析装置、１０１  キーボード、１０２  マウス、１０３  マイクロプロセッサ、１０４  ＨＤＤ、１０５  ＲＡＭ、１０６  ＲＯＭ、１０７  グラフィックチップ、１０８  フレームバッファ、１０９  ディスプレイモニタ、２００  プログラム解析装置、３００  プログラム解析装置、４００  プログラム解析装置。
【図１】
2012164264.tif 000003
【図２】
2012164264.tif 000004
【図３】
2012164264.tif 000005
【図４】
2012164264.tif 000006
【図５】
2012164264.tif 000007
【図６】
2012164264.tif 000008
【図７】
2012164264.tif 000009
【図８】
2012164264.tif 000010
【図９】
2012164264.tif 000011
【図１０】
2012164264.tif 000012
【図１１】
2012164264.tif 000013
【図１２】
2012164264.tif 000014
【図１３】
2012164264.tif 000015
【図１４】
2012164264.tif 000016
【図１５】
2012164264.tif 000017
【図１６】
2012164264.tif 000018
【図１７】
2012164264.tif 000019
【図１８】
2012164264.tif 000020
【図１９】
2012164264.tif 000021
【図２０】
2012164264.tif 000022
【図２１】
2012164264.tif 000023
【図２２】
2012164264.tif 000024
【図２３】
2012164264.tif 000025
【図２４】
2012164264.tif 000026
【図２５】
2012164264.tif 000027
【図２６】
2012164264.tif 000028
【図２７】
2012164264.tif 000029
【図２８】
2012164264.tif 000030
【図２９】
2012164264.tif 000031
【図３０】
2012164264.tif 000032
【図３１】
2012164264.tif 000033
【図３２】
2012164264.tif 000034
【図３３】
2012164264.tif 000035
【図３４】
2012164264.tif 000036
【図３５】
2012164264.tif 000037
【図３６】
2012164264.tif 000038
【図３７】
2012164264.tif 000039
【図３８】
2012164264.tif 000040
【図３９】
2012164264.tif 000041
【図４０】
2012164264.tif 000042
【図４１】
2012164264.tif 000043