(57)【要約】【課題】３層アーキテクチャのアプリケーションにおいて、プログラムの動作不良や脆弱性等の原因箇所を容易に特定するアプリケーションの解析方法を提供する。【解決手段】データベース操作文を含むプログラムを解析する方法であって、プログラム及びプログラムの実行結果に基づいて、プログラムの制御の流れ及びプログラムにおいて用いられるデータを解析する第１の手順と、第１の手順の解析結果及び複数のデータベース操作文の操作内容に応じて、複数のデータベース操作文の間の依存関係を解析する第２の手順と、第１の手順の解析結果及び第２の手順の解析結果に基づいて、プログラム中の不正に動作している所定の箇所を解析始点として、不正動作の伝播経路を、前記制御の流れに対して逆向きに解析する第３の手順と、第３の手順によって求められた伝播経路上のプログラム文を提示する第４の手順と、を含む。【選択図】図１Ａ
2011253363.tif 000002
【特許請求の範囲】
【請求項１】
プログラムを実行するプロセッサと、前記プロセッサによって実行されるプログラムを格納するメモリとを備えた解析システムが、データベース操作文を含むアプリケーションプログラムを解析する方法であって、
前記プロセッサが、前記アプリケーションプログラム及び前記アプリケーションプログラムの実行結果に基づいて、前記アプリケーションプログラムの制御の流れ及び前記アプリケーションプログラムにおいて用いられるデータを解析する第１の手順と、
前記プロセッサが、前記アプリケーションプログラムが複数のデータベース操作文を含む場合に、前記第１の手順の解析結果及び前記複数のデータベース操作文の操作内容に応じて、前記複数のデータベース操作文の間の依存関係を解析する第２の手順と、
前記プロセッサが、前記第１の手順の解析結果及び前記第２の手順の解析結果に基づいて、前記アプリケーションプログラム中の不正に動作している所定の箇所を解析始点として、当該不正動作の伝播経路を、前記制御の流れに対して逆向きに解析する第３の手順と、
前記プロセッサが、前記第３の手順によって求められた前記伝播経路上のプログラム文を提示する第４の手順と、
を含むことを特徴とするアプリケーションプログラムの解析方法。
【請求項２】
前記第３の手順は、
前記プロセッサが、前記第３の手順によって求められた伝播経路上のプログラム文から、非提示とすべきプログラム文を除くことによって、提示すべきプログラム文を限定する手順を含むことを特徴とする請求項１に記載のアプリケーションプログラムの解析方法。
【請求項３】
前記第４の手順において、前記プロセッサは、前記第３の手順によって求められた前記伝播経路上のプログラム文の実行経路を表すパス集合を提示することを特徴とする請求項１に記載のアプリケーションプログラムの解析方法。
【請求項４】
前記第４の手順において、前記プロセッサは、前記第３の手順によって求められた前記伝播経路上のプログラム文を、当該アプリケーションプログラムのプログラム構造と対応付けて提示することを特徴とする請求項１に記載のアプリケーションプログラムの解析方法。
【請求項５】
前記第２の手順と前記第３の手順との間に、
前記プロセッサが、ユーザによって指示された箇所を、前記解析始点として設定する手順を含むことを特徴とする請求項１に記載のアプリケーションプログラムの解析方法。
【請求項６】
前記第２の手順と前記第３の手順との間に、
前記プロセッサが、前記アプリケーションプログラムの実行中に例外処理が発生した箇所を、前記解析始点として設定する手順を含むことを特徴とする請求項１に記載のアプリケーションプログラムの解析方法。
【請求項７】
プログラムを実行するプロセッサと、前記プロセッサによって実行されるプログラムを格納するメモリとを備え、データベース操作文を含むアプリケーションプログラムを解析する解析システムであって、
前記プロセッサは、
前記アプリケーションプログラム及び前記アプリケーションプログラムの実行結果に基づいて、前記アプリケーションプログラムの制御の流れ及び前記アプリケーションプログラムにおいて用いられるデータを解析し、
前記アプリケーションプログラムが複数のデータベース操作文を含む場合に、前記アプリケーションプログラムに関する解析結果及び前記複数のデータベース操作文の操作内容に応じて、前記複数のデータベース操作文の間の依存関係を解析し、
前記アプリケーションプログラムに関する解析結果及び前記データベース操作文に関する解析結果に基づいて、前記アプリケーションプログラム中の不正に動作している所定の箇所を解析始点として、当該不正動作の伝播経路を、前記制御の流れに対して逆向きに解析し、
前記伝播経路上のプログラム文を提示することを特徴とする解析システム。
【請求項８】
プログラムを実行するプロセッサと、前記プロセッサによって実行されるプログラムを格納するメモリとを備え、データベース操作文を含むアプリケーションプログラムを解析する解析システムに用いられる解析プログラムであって、
前記アプリケーションプログラム及び前記アプリケーションプログラムの実行結果に基づいて、前記アプリケーションプログラムの制御の流れ及び前記アプリケーションプログラムにおいて用いられるデータを解析する第１の手順と、
前記アプリケーションプログラムが複数のデータベース操作文を含む場合に、前記第１の手順の解析結果及び前記複数のデータベース操作文の操作内容に応じて、前記複数のデータベース操作文の間の依存関係を解析する第２の手順と、
前記第１の手順の解析結果及び前記第２の手順の解析結果に基づいて、前記アプリケーションプログラム中の不正に動作している所定の箇所を解析始点として、当該不正動作の伝播経路を、前記制御の流れに対して逆向きに解析する第３の手順と、
前記第３の手順によって求められた前記伝播経路上のプログラム文を提示する第４の手順と、
を前記解析システムに実行させることを特徴とする解析プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、アプリケーションの解析方法に関し、特に、３層アーキテクチャのＷｅｂアプリケーションにおいて、プログラムの不正動作の要因を特定するための方法に関する。
【背景技術】
【０００２】
Ｗｅｂシステムにおけるアプリケーションの実装方式として、Ｗｅｂ層、ロジック層、データベース層の３層でアプリケーションを構成する３層アーキテクチャが広く普及している。３層アーキテクチャでは、ユーザインターフェースの提示、入力に対するアクション、アクションに対応するデータ操作の一連の組をサービスとして実現する。一般に、各種のＷｅｂシステムは、このようなサービスを複数組み合わせることによって構成される。
【０００３】
近年、プログラムの大規模化・複雑化が進んでおり、上記３層アーキテクチャのうちのロジック層のプログラムが複雑化している。一方、頻繁な仕様変更、工数削減、開発／保守の迅速化等の理由から、プログラム仕様が実際のプログラムと合致しないケースやプログラム仕様自体が作成されないケースが多々存在する。この結果、プログラムの開発においてデバッグや保守に要する時間が増加する事態が生じる。
【０００４】
このような事態を回避するため、従来、プログラムのソースコードに基づいてプログラム仕様を理解し、その内容に応じて修正案を作成していた。また、プログラム仕様の理解を支援するために、プログラムの静的解析結果に基づいてプログラム内の手続きの呼出し関係（コールグラフ）を出力するソースコード解析ツール、手続きの動的な呼出し関係を出力するプログラムトレースツール、ソースレベルデバッガによるプログラムの対話的な実行トレース等の手段が用いられていた（非特許文献１参照）。
【０００５】
一般に、プログラムの動作不良は、プログラム内の制御ロジックの誤りによって生じる制御の流れの誤り、又は、プログラム内の計算ロジックの誤りによって生じるデータ値の不正として顕在化する。そこで、前者については、ソースコード解析ツールやプログラムトレースツールを用いてプログラムの制御の流れを確認し、実際の動作が期待される動作と合致するか否かを確認することによって検証できる。一方、後者については、ソースコードデバッガを用いてプログラムの実行を各実行時点で停止させ、変数等の値を確認することによって検証できる。
【０００６】
上記３層アーキテクチャによって実現されるサービスでは、ソースレベルデバッガを用いることによって、ロジック層のプログラムソースコードを対話的に確認することができる。一方、データベース層のプログラムの処理については、一般に、ロジック層のアプリケーションがデータベース層のアプリケーションに対して、データベース処理言語であるＳＱＬで記述したコマンドを発行することによって実現できる。
【０００７】
ここで、ロジック層のアプリケーションによって発行されるＳＱＬコマンドは、ロジック層のプログラムにおいて、文字列データとして扱われ動的に構築される。そこで、ロジック層のプログラムの実行に伴ってどのようなＳＱＬ文が実行されるか及びロジック層のプログラムの実行過程を理解し、プログラムトレース又は対話的なデバッガを併用することによって、ロジック層の動作を確認する。これにより、３層アーキテクチャのプログラム全体の動作を確認することができる。
【０００８】
このようにプログラムの動作を理解することによってプログラムの動作不良を検出する方法以外に、プログラムの静的解析によってプログラムの脆弱性を検出する方法がある（非特許文献２参照）。非特許文献２には、データフロー解析手法を用いることによって、ユーザ入力データ等の信頼性の低いデータから、データベース参照等セキュリティ上の問題を生じ得るＡＰＩへのデータの流れが存在するか否かを検証する方法が開示されている。この方法によれば、データの流れの途中にセキュリティを保証する手続きが存在しない場合、セキュリティ上の脆弱性が存在すると推定できる。また、この方法によれば、プログラム仕様を詳細に理解する手間を必要とせず、短い時間でプログラムの問題点を検出することが可能である。
【０００９】
その他、このようにセキュリティ上の脆弱性を検証するモジュールを、複数のプログラム言語に対して適用可能とする技術が存在する（特許文献１参照）。特許文献１には、Ｊａｖａ（登録商標）、ＰＬ／ＳＱＬなど複数のプログラム言語を対象に汎用的なセキュリティ解析モジュールを提供する手段が開示されている。この技術によれば、複数のプログラム言語を一度統一的な内部表現に変換し、変換された内部表現に対して解析処理を適用することによって、汎用的なセキュリティ解析モジュールの実現を可能としている。
【先行技術文献】
【特許文献】
【００１０】
【特許文献１】特表２００８−５０２０４６号公報
【非特許文献】
【００１１】
【非特許文献１】M. Linton, The Evolution of Dbx, In Proceedings of the 1990 Summer USENIX Conference, 1990.
【非特許文献２】V. Livshits, 他, Finding Security Vulnerabilities in Java Applications with Static Analysis, In Proceedings of the 14th Conference on USENIX Security Symposium, 2005.
【非特許文献３】Aho他、Compilers: Principles, Techniques, & Tools, second edition, Addison-Wesley, 2006.
【発明の概要】
【発明が解決しようとする課題】
【００１２】
しかしながら、上記従来技術では、３層アーキテクチャのＷｅｂアプリケーションにおいて、プログラムの動作不良や脆弱性等の原因箇所の特定が困難であるという課題があった。
【００１３】
すなわち、対話的デバッガを用いてプログラム仕様を理解する方法では、プログラム仕様の理解度が低い場合、プログラム全体から動作不良の原因箇所を特定するのに長時間を要していた。特に、３層アーキテクチャのＷｅｂアプリケーションのようにデータアクセスを伴うプログラムでは、データアクセスコマンドがプログラムの実行によって動的に構成されることが、プログラム仕様の理解をさらに困難にしている。
【００１４】
一方、プログラムの静的解析によってプログラムの脆弱性を検出する手法では、プログラムの脆弱性を検出できるものの、プログラムの脆弱性の原因箇所を特定することができなかった。特に、プログラムが複数のサービスから構成されるＷｅｂアプリケーションの場合、複数のサービス間の相互作用を考慮する必要がある。そのため、単一のサービス又はプログラムと比較して、プログラムの脆弱性の原因箇所を特定することがさらに困難であった。
【００１５】
本発明は、上述した課題を考慮したものであって、３層アーキテクチャのアプリケーションにおいて、プログラムの動作不良や脆弱性等の原因箇所を容易に特定するアプリケーションの解析方法を提供することを目的とする。
【課題を解決するための手段】
【００１６】
本願において開示される発明の代表的な一例を示せば以下の通りである。すなわち、プログラムを実行するプロセッサと、前記プロセッサによって実行されるプログラムを格納するメモリとを備えた解析システムが、データベース操作文を含むアプリケーションプログラムを解析する方法であって、前記プロセッサが、前記アプリケーションプログラム及び前記アプリケーションプログラムの実行結果に基づいて、前記アプリケーションプログラムの制御の流れ及び前記アプリケーションプログラムにおいて用いられるデータを解析する第１の手順と、前記プロセッサが、前記アプリケーションプログラムが複数のデータベース操作文を含む場合に、前記第１の手順の解析結果及び前記複数のデータベース操作文の操作内容に応じて、前記複数のデータベース操作文の間の依存関係を解析する第２の手順と、前記プロセッサが、前記第１の手順の解析結果及び前記第２の手順の解析結果に基づいて、前記アプリケーションプログラム中の不正に動作している所定の箇所を解析始点として、当該不正動作の伝播経路を、前記制御の流れに対して逆向きに解析する第３の手順と、前記プロセッサが、前記第３の手順によって求められた前記伝播経路上のプログラム文を提示する第４の手順と、を含むことを特徴とする。
【発明の効果】
【００１７】
本発明によれば、３層アーキテクチャのアプリケーションにおいて、プログラムの動作不良や脆弱性等の原因箇所を容易に特定することができる。
【図面の簡単な説明】
【００１８】
【図１Ａ】本発明の第１の実施形態の計算機システムの概略構成を示す図である。
【図１Ｂ】本発明の第１の実施形態の解析システムの構成を示す図である。
【図２】本発明の第１の実施形態のＳＱＬフロー解析モジュールの制御ロジックを示すフローチャートである。
【図３】本発明の第１の実施形態の２つのＳＱＬ操作文の間の依存関係の解析処理の制御ロジックを示すフローチャートである。
【図４】本発明の第１の実施形態の解析始点解析モジュールの制御ロジックを示すフローチャートである。
【図５】本発明の第１の実施形態の不正伝播パス解析モジュールの制御ロジックを示すフローチャートである。
【図６】本発明の第１の実施形態の起点絞り込みモジュールの制御ロジックを示すフローチャートである。
【図７】本発明の第１の実施形態の経路マッピングモジュールの制御ロジックを示すフローチャートである。
【図８】本発明の第１の実施形態の具体例のユーザ端末におけるユーザインターフェースの一例である。
【図９】本発明の第１の実施形態の具体例の対象プログラムを示す図である。
【図１０】本発明の第１の実施形態の具体例の対象プログラムに対するＡＰフロー解析モジュールの解析結果を示す図である。
【図１１】本発明の第１の実施形態の具体例のＳＱＬフロー解析モジュールが２つのＳＱＬ操作文の依存関係を解析するために用いるテーブルの一例を示す図である。
【図１２】本発明の第１の実施形態の具体例の不正伝播パス解析モジュールによって得られるパス集合を示す図である。
【図１３】本発明の第１の実施形態の具体例の非提示エッジ集合の一例を示す図である。
【図１４】本発明の第１の実施形態の具体例の提示パスの表示例を示す図である。
【図１５】本発明の第２の実施形態の具体例の対象プログラムを示す図である。
【図１６】本発明の第２の実施形態の複数サービスを合成する制御ロジックを示すフローチャートである。
【図１７】本発明の第２の実施形態の具体例の実行ログリストの一例を示す図である。
【図１８】本発明の第２の実施形態の具体例の仮呼出しプログラムを示す図である。
【図１９】本発明の第２の実施形態の具体例の対象プログラムに対するＡＰフロー解析モジュールの解析結果を示す図である。
【図２０】本発明の第３の実施形態の解析始点解析モジュールの制御ロジックを示すフローチャートである。
【図２１】本発明の第３の実施形態の具体例の実行ログ集合の一例を示す図である。
【図２２】本発明の第３の実施形態の具体例の対象プログラムを示す図である。
【発明を実施するための形態】
【００１９】
以下、本発明の実施形態について、図面を参照して説明する。
【００２０】
（第１の実施形態）
まず本発明の第１の実施形態について説明する。
【００２１】
図１Ａは、本発明の第１の実施形態の計算機システム１の概略構成を示す図である。図１Ｂは、本発明の第１の実施形態の解析システム１０１の構成を示す図である。
【００２２】
図１Ａに示すように、解析システム１０１は、ＡＰフロー解析モジュール１０２、ＳＱＬフロー解析モジュール１０３、解析始点解析モジュール１０４、不正伝播パス解析モジュール１０５、起点絞り込みモジュール１０６、経路マッピングモジュール１０７、ＳＱＬ依存表（テーブル）１１３を備える。
【００２３】
また図１Ｂに示すように、解析システム１０１は、それぞれバス３０で相互に接続されたメモリ装置２１、演算処理装置２２、インターフェース装置２３、補助記憶装置２５、入力装置２４、ドライブ装置２６、ドライブ装置２６を備えるコンピュータ装置である。メモリ装置２１は、解析システム１０１の起動時に補助記憶装置２５に記憶されたプログラム（図１Ａの各モジュール１０２〜１０７の処理を実行するプログラム）等のプログラムを読み出して記憶するＲＡＭ（Random Access Memory）等の記憶装置である。このメモリ装置２１は、プログラムの実行に必要なファイル、各モジュール１０２〜１０７の処理結果のデータ等も記憶する。演算処理装置２２は、メモリ装置２１に格納されたプログラムを実行するＣＰＵ（Central Processing Unit）等の演算処理装置である。インターフェース装置２３は、外部ネットワーク等に接続するためのインターフェース装置である。入力装置２４は、ユーザインターフェースを提供する入力装置（例えばキーボード、マウス）である。補助記憶装置２５は、プログラムやファイル、データ等を記憶するＨＤＤ等の記憶装置である。ドライブ装置２６は、記録媒体２７に記録されたプログラムを読み出す装置である。ドライブ装置２６によって読み出されたプログラムは、補助記憶装置２５にインストールされる。記録媒体２７は、上記のプログラム等を記録したＵＳＢ（Universal Serial Bus）メモリ、ＳＤメモリカード等の記録媒体である。
【００２４】
図１Ａに戻り、解析システム１０１は、不図示のネットワークを介して接続されたユーザ端末１１２に対して、解析結果１１１を出力（提示）する。対象プログラム１０８は、解析システム１０１の解析対象のプログラムである。この対象プログラム１０８は、ユーザ端末１１０の指示に基づいて動作し、実行ログ等の実行結果１０９を出力する。なお、対象プログラム１０８は、解析システム１０１以外のシステム上で動作してもよい。
【００２５】
ＡＰフロー解析モジュール１０２は、対象プログラム１０８及び実行結果１０９を入力し、これら対象プログラム１０８及び実行結果１０９に基づいて、対象プログラム１０８の制御の流れ（制御フロー）と、対象プログラム１０８の各実行時点における変数の値とを解析する。このＡＰフロー解析モジュール１０２は、例えば非特許文献３に開示された技術によって実現可能である。
【００２６】
ＳＱＬフロー解析モジュール１０３は、ＡＰフロー解析モジュール１０２による解析結果及び実行結果１０９に基づいて、対象プログラム１０８中に記述された各ＳＱＬ操作文（ＳＱＬ実行文）によって実行されるＳＱＬコマンドと各ＳＱＬコマンドの実行順序の関係とを解析する。このＳＱＬフロー解析モジュール１０３は、解析の結果得られる各ＳＱＬコマンドの実行順序の関係を示す情報を、ＳＱＬ依存表１１３に格納する。
【００２７】
図２は、本発明の第１の実施形態のＳＱＬフロー解析モジュール１０３の制御ロジックを示すフローチャートである。
【００２８】
まず処理２０１において、ＳＱＬフロー解析モジュール１０３は処理を開始する（２０１）。次に処理２０２において、ＳＱＬフロー解析モジュール１０３は、対象プログラム１０８中の各文Ｓ（処理ステップ）における変数Ｎと変数Ｎの取り得る値Ｖの集合｛Ｖ｝を、集合を表す変数Ｅ（以下、「集合Ｅ」という。）に格納する（２０２）。なお、集合Ｅの要素は、変数Ｎから値Ｖの集合｛Ｖ｝へのマッピング（Ｎ→｛Ｖ｝）を各文Ｓからマッピングしたもの（Ｓ→｛Ｎ→｛Ｖ｝｝）として表現される。また処理２０２では、対象プログラム１０８中のＳＱＬ操作文の集合を、集合を表す変数Ｄ、Ｄ'（以下、「集合Ｄ、Ｄ'」という。）に格納し、集合を表す変数Ｓ（以下、「集合Ｓ」という。）を空集合とすることによって初期化する。集合Ｄ、Ｄ'に格納されるＳＱＬ操作文の集合は、各種プログラム言語やライブラリで定義されているＳＱＬ操作の手続きの呼出しを求めることによって得られる。
【００２９】
その後、ＳＱＬフロー解析モジュール１０３は、集合Ｄ'が空集合か否か判定する（２０３）。集合Ｄ'が空集合でない場合（２０３でＮＯ）、処理２０４に進んで、集合Ｄ'から１つの要素（ＳＱＬ操作文）を取り出して変数ｄ'に格納する（２０４）。また処理２０４では、変数ｄ'に格納されたＳＱＬ操作文におけるＳＱＬ操作文字列を、変数ｓに格納する。例えば、ＳＱＬ操作文が「stmt.executeQuery(sql)」である場合、ＳＱＬ操作文字列は変数sqlの値（例えば“select * from T"）である。なお、ＳＱＬ操作文字列は、ＡＰフロー解析モジュール１０２によって求められた文ｄ'における変数Ｎと変数Ｎの取り得る値Ｖの集合｛Ｖ｝のマッピング関係を参照することによって得られる。その後、変数ｄ'から変数ｓへのマッピング（｛ｄ'→ｓ｝）を、集合Ｓに加える。
【００３０】
一方、処理２０３において、集合Ｄ'が空集合である場合（２０３でＹＥＳ）、処理２０５に進む。処理２０５に進むと、ＳＱＬフロー解析モジュール１０３は、集合Ｓ（各ＳＱＬ操作文からＳＱＬ操作文字列へのマッピングの集合）を、集合を表す変数Ｓ'に格納する（２０５）。
【００３１】
以上に示す処理２０１〜２０５により、ＳＱＬフロー解析モジュール１０３は、対象プログラム１０８中の各ＳＱＬ操作文からＳＱＬ操作文字列へのマッピングの集合Ｓ、Ｓ'を求める。
【００３２】
その後、ＳＱＬフロー解析モジュール１０３は、集合Ｓ'が空集合か否か判定する（２０６）。集合Ｓ'が空集合である場合（２０６でＹＥＳ）、解析すべきＳＱＬ操作文が存在しないので、処理を終了する（２１３）。一方、集合Ｓ'が空集合でない場合（２０６でＮＯ）、ＳＱＬフロー解析モジュール１０３は、集合Ｓ'から１つの要素（ＳＱＬ操作文からＳＱＬ操作文字列へのマッピング）を取り出して変数ｓ'に格納する（２０７）。また、集合Ｓから変数ｓ'に格納された要素を除いた集合（Ｓ−｛ｓ'｝）を、集合を表す変数Ｓ”（以下、「集合Ｓ”」という。）に格納する。
【００３３】
その後、ＳＱＬフロー解析モジュール１０３は、集合Ｓ”が空集合か否か判定する（２０８）。集合Ｓ”が空集合である場合（２０８でＹＥＳ）、処理２０６に戻る。一方、集合Ｓ”が空集合でない場合（２０８でＮＯ）、ＳＱＬフロー解析モジュール１０３は、集合Ｓ”から１つの要素を取り出して変数ｓ”に格納する（２０９）。その後、変数ｓ’に格納された要素と変数ｓ”に格納された要素との間の依存関係を解析する（２１０）。処理２１０の処理については図３を用いて後述する。
【００３４】
その後、ＳＱＬフロー解析モジュール１０３は、変数ｓ'に格納された要素と変数ｓ”に格納された要素との間の依存関係の有無を判定する（２１１）。依存関係がない場合（２１１でＮＯ）、処理２０８に戻って、集合Ｓ”に格納された別の要素との間で依存関係を解析する。一方、依存関係がある場合（２１１でＹＥＳ）、ＳＱＬフロー解析モジュール１０３は、ＳＱＬ依存表１１３に変数ｓ’と変数ｓ”との組を登録し（２１２）、処理２０８に戻る。
【００３５】
以上の処理２０６〜２１２により、ＳＱＬフロー解析モジュール１０３は、各ＳＱＬコマンドの実行順序の関係を解析することができる。
【００３６】
なお、前述したＡＰフロー解析モジュール１０２による解析の結果得られる変数の取り得る値は、解析精度の関係から不確定となる可能性がある。この場合、ＳＱＬフロー解析モジュール１０３は、対象プログラム１０８の実行結果１０９を用いることによって解析の精度を向上することも可能である。
【００３７】
図３は、本発明の第１の実施形態の２つのＳＱＬ操作文の間の依存関係の解析処理の制御ロジックを示すフローチャートである。ここでは、図２の処理２１０の処理を詳細に説明する。
【００３８】
まず処理３０１において、ＳＱＬフロー解析モジュール１０３は、処理を開始する（３０１）。次に処理３０２において、ＳＱＬフロー解析モジュール１０３は、依存元のＳＱＬ操作文、依存元のＳＱＬ操作文字列、依存先のＳＱＬ操作文、依存先のＳＱＬ操作文字列を、それぞれ変数ｆ＿ｓ、ｆ＿ｃ、ｔ＿ｓ、ｔ＿ｃに格納する（３０２）。ここで、依存元のＳＱＬ操作文及びＳＱＬ操作文字列は、変数ｓ’（図２の処理２０７参照）に格納された要素に基づいて求められる。一方、依存先のＳＱＬ操作文及びＳＱＬ操作文字列は、変数ｓ”（図２の処理２０９参照）に格納された要素に基づいて求められる。
【００３９】
その後、ＳＱＬフロー解析モジュール１０３は、変数ｆ＿ｓに格納された依存元のＳＱＬ操作文から、変数ｔ＿ｓに格納された依存先のＳＱＬ操作文に対して制御が到達可能か否かを判定する（３０３）。ここで、制御の到達可否は、ＡＰフロー解析モジュール１０２による既知のコンパイラ等における制御フロー解析技術によって解析可能である。
【００４０】
処理３０３において、ＳＱＬフロー解析モジュール１０３は、依存元のＳＱＬ操作文による処理と依存先のＳＱＬ操作文による処理との実行順序を判定している。すなわち、依存元のＳＱＬ操作文が依存先のＳＱＬ操作文よりも前に実行される可能性のある処理である場合、制御が到達可能であると判定される。一方、依存元のＳＱＬ操作文が依存先のＳＱＬ操作文よりも前に実行される可能性のない処理である場合、制御は到達不能であると判定される。
【００４１】
処理３０３において、制御が到達不能である場合（３０３でＮＯ）、ＳＱＬフロー解析モジュール１０３は、依存関係が無いと判定して（３０５）、処理を終了する（３０７）。一方、処理３０３において、制御が到達可能である場合（３０３でＹＥＳ）、処理３０４に進んで、ＳＱＬフロー解析モジュール１０３は、変数ｆ＿ｃに格納されたＳＱＬ操作文字列の操作が、変数ｔ＿ｃに格納されたＳＱＬ操作文字列の実行結果に影響を与えるか否かを判定する（３０４）。
【００４２】
処理３０４において、ＳＱＬフロー解析モジュール１０３は、前者のＳＱＬ操作文字列の操作内容が、後者のＳＱＬ操作文字列の操作内容に影響を与えるか否かを判定している。すなわち、前者のＳＱＬ操作文字列の操作内容が“データベースの更新”で、後者のＳＱＬ操作文字列の操作内容が“データベースの検索”である場合、データベースの更新結果が検索結果に影響を与えるので、影響を与えると判定される。一方、前者のＳＱＬ操作文字列の操作内容が“第１の条件に基づくデータベースの検索”で、後者のＳＱＬ操作文字列の操作内容が“第２の条件に基づくデータベースの検索”である場合、各々の検索は独立しているので、影響を与えないと判定される。
【００４３】
処理３０４において、影響を与えない場合（３０４でＮＯ）、ＳＱＬフロー解析モジュール１０３は、依存関係が無いと判定して（３０５）、処理を終了する（３０７）。一方、処理３０４において、影響を与える場合（３０４でＹＥＳ）、ＳＱＬフロー解析モジュール１０３は、依存関係が有ると判定して（３０６）、処理を終了する（３０７）。
【００４４】
以上の処理により、ＳＱＬフロー解析モジュール１０３は、２つのＳＱＬ操作文の間の依存関係を解析することができる。
【００４５】
図４は、本発明の第１の実施形態の解析始点解析モジュール１０４の制御ロジックを示すフローチャートである。
【００４６】
まず処理４０１において、解析始点解析モジュール１０４は、処理を開始する（４０１）。次に処理４０２において、解析始点解析モジュール１０４は、ユーザによって指示された箇所を解析始点（解析の開始点）として設定する（４０２）。この解析始点の設定は、ユーザがプログラム中で不正な値を確認した箇所（文）を指摘する方式や、ユーザがディスプレイ上に表示された結果のうち不正値な値を持つ箇所を指示する方式によって実現される。その後、処理を終了する（４０３）。
【００４７】
以上の処理により、解析始点解析モジュール１０４は、ユーザによって指示された箇所を解析始点として設定することができる。
【００４８】
図５は、本発明の第１の実施形態の不正伝播パス解析モジュール１０５の制御ロジックを示すフローチャートである。不正伝播パス解析モジュール１０５は、解析始点解析モジュール１０４によって設定された解析始点を始点として、不正な計算結果の伝播経路（パス）を解析する。
【００４９】
まず処理６０１において、不正伝播パス解析モジュール１０５は、処理を開始する（６０１）。次に処理６０２において、不正伝播パス解析モジュール１０５は、解析始点解析モジュール１０４によって設定された解析始点の文を変数ｏに格納し、パスの集合を表す変数Ｐ（以下、「パス集合Ｐ」という。）を空集合とすることによって初期化する（６０２）。
【００５０】
その後、不正伝播パス解析モジュール１０５は、変数ｏに格納された解析始点の文において参照される変数及びメモリロケーションの集合を、参照の集合を表す変数Ｒ（以下、「参照集合Ｒ」という。）に格納する（６０３）。
【００５１】
その後、不正伝播パス解析モジュール１０５は、参照集合Ｒが空集合か否か判定する（６０４）。参照集合Ｒが空集合である場合（６０４でＹＥＳ）、処理６１１に進んで、パス集合Ｐを不正伝播経路のパス集合として設定し（６１１）、処理を終了する（６１２）。
【００５２】
一方、処理６０４において、参照集合Ｒが空集合でない場合（６０４でＮＯ）、処理６０５に進んで、不正伝播パス解析モジュール１０５は、参照集合Ｒから１つの要素を取り出して変数ｒに格納する（６０５）。また処理６０５では、変数ｒの定義文の集合を、定義文の集合を表す変数Ｑ（以下、「定義文集合Ｑ」という。）に格納する。ここで、変数ｒの定義文とは、変数rが保持する値を計算する文を言う。定義文の集合を求める処理は、ＡＰフロー解析モジュール１０２による既知のコンパイラ等における制御フロー解析技術によって実現可能である。
【００５３】
その後、不正伝播パス解析モジュール１０５は、定義文集合Ｑが空集合か否か判定する（６０６）。定義文集合Ｑが空集合である場合（６０６でＹＥＳ）、処理６１１に進んで、パス集合Ｐを不正伝播経路のパス集合として設定し（６１１）、処理を終了する（６１２）。
【００５４】
一方、処理６０６において、定義文集合Ｑが空集合でない場合（６０６でＮＯ）、処理６０７に進んで、不正伝播パス解析モジュール１０５は、定義文集合Ｑから１つの要素（定義文）を取り出して変数ｑに格納する（６０７）。その後、図５に示す一連の不正伝播パス解析の制御ロジックを再帰的に呼び出すことによって、変数ｑに格納された要素を解析始点とするパス集合を求め、求められたパス集合を、パス集合を表す変数Ｐ’（以下、「パス集合Ｐ’」という。）に格納する（６０８）。
【００５５】
処理６０９に進むと、不正伝播パス解析モジュール１０５は、パス集合Ｐ’が空集合か否か判定する（６０９）。パス集合Ｐ’が空集合である場合（６０９でＹＥＳ）、処理６０６に戻る。一方、パス集合Ｐ’が空集合でない場合（６０９でＮＯ）、処理６１０に進んで、不正伝播パス解析モジュール１０５は、パス集合Ｐ’から１つの要素（パス）を取り出して変数ｐ’に格納する（６１０）。また処理６１０では、変数ｐ’に格納されたパスに、同パスの最後から変数ｏに格納された解析始点への遷移を加えたパス（ｐ’⇒ｏ）を集合Ｐに加える。すなわち、ｐ’に格納されたパスがn0⇒…⇒nmであるとき、新たなパスn0⇒…⇒nm⇒oを構成し、これを集合Ｐに加える。その後、処理６０９に戻る。
【００５６】
以上の処理により、不正伝播パス解析モジュール１０５は、解析始点解析モジュール１０４によって設定された解析始点を始点として、データの伝播経路を、対象プログラム１０８の制御の流れに対して逆向きに解析する。これにより、不正な計算結果の原因候補となる文の実行経路を表すパス集合を求めることができる。
【００５７】
図６は、本発明の第１の実施形態の起点絞り込みモジュール１０６の制御ロジックを示すフローチャートである。起点絞り込みモジュール１０６は、不正伝播パス解析モジュール１０５によって求められた伝播経路（パス集合）から、プログラムの動作不良の原因となる可能性が低い又は原因ではない箇所を除くことによって、起点（原因箇所）を絞り込む。
【００５８】
まず処理７０１において、起点絞り込みモジュール１０６は、処理を開始する（７０１）。次に処理７０２において、起点絞り込みモジュール１０６は、不正伝播パス解析モジュール１０５によって求められた処理対象のパス（伝播経路）を変数ｗに格納する（７０２）。また処理７０２では、変数ｗに格納されたパス上を遷移するエッジ（所定の文から次に実行される文への遷移）の集合を変数Ｘ、Ｘ’に格納し（以下、「遷移エッジ集合Ｘ、Ｘ’」という。）、ユーザ等によって予め設定された非提示エッジ集合（ユーザに対して提示すべきでないエッジの集合）を変数Ｙに格納する（以下、「非提示エッジ集合Ｙ」という。）。
【００５９】
その後、起点絞り込みモジュール１０６は、遷移エッジ集合Ｘが空集合か否か判定する（７０３）。遷移エッジ集合Ｘが空集合である場合（７０３でＹＥＳ）、処理７０７に進んで、遷移エッジ集合Ｘ’を結合したパスを提示パス（ユーザに対して提示すべきパス）として設定し（７０７）、処理を終了する（７０８）。
【００６０】
一方、処理７０３において、遷移エッジ集合Ｘが空集合でない場合（７０３でＮＯ）、処理７０４に進んで、起点絞り込みモジュール１０６は、遷移エッジ集合Ｘから１つの要素（エッジ）を取り出して変数ｘに格納する（７０４）。その後、変数ｘに格納されたエッジが、非提示エッジ集合Ｙに含まれるか否か判定する（７０５）。
【００６１】
非提示エッジ集合Ｙに含まれない場合（７０５でＮＯ）、処理７０３に戻って次のエッジについて処理を繰り返す。一方、処理７０５において、非提示エッジ集合Ｙに含まれる場合（７０５でＹＥＳ）、処理７０６に進んで、起点絞り込みモジュール１０６は、集合Ｘ'から変数ｘに格納されたエッジを除いた集合（Ｘ'−｛ｘ｝）を、集合Ｘ'とする（７０６）。その後、処理７０３に戻って次のエッジについて処理を繰り返す。
【００６２】
以上の処理により、起点絞り込みモジュール１０６は、遷移エッジ集合Ｘの各要素（エッジ）について、当該要素が非提示エッジ集合Ｙに含まれるか否かを判定し、非提示エッジ集合Ｙに含まれない要素を結合したパスを提示パスとして設定する。これにより、処理対象のパスから非提示エッジ集合に含まれるエッジを除くことができる。
【００６３】
図７は、本発明の第１の実施形態の経路マッピングモジュール１０７の制御ロジックを示すフローチャートである。経路マッピングモジュール１０７は、起点絞り込みモジュール１０６によって求められた提示パスをユーザに提示する処理を実行する。
【００６４】
まず処理８０１において、経路マッピングモジュール１０７は、処理を開始する（８０１）。次に処理８０２において、経路マッピングモジュール１０７は、起点絞り込みモジュール１０６によって求められた提示パスを変数ｇに格納する（８０２）。また処理８０２では、変数ｇに格納された提示パスのエッジ集合を変数Ｇに格納する（以下、「エッジ集合Ｇ」という。）。
【００６５】
その後、経路マッピングモジュール１０７は、エッジ集合Ｇが空集合か否か判定する（８０３）。エッジ集合Ｇが空集合である場合（８０３でＹＥＳ）、処理を終了する（８０５）。一方、処理８０３において、エッジ集合Ｇが空集合でない場合（８０３でＮＯ）、処理８０４に進んで、経路マッピングモジュール１０７は、エッジ集合Ｇから１つの要素（エッジ）を取り出して遷移元の文を変数ｊ、遷移先の文を変数ｋにそれぞれ格納する（８０４）。また処理８０４では、遷移元の文から遷移先の文への遷移を経路として提示する。その後、処理８０３に戻って処理を繰り返す。
【００６６】
以上の処理により、経路マッピングモジュール１０７は、起点絞り込みモジュール１０６によって求められた提示パスをユーザに提示する。
【００６７】
以下、本発明の第１の実施形態の具体例を説明する。
【００６８】
図８は、本発明の第１の実施形態の具体例のユーザ端末１１０におけるユーザインターフェースの一例である。図８に示すＷｅｂインターフェース９０１は、ユーザ端末１１０のディスプレイに表示される。このＷｅｂインターフェース９０１は、図１の実行結果１０９に基づいて作成される。
【００６９】
このＷｅｂインターフェース９０１は、検索番号を入力するための検索番号入力フォーム９０２、入力された検索番号を照会するための照会ボタン９０３、入力された検索番号に対する照会の結果として得られる検索結果９０４を含む。
【００７０】
図８に示す例では、「属性＃１」の検索結果がｎｕｌｌになっている。すなわち、「属性＃１」の検索結果がｎｕｌｌのような不正値となることがプログラムの動作不良を示すものとする。
【００７１】
図９は、本発明の第１の実施形態の具体例の対象プログラム１０８を示す図である。図９に示す対象プログラム１００１は、対象プログラム１０８の一例としてのロジック層のプログラムである。この対象プログラム１００１は、単一のサービスを実現する。
【００７２】
図９に示す例において、メソッドdoPostは、ユーザアクションによって呼び出される。メソッドdoPostが呼び出されると、メソッドdoPost内のメソッドC0.m0(文（ｇ）)、メソッドCO.m1（文（ｈ））が順に呼び出される。
【００７３】
メソッドC0.m0（文（ｇ））が呼び出されると、まず文（ａ）において、変数ｖ０に不正値が格納される。次に文（ｂ）において、この不正値ｖ０を用いてＳＱＬ更新文を示すＳＱＬ操作文字列ｓ０が生成される。その後文（ｃ）において、ＳＱＬ更新処理（update）が実行される。その結果、対象プログラム１００１の処理対象のデータベース内に不正値が格納される。
【００７４】
一方、メソッドC0.m1（文（ｈ））が呼び出されると、まず文（ｄ）において、ＳＱＬ検索文を示すＳＱＬ操作文字列ｓ１が生成される。次に文（ｅ）において、ＳＱＬ検索処理（query）が実行される。この文（ｅ）では、前述した文（ｃ）によってデータベース内に格納された不正値が検索結果として抽出される。その後文（ｆ）において、抽出された検索結果（不正値）が出力される。すなわち、図８の検索結果９０４は、この文（ｆ）の実行に伴い出力された不正値の表示例である。
【００７５】
図１０は、本発明の第１の実施形態の具体例の対象プログラム１００１に対するＡＰフロー解析モジュール１０２の解析結果を示す図である。
【００７６】
図１０に示す解析結果テーブル１３０３は、実行経路欄１３０１と、変数欄１３０２とを含む。実行経路欄１３０１は、図９の対象プログラム１００１の制御の流れ（（ｇ）→（ａ）→（ｂ）→（ｃ）→（ｈ）→（ｄ）→（ｅ）→（ｆ））を示す。変数欄１３０２は、対象プログラム１００１の各文（ａ）〜（ｆ）を示す文欄１３０４と、各文（ａ）〜（ｆ）における変数を示す変数名欄１３０５と、変数の値を示す値欄１３０６とを含む。
【００７７】
図１１は、本発明の第１の実施形態の具体例のＳＱＬフロー解析モジュール１０３が２つのＳＱＬ操作文の依存関係を解析するために用いるテーブル１５０１の一例を示す図である。
【００７８】
図１１に示すテーブル１５０１は、図３のステップ３０４において、ＳＱＬフロー解析モジュール１０３が２つのＳＱＬ操作文の依存関係を解析する際に用いられる。
【００７９】
ここでは、解析対象の２つのＳＱＬ操作文を、実行順番に応じて前操作と後操作とよぶ。そうすると、前操作が更新（update）であって前操作と後操作の処理対象のデータベースが同一である場合、後操作は前操作の結果に依存する、すなわち前操作と後操作との間に依存関係が有る。一方、前操作が検索（select）である場合、前操作と後操作との間に依存関係が無い。
【００８０】
以上に示す前提の元、ＳＱＬフロー解析モジュール１０３が図９の対象プログラム１００１に基づいて、図２の制御ロジックを実行する動作を説明する。なお、図９の対象プログラム１００１中のＳＱＬ操作文（ｃ）、（ｅ）に対応するＳＱＬ操作文字列は、それぞれ“update T set item=<不正値>"、 “select * from T …"である。
【００８１】
ＳＱＬフロー解析モジュール１０３は、図２の処理２０２〜２０４により、Ｓ＝｛（ｃ）→“update T set item=<不正値>"、（ｅ）→"select * from T …"｝を取得する。その後、処理２１０により、（ｃ）⇒（ｅ）及び（ｅ）⇒（ｃ）の各組の依存関係を解析する。ここで、（ｅ）⇒（ｃ）には制御が到達不能であるため（図３の処理３０３でＮＯ）、（ｅ）⇒（ｃ）には依存関係が無い（３０５）。一方、（ｃ）⇒（ｅ）には制御が到達可能であり（図３の処理３０３でＹＥＳ）、前操作（ｃ）が更新（update）、後操作（ｅ）が検索（select）であるため（３０４でＹＥＳ）、（ｃ）⇒（ｅ）には依存関係が有る（３０６）。その結果、ＳＱＬフロー解析モジュール１０３は、（ｃ）⇒（ｅ）に依存関係が有ると判定する。
【００８２】
解析始点解析モジュール１０４は、図８の表示画面上でユーザによって「属性＃１」の検索結果が不正値であることを指示されると、指示された箇所（すなわち、図９の文（ｆ））を解析始点として設定する。
【００８３】
不正伝播パス解析モジュール１０５は、図５の制御ロジックを実行することによって、解析始点解析モジュール１０４によって設定された図９の文（ｆ）を解析始点として、不正な計算結果の伝播経路を解析する。
【００８４】
不正伝播パス解析モジュール１０５は、まず図５の処理６０２により、解析始点の文（ｆ）を変数ｏに格納し、パス集合Ｐを空集合とすることによって初期化する（６０２）。その後、変数ｏに格納された解析始点の文（ｆ）において参照される変数ｖ１を、参照集合Ｒに格納する（６０３）。その後、不正伝播パス解析モジュール１０５は、参照集合Ｒが空集合か否か判定する（６０４）。参照集合Ｒは空集合ではないので（６０４でＮＯ）、処理６０５に進んで、参照集合Ｒから１つの要素（変数ｖ１）を取り出して変数ｒに格納する（６０５）。また処理６０５では、変数ｒに格納された変数ｖ１の定義文である文（ｅ）を、定義文集合Ｑに格納する。その後、不正伝播パス解析モジュール１０５は、定義文集合Ｑが空集合か否か判定する（６０６）。定義文集合Ｑは空集合ではないので（６０６でＮＯ）、処理６０７に進んで、不正伝播パス解析モジュール１０５は、定義文集合Ｑから１つの要素（文（ｅ））を取り出して変数ｑに格納する（６０７）。その後、図５に示す一連の不正伝播パス解析の制御ロジックを再帰的に呼出すことによって、変数ｑに格納された文（ｅ）を解析始点とするパス集合を求め、求められたパス集合をパス集合Ｐ’に格納する（６０８）。その後、不正伝播パス解析モジュール１０５は、パス集合Ｐ’が空集合か否か判定する（６０９）。パス集合Ｐ’は空集合ではないので（６０９でＮＯ）、処理６１０に進んで、パス集合Ｐ’から１つの要素（パス）を取り出して変数ｐ’に格納する（６１０）。また処理６１０では、変数ｐ’に格納されたパスに、同パスの最後（文（ｅ））から変数ｏに格納された解析始点（文（ｆ））への遷移を加えたパス（（ｅ）⇒（ｆ））を集合Ｐに加える。その後、処理６０９に戻るが，パス集合Ｐ’は空集合であるので（６０９でＹＥＳ）、処理６０６に戻る。また、定義文集合Ｑは空集合であるので（６０６でＹＥＳ）、処理６１１に進んで、パス集合Ｐを不正伝播経路のパス集合として設定し（６１１）、処理を終了する（６１２）。
【００８５】
以上の処理により、不正伝播パス解析モジュール１０５は、解析始点解析モジュール１０４によって設定された解析始点（文（ｆ））を始点として、データの伝播経路を、対象プログラム１０８の制御の流れに対して逆向きに解析する。これにより、不正な計算結果の原因候補となる文の実行経路を表すパス集合を求めることができる。なお、解析結果として得られるデータの伝播経路を、図１２に示す。
【００８６】
図１２は、本発明の第１の実施形態の具体例の不正伝播パス解析モジュール１０５によって得られるパス集合を示す図である。図１２に示すように、文（ｆ）を解析始点１８０１とするパス集合１８０４として、｛（ｈ）⇒（ｄ）⇒（ｅ）⇒（ｆ）、（ｇ）⇒（ｂ）⇒（ｃ）⇒（ｅ）⇒（ｆ）、（ａ）⇒（ｂ）⇒（ｃ）⇒（ｅ）⇒（ｆ）｝が求められる。
【００８７】
起点絞り込みモジュール１０６は、不正伝播パス解析モジュール１０５によって求められた伝播経路から、プログラムの動作不良の原因となる可能性が低い又は原因ではない箇所を除くことによって、起点（原因箇所）を絞り込む。
【００８８】
起点絞り込みモジュール１０６は、まず図６の処理７０２により、処理対象のパス（例えば（ｈ）⇒（ｄ）⇒（ｅ）⇒（ｆ））を変数ｗに格納する（７０２）。また処理７０２では、変数ｗに格納されたパス上を遷移するエッジの集合（｛（ｈ）⇒（ｄ）、（ｄ）⇒（ｅ）、（ｅ）⇒（ｆ）｝）を遷移エッジ集合Ｘ、Ｘ’に格納し、非提示エッジ集合を非提示エッジ集合Ｙに格納する。
【００８９】
図１３は、本発明の第１の実施形態の具体例の非提示エッジ集合の一例を示す図である。図１３に示すように、非提示エッジ集合として、各項番１９０１に対応するエッジ１９０２が登録されている。図１３に示す例では、（｛（ｈ）⇒（ｄ）、（ｄ）⇒（ｅ）｝）が非提示エッジ集合である。
【００９０】
その後、起点絞り込みモジュール１０６は、遷移エッジ集合Ｘが空集合か否か判定する（７０３）。遷移エッジ集合Ｘは空集合ではないので（７０３でＮＯ）、処理７０４に進んで、起点絞り込みモジュール１０６は、遷移エッジ集合Ｘから１つの要素（例えば（ｈ）⇒（ｄ））を取り出して変数ｘに格納する（７０４）。その後、変数ｘに格納されたエッジ（（ｈ）⇒（ｄ））が、非提示エッジ集合Ｙに含まれるか否か判定する（７０５）。エッジ（（ｈ）⇒（ｄ））は非提示エッジ集合Ｙに含まれるので（７０５でＹＥＳ）、処理７０６に進んで、起点絞り込みモジュール１０６は、遷移エッジ集合Ｘ（｛（ｈ）⇒（ｄ）、（ｄ）⇒（ｅ）、（ｅ）⇒（ｆ）｝）から、変数ｘに格納されたエッジ（（ｈ）⇒（ｄ））を除いた集合を、遷移エッジ集合Ｘ’とする（７０６）。その後、処理７０３に戻って次のエッジについて処理を繰り返す。
【００９１】
処理７０３〜７０６を繰り返すと、遷移エッジ集合Ｘには（（ｅ）⇒（ｆ））のみが格納される。その後、処理７０３に戻るが、遷移エッジ集合Ｘは空集合であるので（７０３でＹＥＳ）、処理７０７に進む。処理７０７に進むと、起点絞り込みモジュール１０６は、遷移エッジ集合Ｘ’を結合したパス（（ｅ）⇒（ｆ））を提示パスとして設定し（７０７）、処理を終了する。
【００９２】
起点絞り込みモジュール１０６は、処理対象のパス｛（ｇ）⇒（ｂ）⇒（ｃ）⇒（ｅ）⇒（ｆ）、（ａ）⇒（ｂ）⇒（ｃ）⇒（ｅ）⇒（ｆ）｝に対して同様の解析処理を実行する。これらの処理対象のパスは、非提示エッジ集合Ｙ（図１３参照）に登録されたエッジを含まないため、処理対象のパスの全体が提示パスとして設定される。
【００９３】
以上の処理により、起点絞り込みモジュール１０６は、処理対象のパス｛（ｈ）⇒（ｄ）⇒（ｅ）⇒（ｆ）、（ｇ）⇒（ｂ）⇒（ｃ）⇒（ｅ）⇒（ｆ）、（ａ）⇒（ｂ）⇒（ｃ）⇒（ｅ）⇒（ｆ）｝から、非提示エッジ集合Ｙに含まれるエッジ（｛（ｈ）⇒（ｄ）、（ｄ）⇒（ｅ）｝）を除いた提示パス｛（ｅ）⇒（ｆ）、（ｇ）⇒（ｂ）⇒（ｃ）⇒（ｅ）⇒（ｆ）、（ａ）⇒（ｂ）⇒（ｃ）⇒（ｅ）⇒（ｆ）｝を設定することができる。つまり、処理対象のパスから非提示エッジ集合に含まれるエッジを除くことによって、ユーザに提示するデータ候補を限定することができる。
【００９４】
経路マッピングモジュール１０７は、起点絞り込みモジュール１０６によって求められた提示パスをユーザに提示する処理を実行する。
【００９５】
経路マッピングモジュール１０７は、まず図７の処理８０２により、起点絞り込みモジュール１０６によって求められた提示パスのうち処理対象のパス（例えば（ｇ）⇒（ｂ）⇒（ｃ）⇒（ｅ）⇒（ｆ））を、変数ｇに格納する（８０２）。また処理８０２では、変数ｇに格納された提示パスのエッジ集合（（ｇ）⇒（ｂ）、（ｂ）⇒（ｃ）、（ｃ）⇒（ｅ）、（ｅ）⇒（ｆ））をエッジ集合Ｇに格納する。
【００９６】
その後、経路マッピングモジュール１０７は、エッジ集合Ｇが空集合か否か判定する（８０３）。エッジ集合Ｇは空集合ではないので（８０３でＮＯ）、処理８０４に進んで、経路マッピングモジュール１０７は、エッジ集合Ｇから１つの要素（例えば、（ｇ）⇒（ｂ））を取り出して遷移元の文（ｇ）を変数ｊ、遷移先の文（ｂ）を変数ｋにそれぞれ格納する（８０４）。また処理８０４では、遷移元の文（ｇ）から遷移先の文（ｂ）への遷移を経路として提示する。その後、処理８０３に戻って次の要素について処理を繰り返す。
【００９７】
経路マッピングモジュール１０７は、処理対象のパス｛（ｅ）⇒（ｆ）、（ａ）⇒（ｂ）⇒（ｃ）⇒（ｅ）⇒（ｆ）｝に対して同様のマッピング処理を実行する。
【００９８】
以上の処理により、経路マッピングモジュール１０７は、起点絞り込みモジュール１０６によって求められた提示パスをユーザに提示する。
【００９９】
図１４は、本発明の第１の実施形態の具体例の提示パス２００１の表示例を示す図である。図１４に示すように、破線の提示パス２００１が対象プログラム１００１と対応付けて提示される。
【０１００】
以上説明してきた本発明の第１の実施形態によれば、３層アーキテクチャのＷｅｂアプリケーションにおいて、プログラムの動作不良や脆弱性等の原因箇所を容易に特定することができる。具体的には、プログラムの動作不良の発生箇所である文（ｆ）を解析起点として、当該動作不良の原因箇所である文（ａ）までのパスを逆方向に解析し、図１４のようにユーザに提示することができる。これにより、ユーザはプログラムの動作不良の発生箇所に基づいて当該動作不良の原因箇所を容易に特定可能となる。
【０１０１】
（第２の実施形態）
次に本発明の第２の実施形態について説明する。
【０１０２】
前述の第１の実施形態では、対象プログラム１０８（図１参照）が図９の対象プログラム１００１のように単一のサービスから構成される場合について説明した。ここでは、対象プログラム１０８が図１５の対象プログラム１１０１のように複数のサービスから構成される場合について説明する。なお、第２の実施形態の解析システム１０１の構成、解析システム１０１の各モジュール１０２〜１０７の動作のうち、前述の第１の実施形態と同様である構成、動作についての説明は、適宜省略する。
【０１０３】
図１５は、本発明の第２の実施形態の具体例の対象プログラム１０８を示す図である。図１５に示す対象プログラム１１０１は、対象プログラム１０８の一例としてのロジック層のプログラムである。この対象プログラム１１０１は、複数のサービスを実現する。
【０１０４】
図１５に示す例において、クラスC0、C1は、それぞれ異なるサービスを示すプログラムである。クラスC0のメソッドdoPost、クラスC1のメソッドdoPostは、それぞれユーザからのリクエストによって呼び出される。
【０１０５】
クラスC0のメソッドdoPostが呼び出されると、メソッドC0.m0（文（ｄ））が呼び出される。メソッドC0.m0（文（ｄ））が呼び出されると、まず文（ａ）において、変数ｖ０に不正値が格納される。次に文（ｂ）において、この不正値ｖ０を用いてＳＱＬ更新文を示すＳＱＬ操作文字列ｓ０が生成される。その後文（ｃ）において、ＳＱＬ更新処理（update）が実行される。その結果、対象プログラム１１０１の処理対象のデータベース内に不正値が格納される。
【０１０６】
一方、クラスC1のメソッドdoPostが呼び出されると、メソッドC1.m1（文（ｈ））が呼び出される。メソッドC1.m0（文（ｈ））が呼び出されると、まず文（ｅ）において、ＳＱＬ検索文を示すＳＱＬ操作文字列ｓ１が生成される。次に文（ｆ）において、ＳＱＬ検索処理（query）が実行される。この文（ｆ）では、前述した文（ｃ）によってデータベース内に格納された不正値が検索結果として抽出される。その後文（ｇ）において、抽出された検索結果（不正値）が出力される。
【０１０７】
このようなプログラムでは、クラスCOのメソッドdoPost及びクラスC1のメソッドdoPostの実行順序が不明である。そこで、ＡＰフロー解析モジュール１０２は、実行結果１０９に基づいて図１６に示す処理を実行することにより、クラスC0、C1の実行順序を明確にする。
【０１０８】
図１６は、本発明の第２の実施形態の複数サービスを合成する制御ロジックを示すフローチャートである。
【０１０９】
まず処理２２０１において、ＡＰフロー解析モジュール１０２は、処理を開始する（２２０１）。次に処理２２０２において、ＡＰフロー解析モジュール１０２は、解析対象のサービスの集合を変数Ｌ（以下、「解析対象サービス集合Ｌ」という。）に格納する（２２０２）。また処理２２０２では、実行ログのリストを変数Ｍに格納し（以下、「実行ログ集合Ｍ」という。）、複数サービスを合成するための変数Ｎ（以下、「解析対象サービスリストＮ」という。）を空リストとすることによって初期化する。実行ログリストについて図１７を用いて説明する。
【０１１０】
図１７は、本発明の第２の実施形態の具体例の実行ログリストの一例を示す図である。実行ログリストは、イベントが実行された時刻を格納する時刻欄１２０１、イベントの内容を格納するイベント欄１２０２を含む。ＡＰフロー解析モジュール１０２は、この実行ログのリストを用いて、以下に示す処理２２０３〜２２０７を実行することによって、複数のサービスの呼び出された順番を確認することができる。
【０１１１】
処理２２０３において、ＡＰフロー解析モジュール１０２は、実行ログ集合Ｍが空集合か否か判定する（２２０３）。実行ログ集合Ｍが空集合である場合（２２０３でＹＥＳ）、処理２２０７に進んで、実行ログ集合Ｍの呼出しを結合し（２２０７）、処理を終了する（２２０８）。
【０１１２】
一方、処理２２０３において、実行ログ集合Ｍが空集合でない場合（２２０３でＮＯ）、処理２２０４に進んで、ＡＰフロー解析モジュール１０２は、実行ログ集合Ｍから１つの要素（実行ログ）を取り出して変数ｍに格納する（２２０４）。その後、変数ｍに格納された要素が、解析対象サービス集合Ｌに含まれるか否か判定する（２２０５）。
【０１１３】
解析対象サービス集合Ｌに含まれない場合（２２０５でＮＯ）、処理２２０３に戻って次の要素について処理を繰り返す。一方、処理２２０５において、解析対象サービス集合Ｌに含まれる場合（２２０５でＹＥＳ）、処理２２０６に進んで、ＡＰフロー解析モジュール１０２は、変数ｍに格納された要素（実行ログ）を、解析対象サービスリストＮに追加する（２２０６）。その後、処理２２０６に戻って次の要素について処理を繰り返す。
【０１１４】
以上の処理により、ＡＰフロー解析モジュール１０２は、複数サービスの解析において、実行ログ（複数サービスの各々のサービスの呼出しログ）を参照して、呼出し関係を合成し解析する。なお、ＡＰフロー解析モジュール１０２以外のモジュールが当該処理を実行してもよい。
【０１１５】
以下、本発明の第２の実施形態の具体例を説明する。
【０１１６】
ＡＰフロー解析モジュール１０２は、まず図１６の処理２２０２により、解析対象サービスの集合（図１５のクラスC0のメソッドdoPost及びクラスC1のメソッドdoPost）を解析対象サービス集合Ｌに格納する（２２０２）。また処理２２０２では、実行ログリスト（図１７に示す表）を実行ログ集合Ｍに格納し、解析対象サービスリストＮを空リストとすることによって初期化する。
【０１１７】
その後、ＡＰフロー解析モジュール１０２は、実行ログ集合Ｍが空集合か否か判定する（２２０３）。実行ログ集合Ｍは空集合ではないので（２２０３でＮＯ）、処理２２０４に進んで、ＡＰフロー解析モジュール１０２は、実行ログ集合Ｍから１つの要素（例えば、C0.doPost）を取り出して変数ｍに格納する（２２０４）。その後、変数ｍに格納された要素が、解析対象サービス集合Ｌに含まれるか否か判定する（２２０５）。
【０１１８】
要素（C0.doPost）は解析対象サービス集合Ｌに含まれるので（２２０５でＹＥＳ）、処理２２０６に進んで、ＡＰフロー解析モジュール１０２は、変数ｍに格納された要素（C0.doPost）を、解析対象サービスリストＮに追加する（２２０６）。その後、処理２２０６に戻って次の要素について処理を繰り返す。
【０１１９】
以上の処理により、ＡＰフロー解析モジュール１０２は、解析対象サービスリストＮ（［Ｃ０．ｄｏＰｏｓｔ、Ｃ１．ｄｏＰｏｓｔ］）を求めることができる。また処理２２０７により、このような解析対象サービスリストＮの呼出しを結合することによって、図１８に示す仮呼出しプログラム２１０１を作成することができる。
【０１２０】
図１８は、本発明の第２の実施形態の具体例の仮呼出しプログラム２１０１を示す図である。仮呼出しプログラム２１０１は、解析対象サービスリストＮに格納された各呼出し処理を順序付けしたプログラムである。
【０１２１】
ＡＰフロー解析モジュール１０２は、図１５の対象プログラム１１０１及び図１８の仮呼出しプログラム２１０１に対して上記の解析を実行することによって、図１９に示す解析結果を得ることができる。
【０１２２】
図１９は、本発明の第２の実施形態の具体例の対象プログラム１１０１に対するＡＰフロー解析モジュール１０２の解析結果を示す図である。
【０１２３】
図１９に示す解析結果テーブル１４０３は、経路欄１４０１と、変数欄１４０２とを含む。経路欄１４０１は、図１５の対象プログラム１１０１及び図１８の仮呼出しプログラム２１０１の制御の流れ（（ｉ）→（ｄ）→（ａ）→（ｂ）→（ｃ）→（ｊ）→（ｈ）→（ｅ）→（ｆ）→（ｇ））を示す。変数欄１４０２は、対象プログラム１１０１の各文（ａ）〜（ｇ）を示す文欄１４０４と、各文（ａ）〜（ｇ）における変数を示す変数名欄１４０５と、変数の値を示す値欄１４０６とを含む。
【０１２４】
以上説明してきた本発明の第２の実施形態によれば、３層アーキテクチャのＷｅｂアプリケーションにおいて、プログラムが複数のサービスから構成される場合であっても、当該プログラムの動作不良や脆弱性等の原因箇所を容易に特定することができる。具体的には、プログラムの動作不良の発生箇所である文（ｇ）を解析起点として、当該動作不良の原因箇所である文（ａ）までのパスを逆方向に解析し、ユーザに提示することができる。これにより、ユーザはプログラムの動作不良の発生箇所に基づいて当該動作不良の原因箇所を容易に特定可能となる。
【０１２５】
（第３の実施形態）
次に本発明の第３の実施形態について説明する。
【０１２６】
前述の第１の実施形態では、解析始点解析モジュール１０４が、ユーザによって指示された箇所を解析始点として設定する場合について説明した（図４参照）。ここでは、解析始点解析モジュール１０４が、プログラムの実行中に例外処理が発生した箇所を解析始点として設定する場合について説明する。なお、第３の実施形態の解析システム１０１の構成、解析システム１０１の各モジュール１０２〜１０７の動作のうち、前述の第１の実施形態と同様である構成、動作についての説明は、適宜省略する。
【０１２７】
図２０は、本発明の第３の実施形態の解析始点解析モジュール１０４の制御ロジックを示すフローチャートである。
【０１２８】
まず処理５０１において、解析始点解析モジュール１０４は、処理を開始する（５０１）。次に処理５０２において、解析始点解析モジュール１０４は、プログラムの実行ログの集合を変数Ｔ（以下、「実行ログ集合Ｔ」という。）に格納する（５０２）。プログラムの実行ログ集合については、図２１を用いて後述する。
【０１２９】
その後、解析始点解析モジュール１０４は、実行ログ集合Ｔが空集合か否か判定する（５０３）。実行ログ集合Ｔが空集合である場合（５０３でＹＥＳ）、処理を終了する（５０７）。一方、実行ログ集合Ｔが空集合でない場合（５０３でＮＯ）、処理５０４に進んで、解析始点解析モジュール１０４は、実行ログ集合Ｔから１つの要素（実行ログ）を取り出して変数ｕに格納する（５０４）。
【０１３０】
その後、変数ｕに格納された要素が、例外発生を表すエントリであるか否か判定する（５０５）。変数ｕに格納された要素が例外発生を表すエントリである場合（５０５でＹＥＳ）、処理５０６に進んで、変数ｕに格納された要素を解析始点として設定し（５０６）、処理を終了する（５０７）。一方、変数ｕに格納された要素が例外発生を表すエントリでない場合（５０５でＮＯ）、処理５０３に戻って次の要素について処理を繰り返す。
【０１３１】
以上の処理により、解析始点解析モジュール１０４は、プログラムの実行中に例外処理が発生した箇所を解析始点として設定する。
【０１３２】
以下、本発明の第３の実施形態の具体例を説明する。
【０１３３】
図２１は、本発明の第３の実施形態の具体例の実行ログ集合の一例を示す図である。実行ログ集合は、順序関係を示す項番欄１７０１、項番欄１７０１の各項番に対応するイベントの内容を示すイベント欄１７０２を含む。図２１に示す例では、「項番＃３」のエントリ１７０３が例外発生を示す処理である。
【０１３４】
解析始点解析モジュール１０４は、まず図２０の処理５０２により、図２１に示す実行ログ集合を実行ログ集合Ｔに格納する（５０２）。その後、実行ログ集合Ｔが空集合か否か判定する（５０３）。実行ログ集合Ｔは空集合でないので（５０３でＮＯ）、処理５０４に進んで、解析始点解析モジュール１０４は、実行ログ集合Ｔから１つの要素（［＃１、call CO.doPost］）を取り出して変数ｕに格納する（５０４）。
【０１３５】
その後、変数ｕに格納された要素が、例外発生を表すエントリであるか否か判定する（５０５）。変数ｕに格納された要素（［＃１、call CO.doPost］）は例外発生を表すエントリではないので（５０５でＮＯ）、処理５０３に戻って次の要素（［＃２、call C1.doPost］）について処理を実行する。処理５０３〜５０５の処理を繰り返すことにより、解析始点解析モジュール１０４は、例外発生を表すエントリである要素（［＃３、Exception in thread“main"）を、解析始点として設定し（５０６）、処理を終了する（５０７）。
【０１３６】
以上の処理により、解析始点解析モジュール１０４は、図２１のエントリ１７０３を解析始点として設定することができる。なお、このような実行ログに対応する対象プログラム１０８（図１参照）を、図２２に示す。
【０１３７】
図２２は、本発明の第３の実施形態の具体例の対象プログラム１０８を示す図である。図２２に示す対象プログラム１６０１は、対象プログラム１０８の一例としてのロジック層のプログラムである。この対象プログラム１６０１は、単一のサービス（クラスC2のサービス）を実現する。
【０１３８】
図２２に示す例において、メソッドC2.m2（文（ｄ））が例外発生を表す処理である。すなわち、前述の図２０に示す制御ロジックにより、文（ｄ）を解析始点として設定することができる。
【０１３９】
以上説明してきた本発明の第３の実施形態によれば、プログラムの動作不良の発生箇所である文（ｄ）を自動的に解析起点として設定することができる。その後、前述の第１の実施形態で説明した方法により、当該動作不良の原因箇所である文までのパスを逆方向に解析し、ユーザに提示することができる。これにより、ユーザはプログラムの動作不良の発生箇所に基づいて当該動作不良の原因箇所を容易に特定可能となる。
【０１４０】
以上、本発明の各実施形態について説明したが、上記各実施形態は本発明の適用例の一つを示したものであり、本発明の技術的範囲を上記各実施形態の具体的構成に限定する趣旨ではない。本発明の要旨を逸脱しない範囲において種々変更可能である。
【符号の説明】
【０１４１】
１０１  解析システム
１０２  ＡＰフロー解析モジュール
１０３  ＳＱＬフロー解析モジュール
１０４  解析始点解析モジュール
１０５  不正伝播パス解析モジュール
１０６  起点絞り込みモジュール
１０７  経路マッピングモジュール
１０８  対象プログラム
１０９  実行結果
【図１Ａ】
2011253363.tif 000003
【図１Ｂ】
2011253363.tif 000004
【図２】
2011253363.tif 000005
【図３】
2011253363.tif 000006
【図４】
2011253363.tif 000007
【図５】
2011253363.tif 000008
【図６】
2011253363.tif 000009
【図７】
2011253363.tif 000010
【図８】
2011253363.tif 000011
【図９】
2011253363.tif 000012
【図１０】
2011253363.tif 000013
【図１１】
2011253363.tif 000014
【図１２】
2011253363.tif 000015
【図１３】
2011253363.tif 000016
【図１４】
2011253363.tif 000017
【図１５】
2011253363.tif 000018
【図１６】
2011253363.tif 000019
【図１７】
2011253363.tif 000020
【図１８】
2011253363.tif 000021
【図１９】
2011253363.tif 000022
【図２０】
2011253363.tif 000023
【図２１】
2011253363.tif 000024
【図２２】
2011253363.tif 000025