(57)【特許請求の範囲】
【請求項１】
並列実行されるプログラムの共通資源へのアクセス競合状態を検出するプログラム診断装置であって、
前記プログラムの入力を受け付けるプログラム入力受付手段と、
前記プログラムの中間コードを生成する中間コード生成手段と、
前記中間コードに記述されている命令コードを仮実行する命令コード仮実行手段と、
前記仮実行の結果に基づいて、当該仮実行した命令コードと、該命令コードが読み書きを行なうオブジェクト変数の識別情報と、該命令コードの前記中間コードにおける記載位置と、他の命令コードの並列実行を許可することを示す識別子と、を関連付けた履歴テーブルを作成する履歴テーブル作成手段と、
前記中間コードに基づいて、オブジェクト変数の読み書きを行なう命令コードのうち、他の命令コードの並列実行を許可することを示す識別子に関連付けられて前記履歴テーブルに記載されている命令コードを検出する命令コード検出手段と、
を備えることを特徴とするプログラム診断装置。
【請求項２】
前記検出した命令コードが記述されているプログラムソースコード中の行を、当該プログラムソースコードの表示画面に表示する検出命令コード位置表示手段と、
を備えることを特徴とする請求項１に記載のプログラム診断装置。
【請求項３】
前記検出した命令コードに関連付けて前記履歴テーブルに記録されている中間コードの記載位置に基づいて、当該命令コードが記述されているプログラムソースコード中の行を特定する命令コード位置特定手段と、
を備えることを特徴とする請求項１または請求項２に記載のプログラム診断装置。
【請求項４】
前記履歴テーブル作成手段は、前記履歴テーブルにおいて、前記共通資源へのアクセスが出来ないよう制御する命令コードと、当該命令コードに対応する命令コードであって前記共通資源へのアクセスが出来ない制御の解除を行う命令コードの、中間コードにおける記載位置の間に記録されている命令コードについては、他の命令コードの並列実行を許可しないことを示す識別子に対応付に関連付けて記録する
ことを特徴とする請求項１から請求項３の何れか一項に記載のプログラム診断装置。
【請求項５】
並列実行されるプログラムの共通資源へのアクセス競合状態を検出するプログラム診断装置におけるプログラム診断方法であって、
前記プログラムの入力を受け付け、
前記プログラムの中間コードを生成し、
前記中間コードに記述されている命令コードを仮実行し、
前記仮実行の結果に基づいて、当該仮実行した命令コードと、該命令コードが読み書きを行なうオブジェクト変数の識別情報と、該命令コードの前記中間コードにおける記載位置と、他の命令コードの並列実行を許可することを示す識別子と、を関連付けた履歴テーブルを作成し、
前記中間コードに基づいて、オブジェクト変数の読み書きを行なう命令コードのうち、他の命令コードの並列実行を許可することを示す識別子に関連付けられて前記履歴テーブルに記載されている命令コードを検出する
ことを特徴とするプログラム診断方法。
【請求項６】
並列実行されるプログラムの共通資源へのアクセス競合状態を検出するプログラム診断装置のコンピュータを、
前記プログラムの入力を受け付けるプログラム入力受付手段、
前記プログラムの中間コードを生成する中間コード生成手段、
前記中間コードに記述されている命令コードを仮実行する命令コード仮実行手段、
前記仮実行の結果に基づいて、当該仮実行した命令コードと、該命令コードが読み書きを行なうオブジェクト変数の識別情報と、該命令コードの前記中間コードにおける記載位置と、他の命令コードの並列実行を許可することを示す識別子と、を関連付けた履歴テーブルを作成する履歴テーブル作成手段、
前記中間コードに基づいて、オブジェクト変数の読み書きを行なう命令コードのうち、他の命令コードの並列実行を許可することを示す識別子に関連付けられて前記履歴テーブルに記載されている命令コードを検出する命令コード検出手段、
として機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、並列実行されるプログラムの共通資源へのアクセス競合状態を、プログラムソースコード中から検出するプログラム診断装置及びプログラム診断方法ならびにそのプログラムに関する。
【背景技術】
【０００２】
従来、コンピュータシステムにおいては排他制御という技術が利用されている。ここで、排他制御を行わない場合の預金管理システムと、排他制御を行う場合の預金管理システムとについて、具体例を用いて説明する。まず、排他制御を行わない預金管理システムにおいて、入金プログラムが、５０，０００円（共有変数）の預金残高へ、３０，０００円を入金処理し、８０，０００円を預金金額として登録する場合を例に説明する。ここで、入金プログラムと出金プログラムとが同タイミングに実行された場合、出金プログラムは、入金プログラムが処理を行っている間に、預金残高５０，０００円を読み取り、その預金残高から１０，０００円を出金処理した４０，０００円を計算し、入金プログラムの処理完了後に、４０，０００円の金額の情報を預金金額へ登録する可能性がある。このような場合、預金残高は入金プログラムの処理を反映していない４０，０００円と記録されてしまい、５０，０００円（預金残高）＋３０，０００（入金金額）−１０，０００（出金金額）＝７０，０００円で算出されるような正確な金額とならない。このようなプログラムの競合状態を回避するためには、排他制御を行う必要がある。つまり、共有変数に対して入金プログラムが実行されている間は共有変数をロックし、共有変数に対する出金プログラムの処理をロック（実行させないよう処理）し、これにより、預金残高が正確な値の７０，０００円となるよう制御する必要がある。
【０００３】
同様に、インターネットに接続されたウェブサーバの処理でも競合状態が発生する。図１９で示す図はウェブサーバにおける競合状態を示す図である。この図が示すように、クライアント端末Ａを利用するユーザＡと、クライアント端末Ｂを利用するユーザＢが同時にウェブサーバにアクセスしている状態において、クライアントＡからの処理を制御するプログラムとクライアントＢからの処理を制御するプログラムが競合した場合、クライアント端末Ａに対して、クライアント端末Ｂへ送信するウェブページを送信してしまう可能性がある。そして、これらの競合状態がウェブサーバのプログラムで発生しないかどうかのプログラム診断を行なう技術が特許文献１に開示されている。
【特許文献１】特開２００７−２５７３９７号公報
【発明の開示】
【発明が解決しようとする課題】
【０００４】
ここで、上述の特許文献１の技術では、平行・並列動作を行なうプログラム中で共有変数の読み込み処理と、共有変数の書き込み処理とを検出し、共有変数の読み込み処理における当該共有変数の値と、共有変数の書き込み処理の直前における共有変数の値を比較する。そしてその比較において値が一致しない場合に競合状態であると検出して、その競合状態が発生するプログラム中の箇所にａｓｓｅｒｔ文を追加したソースコードを出力している。しかしながら、特許文献１の技術では、仮想マシンの動的解析によって、競合状態が発生したかどうかを検出できるものの、プログラムにおいて競合状態が発生しないように修正しなければならない場合、そのプログラムの記述位置を特定することができない。またプログラムのソースコードにａｓｓｅｒｔ文を追加するため、プログラム自体を改変してしまうこととなる。さらに、特許文献１の技術では、仮想マシンの動的解析中に競合状態が発生しなければ、それを検出することができないという問題がある。
【０００５】
そこでこの発明は、プログラムのソースコードの記述を改変することなく、また精度良く、競合状態を発生させる命令コードの検出および修正をプログラムの製作者が容易に行うことが可能となるプログラム診断装置及びプログラム診断方法ならびにそのプログラムを提供することを目的としている。
【課題を解決するための手段】
【０００６】
上記目的を達成するために、本発明は、並列実行されるプログラムの共通資源へのアクセス競合状態を検出するプログラム診断装置であって、前記プログラムの入力を受け付けるプログラム入力受付手段と、前記プログラムの中間コードを生成する中間コード生成手段と、前記中間コードに記述されている命令コードを仮実行する命令コード仮実行手段と、前記仮実行の結果に基づいて、当該仮実行した命令コードと、該命令コードが読み書きを行なうオブジェクト変数の識別情報と、該命令コードの前記中間コードにおける記載位置と、他の命令コードの並列実行を許可することを示す識別子と、を関連付けた履歴テーブルを作成する履歴テーブル作成手段と、前記中間コードに基づいて、オブジェクト変数の読み書きを行なう命令コードのうち、他の命令コードの並列実行を許可することを示す識別子に関連付けられて前記履歴テーブルに記載されている命令コードを検出する命令コード検出手段と、を備えることを特徴とするプログラム診断装置である。
【０００７】
また本発明は、上述のプログラム診断装置において、前記検出した命令コードが記述されているプログラムソースコード中の行を、当該プログラムソースコードの表示画面に表示する検出命令コード位置表示手段と、を備えることを特徴とする。
【０００８】
また本発明は、上述のプログラム診断装置において、前記検出した命令コードに関連付けて前記履歴テーブルに記録されている中間コードの記載位置に基づいて、当該命令コードが記述されているプログラムソースコード中の行を特定する命令コード位置特定手段と、を備えることを特徴とする。
【０００９】
また本発明は、上述のプログラム診断装置において、前記履歴テーブル作成手段は、前記履歴テーブルにおいて、前記共通資源へのアクセスが出来ないよう制御する命令コードと、当該命令コードに対応する命令コードであって前記共通資源へのアクセスが出来ない制御の解除を行う命令コードの、中間コードにおける記載位置の間に記録されている命令コードについては、他の命令コードの並列実行を許可しないことを示す識別子に対応付に関連付けて記録することを特徴とする。
【００１０】
また本発明は、並列実行されるプログラムの共通資源へのアクセス競合状態を検出するプログラム診断装置におけるプログラム診断方法であって、前記プログラムの入力を受け付け、前記プログラムの中間コードを生成し、前記中間コードに記述されている命令コードを仮実行し、前記仮実行の結果に基づいて、当該仮実行した命令コードと、該命令コードが読み書きを行なうオブジェクト変数の識別情報と、該命令コードの前記中間コードにおける記載位置と、他の命令コードの並列実行を許可することを示す識別子と、を関連付けた履歴テーブルを作成し、前記中間コードに基づいて、オブジェクト変数の読み書きを行なう命令コードのうち、他の命令コードの並列実行を許可することを示す識別子に関連付けられて前記履歴テーブルに記載されている命令コードを検出することを特徴とするプログラム診断方法である。
【００１１】
また本発明は、並列実行されるプログラムの共通資源へのアクセス競合状態を検出するプログラム診断装置のコンピュータを、前記プログラムの入力を受け付けるプログラム入力受付手段、前記プログラムの中間コードを生成する中間コード生成手段、前記中間コードに記述されている命令コードを仮実行する命令コード仮実行手段、前記仮実行の結果に基づいて、当該仮実行した命令コードと、該命令コードが読み書きを行なうオブジェクト変数の識別情報と、該命令コードの前記中間コードにおける記載位置と、他の命令コードの並列実行を許可することを示す識別子と、を関連付けた履歴テーブルを作成する履歴テーブル作成手段、前記中間コードに基づいて、オブジェクト変数の読み書きを行なう命令コードのうち、他の命令コードの並列実行を許可することを示す識別子に関連付けられて前記履歴テーブルに記載されている命令コードを検出する命令コード検出手段、として機能させるためのプログラムである。
【発明の効果】
【００１２】
本発明によれば、プログラムのソースコードから中間コードを生成し、その中間コードから、メモリ参照／書き込みを示す命令コードを検出する。そして、その命令コードの仮実行において、操作する変数がアンロック状態で実行される命令コードであると判定した場合には、その命令コードが記述されているソースコードの位置を画面に表示している。従って、ユーザは、ソースコードの記述が改変されることなく、どのソースコードの位置の記述を、競合状態が発生しないように変更すべきかを検出でき、またその修正を行うことができる。また、メモリ参照／書き込みを示す命令コードを全て検出できるため、精度良く、競合状態を発生させる命令コードに対応するソースコードの位置を検出することができる。
【発明を実施するための最良の形態】
【００１３】
以下、本発明の一実施形態によるプログラム診断装置を図面を参照して説明する。
図１は同実施形態によるプログラム診断装置の構成を示すブロック図である。
この図において、符号１はプログラム診断装置である。そして、プログラム診断装置１は、Ｗｅｂアプリケーション解析部１１、診断実行部１２、競合状態条件判定部１３、表示部１４、命令コード記憶部１５、オペランドスタック１６、メモリ監視履歴ＤＢ（データベース）１７を備えている。
【００１４】
そして、プログラム診断装置１は、並列実行されるプログラムの共通資源へのアクセス競合状態を、プログラムソースコード中から検出するものであり、まず、プログラムの入力を受け付ける。次に、プログラムの中間コードを生成する。そして、中間コードに基づいて、オブジェクト変数の読み書きを行なう命令コードのうち、他の命令コードの並列実行を許可する識別子に関連付けられる命令コードを検出する。さらに、検出した命令コードが記述されているプログラムソースコード中の行を、当該プログラムソースコードの表示画面に表示する処理を行う。これにより、プログラムのソースコードの記述を改変することなく、また精度良く、競合状態を発生させる命令コードの検出および修正をプログラムの製作者が容易に行うことができるよう画面をモニタへ出力している。
【００１５】
図２はプログラム診断装置の処理概要を示す図である。
この図が示すように、本実施形態によるプログラム診断装置１は、Ｊａｖａ（登録商標）言語のプログラムソースコードをＪａｖａ（登録商標）言語の中間コード（バイトコード）にコンパイルし、その中間コードを用いて、ソースコードの脆弱性、つまり、並列実行されるプログラムの共通資源へのアクセス競合状態が発生しないかどうかの診断を、データベースに記録された情報に基づいて行なう。そして、Ｊａｖａ（登録商標）言語のプログラムソースコード中の、競合状態を発生させる可能性のある命令コードに対応する記述の行に警告マーカ等を表示する処理を行う。
【００１６】
ここで、本実施形態において診断を行なうプログラムは、ウェブアプリケーションサーバにおいて、クライアントからのリクエスト情報の受信に応じて処理を開始するフィルタプログラム、リスナプログラム、Ｊａｖａ（登録商標）サーブレットプログラム、Ｊａｖａ（登録商標）サーバページプログラム等である。これらのプログラムは、ユーザの操作するクライアント端末からリクエスト情報を受信することを契機に動作するプログラムである。電子決済サイト等では、ウェブアプリケーションサーバにおける競合状態の発生の削減を厳しくチェックする必要があり、本実施形態によるプログラム診断が特に行なわれるべきプログラムである。なお、本実施形態のプログラム診断装置１による診断方法は、ウェブアプリケーションサーバの、フィルタプログラム、リスナプログラム、Ｊａｖａ（登録商標）サーブレットプログラム、Ｊａｖａ（登録商標）サーバページプログラム以外の、他のサーバで動作するプログラムの競合状態の診断に用いるようにしてもよい。また、本実施形態においては、Ｊａｖａ（登録商標）言語のプログラムソースコードをＪａｖａ（登録商標）言語の中間コード（バイトコード）にコンパイルしているが、これは、中間コードがソースコードに比べて、処理情報の粒度が細かく表れており、変数やオブジェクトの状態等の属性情報が含まれるためである。これらの属性情報を利用して、精度の良い診断を実行することとなる。
【００１７】
図３は並列実行されるプログラムの共通資源へのアクセス競合状態の概要を示す図である。
この図が示すように、ウェブアプリケーションサーバ上で２つのスレッドが実行された場合、ある共通資源（変数やオブジェクト等）が両方のスレッドからのアクセスを受け付け可能な状態（アンロック（Unlock）状態）となっている場合、アクセス競合状態が発生し、共通資源の持つデータ値が所望の値と異なってしまう可能性がある。従って、一方の１つのスレッドがある共通資源にアクセスしている場合には、その命令コードによっては、他の１つ又は複数のスレッドが、その共通資源へのアクセスができないような状態（ロック（Lock）状態）に制御することが必要となる。そして、プログラム中から、競合状態が発生する可能性のある共通資源へのアクセス処理を行っている記述がみつかれば、その箇所が、競合状態の発生する可能性のプログラム中の記述であると判定することができる。
【００１８】
図４はプログラム診断装置の処理フローを示す第１の図である。
次に、プログラム診断装置１の処理フローの全体像について説明する。まず、ウェブアプリケーション解析部１１が、ウェブアプリケーションサーバを構成する全てのソースファイルから、全ての「ユーザリクエスト受信時処理開始メソッド」を読み込む（ステップＳ１）。この「ユーザリクエスト受信時処理開始メソッド」は、ウェブアプリケーションサーバの、フィルタプログラム、リスナプログラム、Ｊａｖａ（登録商標）サーブレットプログラム、Ｊａｖａ（登録商標）サーバページプログラム等の、ユーザ端末からのリクエスト情報を受け付けて、処理を開始するクラス内に含まれている。ここでメソッドとは、オブジェクト指向プログラミングにおいて、各オブジェクトが持っている自身に対する操作命令のコマンドを記述したプログラムである。
【００１９】
そして、ウェブアプリケーション解析部１１は、１つの「ユーザリクエスト受信時処理開始メソッド」から、「実行モジュール群」を生成する（ステップＳ２）。そして、ウェブアプリケーション解析部１１は生成した「実行モジュール群」が含まれるソースコードがコンパイル済みかを判定し（ステップＳ３）、コンパイルされていなければ、そのソースコードをコンパイルして中間コードを生成する（ステップＳ３１）。そして、ウェブアプリケーション解析部１１は、中間コードに記述されている命令コードを、ユーザ端末からのリクエスト情報に対応して実行する処理の順に、命令コード記憶部１５に格納する（ステップＳ４）。
【００２０】
次に、診断実行部１２が、命令コード記憶部１５から命令コードを読み込み、オペランドスタック１６上でエミュレート実行（擬似実行）させ、ウェブアプリケーションが使用する共有メモリの操作を行う命令コード（メモリ操作命令コード）のバイトコード位置（命令コードの中間（バイト）コード内のメソッドの先頭を０とした何バイト目かを示す値）を命令コード記憶部１５から読み込む（ステップＳ５）。そして診断実行部１２は、メモリ操作命令コードのバイトコード位置と、メモリ操作命令コードによって変更される共有メモリの状態などの履歴をメモリ監視履歴ＤＢ１７のメモリ監視履歴テーブルに書き込む（ステップＳ６）。次に、競合状態条件判定部１３が、メモリ監視履歴テーブルを読み込み、競合条件（オブジェクト変数の読み書きを行なう命令コードのうち、他の命令コードの並列実行を許可する識別子に関連付けられて記録されている命令コードかどうかの条件）が、真となる変数に対応したメモリ操作命令コードのバイトコード位置を読み込む（ステップＳ７）。そして、競合状態条件判定部１３の読み込んだメモリ操作命令コードのバイトコード位置から、実行モジュール群の位置情報を計算し、表示部１４へ通知する（ステップＳ８）。また表示部１４では、モニタなどの外部表示装置へ、実行モジュール群の位置情報を出力する（ステップＳ９）。
【００２１】
次に、上記ステップＳ１〜ステップＳ９の処理の詳細について説明する。
図５はプログラム診断装置の処理フローを示す第２の図である。
この図より、上記ステップＳ１においては、まず、ウェブアプリケーション解析部１１が、ウェブアプリケーションを構成するソースファイルが格納されたディレクトリ・パスを読み込む（ステップＳ１１）。そしてウェブアプリケーション解析部１１は、そのディレクトリ・パス配下に格納されているウェブアプリケーション配備記述子（デプロイメントディスクリプタ）を読み込み、その記述子から、ウェブアプリケーションサーバの、フィルタプログラム、リスナプログラム、Ｊａｖａ（登録商標）サーブレットプログラム、Ｊａｖａ（登録商標）サーバページプログラムの各名称を読み込む（ステップＳ１２）。また、ウェブアプリケーション解析部１１は、名称を特定した対象ソースファイル（ウェブアプリケーションを構成するソースファイル）から、ステップＳ１２で特定した名称を持つクラスのスーパークラスを求め、そのスーパークラスごとに、「ユーザリクエスト受信時処理開始メソッド一覧」で定義されたメソッドを、「ユーザリクエスト受信時処理開始メソッド」としてメモリへ保存する（ステップＳ１３）。
【００２２】
図６はユーザリクエスト受信時処理開始メソッド一覧を示す図である。
「ユーザリクエスト受信時処理開始メソッド一覧」は、予め記憶部等で記憶しており、図６で示すように、クラスごとに１つまたは複数のメソッドが記述されている。
【００２３】
図７はプログラム診断装置の処理フローを示す第３の図である。
次に、上記ステップＳ２においては、まず、ウェブアプリケーション解析部１１が、ステップＳ１３においてメモリへ保存した「ユーザリクエスト受信時処理開始メソッド」のリストから１つのメソッドを読み込む（ステップＳ２１）。そして、ウェブアプリケーション解析部１１は、そのメソッド内で実行される全ての命令コードを読み込み、命令コードのリストを生成する（ステップＳ２２）。次にウェブアプリケーション解析部１１は、命令コードのリストを「実行モジュール群（「ユーザリクエスト受信時処理開始メソッド」を始点とした一連の処理内で実行されるメソッド内の命令コードの集合）」としてメモリ内のデータテーブルに一時的に追加記録する（ステップＳ２３）。そして、ウェブアプリケーション解析部１１は、メモリに一時記録されたデータテーブルにおいて、実行モジュール群における命令コードのリストが空かどうかを判定し（ステップＳ２４）、空であれば、処理を終了し、空でなければ、命令コードのリストから１つの命令コードを読み込む（ステップＳ２５）。そして命令コードがメソッド呼び出しを実行する命令コードかを判定する（ステップＳ２６）。メソッド呼び出しを実行する命令コードでなければ、ステップＳ２５に戻り、次の命令コードを読み込む。またメソッド呼び出しを実行する命令コードであれば、呼び出したメソッド（他のメソッド）についてステップＳ２２以降の処理を再帰的に実行する（ステップＳ２７）。
【００２４】
そして、上記ステップＳ３，ステップＳ３１、ステップＳ４で示したように、ウェブアプリケーション解析部１１は生成した「実行モジュール群」が含まれるソースコードがコンパイル済みかを判定し、コンパイルされていなければ、そのソースコードをコンパイルして中間コードを生成する。そして、ウェブアプリケーション解析部１１は、中間コードに記述されている命令コードを、ユーザ端末からのリクエスト情報に対応して実行する処理の順に、命令コード記憶部１５に格納する。
【００２５】
図８は命令コード記憶部内に格納されるデータ例＜中間（バイト）コード＞を示す図である。
この図で示すように、命令コード記憶部１５の中間（バイト）コードのテーブルにおいて、ウェブアプリケーション解析部１１によって格納された命令コードが記述される。各命令コードは１バイト単位で記録され、各命令コードに対応付けて、その１バイト単位の順番を示すバイトコード位置（命令コードの中間（バイト）コード内のメソッドの先頭を０とした何バイト目かを示す値）が記録される。なお、命令コード記憶部１５における命令コードのバイトコード位置と、ウェブアプリケーションのソースコードにおける記述位置（行番号）が、中間（バイト）コードに記述されているものとする。
【００２６】
図９はプログラム診断装置の処理フローを示す第４の図である。
図１０はプログラム診断装置の処理フローを示す第５の図である。
次に、上述のステップＳ５においては、まず、診断実行部１２が、オペランドスタック１６上において命令コードのエミュレート実行（擬似実行）を指示されると、命令コード記憶部１５に記録されているデータテーブルから１つの命令コードを読み取る。そして、診断実行部１２は、読み取った命令コードが、クラス変数（オブジェクト変数）の参照またはそのクラス変数への書き込みを行なうコード（getstaticまたはputstaticか？）かどうかを判定する（ステップＳ５１）。そして、Ｙｅｓであれば、共有メモリの操作を行う命令コードであると判定し、Ｎｏであれば、共有メモリの操作を行う命令コードでないと判定する。また診断実行部１２は、読み取った命令コードが、インスタンス変数（オブジェクト変数）の参照またはそのインスタンス変数への書き込みを行なうコード（getfieldまたはputfieldか？）かどうかを判定する（ステップＳ５２）。また診断実行部１２は、読み取った命令コードの参照または書き込み対象となるインスタンス変数（オブジェクト変数）が、ウェブアプリケーションのインスタンスかどうかを判定する（ステップＳ５３）。これは命令コードの第１引数が表す判別情報で判別する。そして、ステップＳ５３でＹｅｓであれば、共有メモリの操作（参照／書き込み）を行う命令コードであると判定する。また、ステップＳ５２でＮｏまたはステップＳ５３でＮｏと判定した場合には、共有メモリの操作を行う命令コードでないと判定する。
【００２７】
次に診断実行部１２は、共有メモリの操作を行う命令コードであると判定された命令コードを順に読み込む（ステップＳ５０１）。そして、診断実行部１２は、読み込んだ命令コードのバイトコード位置を、命令コード記憶部１５から読み込む（ステップＳ５０２）。そして、そのバイトコード位置を出力する（ステップＳ５０３）。共有メモリの操作を行う命令コードであると判定された命令コードと、そのバイトコード位置は、一時的にメモリ等に格納される。
【００２８】
図１１はプログラム診断装置の処理フローを示す第６の図である。
次に、診断実行部１２は、前記一時的にメモリに格納された、共有メモリの操作を行う命令コードであると判定された命令コードを取得する（ステップＳ６１）。そして、その命令コードがメモリ参照を示す命令コード（getstatic／putstatic／getfield／putfield）かを判定する（ステップＳ６２）。そしてＹｅｓの場合は、ステップＳ５１〜ステップＳ５３の処理により、共有メモリの操作（参照／書き込み）を行う命令コードと判定されているかの情報がＴｒｕｅであれば、その命令コードと、そのバイトコード位置を対応付けて、メモリ監視履歴ＤＢ内のメモリ監視履歴テーブルに対応付けて書き込む（ステップＳ６３）。そして、その命令コードが、命令コードの実行時に共通資源へのアクセスができないよう制御するロックコマンド（monitorenter）によってロックされるかを判定する（ステップＳ６４）。そして、ロックされる場合であれば、下記に説明するロック／ロック解除対象の変数取得処理によって取得した変数と、その変数が「ロック状態」である旨を示す情報とを対応付けて、メモリ監視履歴テーブルに書き込む（ステップＳ６４）。
【００２９】
また命令コードが、命令コードの実行時に共通資源へのアクセスができない制御の解除を示すロック解除コマンド（monitorexit）によってロック解除されたかを判定する（ステップＳ６５）。そして、ロック解除コマンドによってロック解除されたと判定できれば、下記に説明するロック／ロック解除対象の変数取得処理によって取得した変数と、その変数が「アンロック状態」である旨を示す情報とを対応付けて、メモリ監視履歴テーブルに書き込む（ステップＳ６６）。そして、実行モジュール群の全ての命令コードについて、仮実行を完了したかを判定し（ステップＳ６７）、全ての命令コードについて仮実行の完了を判定した場合には処理を終了する。
【００３０】
図１２はプログラム診断装置の処理フローを示す第７の図である。
図１２は、上述のロック／ロック解除対象の変数取得処理を示す図である。この処理においてはロックコマンド（monitorenter）またはロック解除コマンド（monitorexit）である場合には、その命令コードを読み込む（ステップＳ６０１）。そして、オペランドスタック１６から変数名を読み取り（ステップＳ６０２）、その変数名を出力する（ステップＳ６０３）
【００３１】
図１３はメモリ監視履歴テーブルの例を示す図である。
この図が示すように、メモリ監視履歴テーブルは、共有メモリの操作を行う命令コードであると判定された命令コードと、そのバイトコード位置と、その命令コードが操作する共通資源である変数（オブジェクト）と、その命令コードの実行時に当該変数がロック状態となるかアンロック状態となるかを示す状態の情報と、を対応付けて記憶するテーブルである。
【００３２】
図１４はメモリ監視履歴テーブルと競合条件の判定処理の概要を示す図である。
図１４に示すように、本実施形態においては、メモリ参照を示す命令コードは、putfield（インスタンス変数に値を格納）、getfield（インスタンス変数から値を取得）、putstatic（クラス変数に値を格納）、getstatic（クラス変数から値を取得）のいずれかであり、これらの命令コードと、その命令コードの実行時において共通資源である変数（オブジェクト）が「アンロック状態」となることを示す情報がメモリ監視履歴テーブルに対応付けられている場合にのみ、その命令コードが競合状態を発生する可能性があると判定する。なお、monitorenter（モニタ開始）と、monitorexit（モニタ終了）は、Ｊａｖａ（登録商標）言語で記述されたソースコードにおいて「synchronized修飾子」の記述をバイトコードに変換したものである。
【００３３】
そして、monitorenterと、monitorexitの命令コードの間のバイトコード位置に命令コード記憶部１５に記録される全ての命令コードは、その命令コードの実行時において、共通資源に対して必ずロック状態とするものであるため、メモリ監視履歴テーブルにおいては、monitorenterとmonitorexitの間に入る命令コードの操作する変数の状態は、全て「ロック状態」を示す状態の情報が登録されることとなる。monitorenterとmonitorexitの組合せが複数ある場合には、monitorenterがメモリ監視履歴テーブルに記述される数と、その後monitorexitがメモリ監視履歴テーブルに記述される数によって、monitorenterとmonitorexitの組合せが全て出現したかを判定し、それらの組合せの間の命令コードの操作する変数の状態は全て「ロック状態」となり、monitorenterとmonitorexitの組合せの出現が終了したと判定した後は、「アンロック状態」である旨を示す情報が登録される。
【００３４】
図１５はオペランドスタック上での命令コード仮実行による状態取得の概要を示す図である。
この図が示すように、まず、Ｊａｖａ（登録商標）のソースコードをバイトコードに変換する。そして、バイトコード上にはＬｏｃｋまたはＵｎｌｏｃｋの情報が静的に記述されていない。しかしながら、このバイトコード中の各命令コードを実行するにあたり、ソースコード中のshynchronized識別子に対応するバイトコード内の命令コードがmonitorengerとなり、この命令コードにより、変数（オブジェクト）の状態がLockされたと判定している。
【００３５】
図１６はプログラム診断装置の処理フローを示す第８の図である。
次に、上述のステップＳ７においては、まず、競合状態条件判定部１３が、メモリ監視履歴ＤＢ１７に格納されているメモリ監視履歴テーブルから１つの命令コードのレコードを読み込む（ステップＳ７０１）。そして、命令コードが、メモリ参照を示す命令コードのgetstatic、putstatic、getfield、putfieldのいずれかであり、かつ、その命令コードの実行時において操作する変数がアンロック状態である旨を示す情報（Unlock）と対応付けられてレコードに記録されているかを判定する（ステップＳ７０２）。そして、Ｙｅｓの場合には、競合状態の発生する可能性があり危険であると判断し、その命令コードに対応付けられて記録されているバイトコード位置をメモリ監視履歴テーブルから読み取ってメモリ等に一時記録しておく（ステップＳ７０３）。そして、メモリ監視履歴テーブルに記録されている全ての命令コードのレコードについて処理を行ったかを判定し（ステップＳ７０４）、処理が終了していなければ、ステップＳ７０１〜Ｓ７０４の処理を繰り返す。
【００３６】
図１７はプログラム診断装置の処理フローを示す第９の図である。
次に、上述のステップＳ８においては、まず、競合状態条件判定部１３が、ステップＳ７０３で一時的にメモリ等に記録された、メモリ参照を示す命令コードであって操作する変数がアンロック状態である旨を示す命令コードのバイトコード位置を読み取る（ステップＳ８１）。そして、処理対象のウェブアプリケーションを構成するソースファイル（フィルタプログラム、リスナプログラム、Ｊａｖａ（登録商標）サーブレットプログラム、Ｊａｖａ（登録商標）サーバページプログラムのいずれかのソースファイル）における、バイトコード位置に対応する、ソースコード内の記述位置（行番号）を読み込む（ステップＳ８２）。例えば、上述したように、命令コード記憶部１５における命令コードのバイトコード位置と、ウェブアプリケーションのソースコードにおける記述位置（行番号）が、中間（バイト）コードに格納されているので、この中間（バイト）コードから読み込むようにすれば良い。そして、そのソースコード位置を表示部１４に出力する（ステップＳ８３）。そして、ステップＳ９の処理において、表示部１４が、モニタなどの外部表示装置へ、競合状態の発生する可能性があると検出した命令コードが記述されているプログラムソースコード中の行を、当該プログラムソースコードの表示画面に表示して外部表示装置へ出力する処理を行う。
【００３７】
図１８は表示画面の例を示す図である。
図１８で示すように、表示画面にはソースコード中に警告マーカが表示される。この警告マーカは、当該マーカが付される行のプログラムの記述が、競合状態の発生する可能性があることを示している。ユーザはこの行にsynchronized修飾子を記述することにより、警告マーカが付されている箇所の記述により競合が発生することを回避する。そして、再度、プログラム診断装置１によって診断を行なうことにより、警告マーカが外れた表示画面が出力されることとなる。また、表示画面では、図１８の左下の子画面で示すように、検出結果としてソースコードの行数と、競合状態の発生確度とを示す一覧の画面を表示するようにしてもよい。
【００３８】
以上、本発明の実施形態について説明したが、上述の処理によれば、Ｊａｖａ（登録商標）言語のソースコードから中間コードを生成し、その中間コードから、メモリ参照／書き込みを示す命令コードを検出する。そして、その命令コードの仮実行において、操作する変数がアンロック状態で実行される命令コードであると判定した場合には、その命令コードが記述されているソースコードの位置を画面に表示している。従って、ユーザは、ソースコードの記述が改変されることなく、どのソースコードの位置の記述を、競合状態が発生しないように変更すべきかを検出でき、またその修正を行うことができる。また、メモリ参照／書き込みを示す命令コード全て検出できるため、精度良く、競合状態の発生させる命令コードに対応するソースコードの位置を検出することができる。
【００３９】
なお、上述のプログラム診断装置は内部に、コンピュータシステムを有している。そして、上述した各処理の過程は、プログラムの形式でコンピュータ読み取り可能な記録媒体に記憶されており、このプログラムをコンピュータが読み出して実行することによって、上記処理が行われる。ここでコンピュータ読み取り可能な記録媒体とは、磁気ディスク、光磁気ディスク、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ、半導体メモリ等をいう。また、このコンピュータプログラムを通信回線によってコンピュータに配信し、この配信を受けたコンピュータが当該プログラムを実行するようにしても良い。
【００４０】
また、上記プログラムは、前述した機能の一部を実現するためのものであっても良い。さらに、前述した機能をコンピュータシステムにすでに記録されているプログラムとの組み合わせで実現できるもの、いわゆる差分ファイル（差分プログラム）であっても良い。
【図面の簡単な説明】
【００４１】
【図１】プログラム診断装置の構成を示すブロック図である。
【図２】プログラム診断装置の処理概要を示す図である。
【図３】並列実行されるプログラムの共通資源へのアクセス競合状態の概要を示す図である。
【図４】プログラム診断装置の処理フローを示す第１の図である。
【図５】プログラム診断装置の処理フローを示す第２の図である。
【図６】ユーザリクエスト受信時処理開始メソッド一覧を示す図である。
【図７】プログラム診断装置の処理フローを示す第３の図である。
【図８】命令コード記憶部内に格納されるデータ例＜中間（バイト）コード＞を示す図である。
【図９】プログラム診断装置の処理フローを示す第４の図である。
【図１０】プログラム診断装置の処理フローを示す第５の図である。
【図１１】プログラム診断装置の処理フローを示す第６の図である。
【図１２】プログラム診断装置の処理フローを示す第７の図である。
【図１３】メモリ監視履歴テーブルの例を示す図である。
【図１４】メモリ監視履歴テーブルと競合条件の判定処理の概要を示す図である。
【図１５】オペランドスタック上での命令コード仮実行による状態取得の概要を示す図である。
【図１６】プログラム診断装置の処理フローを示す第８の図である。
【図１７】プログラム診断装置の処理フローを示す第９の図である。
【図１８】表示画面の例を示す図である。
【図１９】ウェブサーバにおける競合状態を示す図である。
【符号の説明】
【００４２】
１・・・プログラム診断装置
１１・・・ウェブアプリケーション解析部
１２・・・診断実行部
１３・・・競合状態条件判定部
１４・・・表示部
１５・・・命令コード記憶部
１６・・・オペランドスタック
１７・・・メモリ監視履歴ＤＢ
【図１】
0004966904.tif 000002
【図２】
0004966904.tif 000003
【図３】
0004966904.tif 000004
【図４】
0004966904.tif 000005
【図５】
0004966904.tif 000006
【図６】
0004966904.tif 000007
【図７】
0004966904.tif 000008
【図８】
0004966904.tif 000009
【図９】
0004966904.tif 000010
【図１０】
0004966904.tif 000011
【図１１】
0004966904.tif 000012
【図１２】
0004966904.tif 000013
【図１３】
0004966904.tif 000014
【図１４】
0004966904.tif 000015
【図１５】
0004966904.tif 000016
【図１６】
0004966904.tif 000017
【図１７】
0004966904.tif 000018
【図１８】
0004966904.tif 000019
【図１９】
0004966904.tif 000020