(57)【特許請求の範囲】
【請求項１】
記憶手段が記憶する、メソッドの集合に関する文脈上の規則情報を、前記記憶手段から読み出して解析する規則解析手順と、
前記メソッドの集合を利用するプログラムによる前記規則情報に係る前記メソッドの実行の検知に応じて該実行の履歴を記録する履歴記録プログラムを生成する履歴記憶プログラム生成手順と、
前記履歴を前記規則情報と照合して、前記プログラムによる前記メソッドの利用が前記規則情報を満たしているか否かを判定する検証プログラムを生成するルール検証プログラム生成手順とをコンピュータが実行し、
前記規則情報は、前記メソッドの呼び出しの要又は前記メソッドの呼び出し順に関する要件を規定するルール要素と、複数の前記ルール要素間の論理関係とを含み、
前記履歴記憶プログラム生成手順は、前記ルール要素に係る前記メソッドの実行の検知に応じて該実行の履歴を記録し、前記履歴に基づいて前記ルール要素に規定された要件が満たされているか否かを判定し、該判定結果を記録する前記履歴記録プログラムを生成し、
前記ルール検証プログラム生成手順は、該判定結果を前記論理関係に当てはめて、前記プログラムによる前記メソッドの呼び出しが前記規則情報を満たしているか否かを判定する前記検証プログラムを生成する文脈違反検出支援方法。
【請求項２】
前記ルール要素は、ｃメソッド内において、ｂメソッドが実行される場合はｂメソッドの実行前にａメソッドが実行されなければならないことを規定し、
前記履歴記憶プログラム生成手順は、ｃメソッドの実行の検知に応じ、ａメソッドが呼び出されていないことを記録し、ａメソッドの実行の検知に応じ、ａメソッドが実行されたことを記録し、ｂメソッドの実行の検知に応じ、ａメソッドが実行されたか否かに基づいて当該ルール要素に規定された要件が満たされたか否かを判定し、該判定結果を記録する前記履歴記録プログラムを生成する請求項１記載の文脈違反検出支援方法。
【請求項３】
前記ルール要素は、ｆメソッド内において、ｅメソッドが実行される場合はｅメソッドの実行後にｄメソッドが実行されなければならないことを規定し、
前記履歴記憶プログラム生成手順は、ｆメソッドの実行の検知に応じ、当該ルール要素に規定された要件が満たされていることを記録し、ｅメソッドの実行の検知に応じ、当該要件が満たされていないことを記録し、ｄメソッドの実行の検知に応じ、当該要件が満たされていることを記録する前記履歴記録プログラムを生成する請求項１記載の文脈違反検出支援方法。
【請求項４】
前記ルール要素は、ｈメソッド内において、ｇメソッドが実行されなければならないことを規定し、
前記履歴記憶プログラム生成手順は、ｈメソッドの実行の検知に応じ、当該ルール要素に規定された要件が満たされていないことを記録し、ｇメソッドの実行の検知に応じ、当該要件が満たされていることを記録する前記履歴記録プログラムを生成する請求項１記載の文脈違反検出支援方法。
【請求項５】
記憶手段が記憶する、メソッドの集合に関する文脈上の規則情報を、前記記憶手段から読み出して解析する規則解析手段と、
前記メソッドの集合を利用するプログラムによる前記規則情報に係る前記メソッドの実行の検知に応じて該実行の履歴を記録する履歴記録プログラムを生成する履歴記憶プログラム生成手段と、
前記履歴を前記規則情報と照合して、前記プログラムによる前記メソッドの利用が前記規則情報を満たしているか否かを判定する検証プログラムを生成するルール検証プログラム生成手段とを有し、
前記規則情報は、前記メソッドの呼び出しの要又は前記メソッドの呼び出し順に関する要件を規定するルール要素と、複数の前記ルール要素間の論理関係とを含み、
前記履歴記憶プログラム生成手段は、前記ルール要素に係る前記メソッドの実行の検知に応じて該実行の履歴を記録し、前記履歴に基づいて前記ルール要素に規定された要件が満たされているか否かを判定し、該判定結果を記録する前記履歴記録プログラムを生成し、
前記ルール検証プログラム生成手段は、該判定結果を前記論理関係に当てはめて、前記プログラムによる前記メソッドの呼び出しが前記規則情報を満たしているか否かを判定する前記検証プログラムを生成する文脈違反検出支援装置。
【請求項６】
記憶手段が記憶する、メソッドの集合に関する文脈上の規則情報を、前記記憶手段から読み出して解析する規則解析手順と、
前記メソッドの集合を利用するプログラムによる前記規則情報に係る前記メソッドの実行の検知に応じて該実行の履歴を記録する履歴記録プログラムを生成する履歴記憶プログラム生成手順と、
前記履歴を前記規則情報と照合して、前記プログラムによる前記メソッドの利用が前記規則情報を満たしているか否かを判定する検証プログラムを生成するルール検証プログラム生成手順とをコンピュータに実行させ、
前記規則情報は、前記メソッドの呼び出しの要又は前記メソッドの呼び出し順に関する要件を規定するルール要素と、複数の前記ルール要素間の論理関係とを含み、
前記履歴記憶プログラム生成手順は、前記ルール要素に係る前記メソッドの実行の検知に応じて該実行の履歴を記録し、前記履歴に基づいて前記ルール要素に規定された要件が満たされているか否かを判定し、該判定結果を記録する前記履歴記録プログラムを生成し、
前記ルール検証プログラム生成手順は、該判定結果を前記論理関係に当てはめて、前記プログラムによる前記メソッドの呼び出しが前記規則情報を満たしているか否かを判定する前記検証プログラムを生成する文脈違反検出支援プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、文脈違反検出支援方法、文脈違反検出支援装置、及び文脈違反検出支援プログラムに関し、特にライブラリの不適切な利用の検出を支援する文脈違反検出支援方法、文脈違反検出支援装置、及び文脈違反検出支援プログラムに関する。
【背景技術】
【０００２】
近年、プログラムの部品化が進み、これらの部品化されたプログラムをファイルとしてまとめた既存のライブラリを利用した、プログラムの開発効率の向上が図られている。ライブラリの中には、含まれる関数又はメソッドの文脈（例えば、呼び出し順等）に関して明確な規則（又は制約）を有るものがある。斯かる規則に従わない場合、ライブラリの本来の機能が有効に得られないといった事態が生じうる。ここでメソッドとは、オブジェクト指向プログラミングやアスペクト指向プログラミング等で、各オブェクト等が持っている自身に対する操作、手続きを表すものである。
【０００３】
顕著な例として、暗号化通信等を行うためのセキュリティ関連のライブラリ（以下、「セキュリティライブラリ」という。）が挙げられる。セキュリティライブラリを利用する際、例えば、不適切な初期化が行われたり、初期化が行われなかったりした場合、本来期待される程度の安全性が確保されないといった事態が発生しうる。
【０００４】
ライブラリが正しく利用されるか否かは、プログラマの知識又は経験等に依存するところが大きい。すなわち、知識不足又は経験不足のプログラマによって作成されたプログラムにおいては、ライブラリが正しく利用されていない可能性が高くなる傾向にある。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００６−２３６３３６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
ライブラリの文脈上の規則に従わないで作成されたプログラムであっても、外見的には正常に動作しているように見える場合がある。但し、セキュリティライブラリの場合は、本来の安全性が確保されないため、非常に危険である。しかしながら、このような規則に対する違反は、プログラムのバグを検出するための通常のテストにおいて検出するのは非常に困難である。
【０００７】
一方で、経験豊富なプログラマが、全てのソースコードを逐一精査するのは、多大な工数を要し、現実的ではない。
【０００８】
本発明は、上記の点に鑑みてなされたものであって、ライブラ内のメソッドに関して文脈上不適切な呼び出しの検出を適切に支援することのできる文脈違反検出支援方法、文脈違反検出支援装置、及び文脈違反検出支援プログラムの提供を目的とする。
【課題を解決するための手段】
【０００９】
そこで上記課題を解決するため、文脈違反検出支援方法は、記憶手段が記憶する、メソッドの集合に関する文脈上の規則情報を、前記記憶手段から読み出して解析する規則解析手順と、前記メソッドの集合を利用するプログラムによる前記規則情報に係る前記メソッドの実行の検知に応じて該実行の履歴を記録する履歴記録プログラムを生成する履歴記憶プログラム生成手順と、前記履歴を前記規則情報と照合して、前記プログラムによる前記メソッドの利用が前記規則情報を満たしているか否かを判定する検証プログラムを生成するルール検証プログラム生成手順とをコンピュータが実行する。
【発明の効果】
【００１０】
ライブラ内のメソッドに関して文脈上不適切な呼び出しの検出を適切に支援することができる。
【図面の簡単な説明】
【００１１】
【図１】本発明の実施の形態における文脈違反検出支援装置のハードウェア構成例を示す図である。
【図２】本発明の実施の形態における文脈違反検出支援装置の機能構成例を示す図である。
【図３】ルール記述を構成するルール要素の例を示す図である。
【図４】ルール記述を構成するオペレータの例を示す図である。
【図５】ルール解析部が実行する処理手順の一例を説明するためのフローチャートである。
【図６】第一のルール記述の一例を示す図である。
【図７】ＸＭＬ形式による第一のルール記述の一例を示す図である。
【図８】第一のルール要素一覧の例を示す図である
【図９】プログラム生成部が実行する処理手順の一例を説明するためのフローチャートである。
【図１０】アスペクト雛形の一例を示す図である。
【図１１】本実施の形態においてライブラリの呼び出し履歴を管理するためのデータ構造の一例を概念的に示す図である。
【図１２】第一のアスペクトコードの具体例を示す図である。
【図１３】Ｂｅｆｏｒｅルール要素に関する履歴記録プログラム生成処理の処理手順の一例を説明するためのフローチャートである。
【図１４】ポイントカット定義雛形の一例を示す図である。
【図１５】履歴記録プログラムにおけるポイントカット定義の第一の具体例を示す図である。
【図１６】ｂｅｆｏｒｅアドバイス定義雛形の一例を示す図である。
【図１７】履歴記録雛形の一例を示す図である。
【図１８】具体的なｂｅｆｏｒｅアドバイス定義の第一の例を示す図である。
【図１９】履歴記録プログラムにおけるポイントカット定義の第二の具体例を示す図である。
【図２０】ａｆｔｅｒアドバイス定義雛形の一例を示す図である。
【図２１】具体的なａｆｔｅｒアドバイス定義の第一の例を示す図である。
【図２２】履歴記録プログラムにおけるポイントカット定義の第三の具体例を示す図である。
【図２３】履歴参照雛形の一例を示す図である。
【図２４】具体的なａｆｔｅｒアドバイス定義の第二の例を示す図である。
【図２５】ルール検証プログラム生成処理の処理手順の一例を説明するためのフローチャートである。
【図２６】ルール検証プログラムにおけるポイントカット定義の具体例を示す図である。
【図２７】ルール評価雛形の一例を示す図である。
【図２８】ルール検証プログラムにおけるａｆｔｅｒアドバイス定義の具体例を示す図である。
【図２９】本実施の形態の第一のルール記述に関して生成される履歴記録プログラム及びルール検証プログラムのアスペクトコードの具体例を示す図である。
【図３０】本実施の形態の第一のルール記述に関して生成される履歴記録プログラム及びルール検証プログラムのアスペクトコードの具体例を示す図である。
【図３１】第二のルール記述の一例を示す図である。
【図３２】第二のルール要素一覧の例を示す図である。
【図３３】本実施の形態の第二のルール記述に関して生成される履歴記録プログラム及びルール検証プログラムのアスペクトコードの具体例を示す図である。
【図３４】本実施の形態の第二のルール記述に関して生成される履歴記録プログラム及びルール検証プログラムのアスペクトコードの具体例を示す図である。
【図３５】Ａｆｔｅｒルール要素に関する履歴記録プログラム生成処理の処理手順の一例を説明するためのフローチャートである。
【図３６】Ｃａｌｌルール要素に関する履歴記録プログラム生成処理の処理手順の一例を説明するためのフローチャートである。
【発明を実施するための形態】
【００１２】
以下、図面に基づいて本発明の実施の形態を説明する。図１は、本発明の実施の形態における文脈違反検出支援装置のハードウェア構成例を示す図である。同図の文脈違反検出支援装置１０は、それぞれバスBで相互に接続されているドライブ装置１００と、補助記憶装置１０２と、メモリ装置１０３と、ＣＰＵ１０４と、インタフェース装置１０５と、表示装置１０６と、入力装置１０７とを有する。
【００１３】
文脈違反検出支援装置１０での処理を実現するプログラムは、ＣＤ−ＲＯＭ等の記録媒体１０１によって提供される。プログラムを記録した記録媒体１０１がドライブ装置１００にセットされると、プログラムが記録媒体１０１からドライブ装置１００を介して補助記憶装置１０２にインストールされる。但し、プログラムのインストールは必ずしも記録媒体１０１より行う必要はなく、ネットワークを介して他のコンピュータよりダウンロードするようにしてもよい。補助記憶装置１０２は、インストールされたプログラムを格納すると共に、必要なファイルやデータ等を格納する。
【００１４】
メモリ装置１０３は、プログラムの起動指示があった場合に、補助記憶装置１０２からプログラムを読み出して格納する。ＣＰＵ１０４は、メモリ装置１０３に格納されたプログラムに従って文脈違反検出支援装置１０に係る機能を実現する。インタフェース装置１０５は、ネットワークに接続するためのインタフェースとして用いられる。表示装置１０６はプログラムによるＧＵＩ（Graphical User Interface）等を表示する。入力装置１０７はキーボード及びマウス等であり、様々な操作指示を入力させるために用いられる。
【００１５】
図２は、本発明の実施の形態における文脈違反検出支援装置の機能構成例を示す図である。同図において、文脈違反検出支援装置１０は、ルール記述記憶部１１、ルール解析部１２、プログラム生成部１３、及び雛形データ記憶部１４等を有する。これら各部は、文脈違反検出支援装置１０にインストールされたプログラムがＣＰＵ１０４に実行させる処理により実現される。
【００１６】
文脈違反検出支援装置１０は、これら各部によって、例えば、或るライブラリを使用して開発されるアプリケーションにおける、当該ライブラリの文脈上のルール（規則）又は制約等（以下、「ルール」で統一する）に対する違反の検出を支援する。文脈上のルールとは、ライブラリに含まれる関数又はメソッドの呼び出しの有無や呼び出しの前後関係（呼び出し順）等に関するルールをいう。
【００１７】
ルール記述記憶部１１は、例えば、アプリケーションより利用されるライブラリについて、補助記憶装置１０２を用いてルール記述を記憶する。ルール記述とは、ライブラリの利用に関する文脈上のルールが所定の形式又は文法によって記述されたテキストデータをいう。本実施の形態において、ルール記述は、ルール要素がオペレータによって接続された式形式によって記述される。ルール要素とは、ルールの最小要素をいう。すなわち、ルール要素単体でも、一つのルール記述が成立しうる。オペレータは、ルール要素間の論理関係を示す記号をいう。
【００１８】
図３は、ルール記述を構成するルール要素の例を示す図である。同図には、４つのルール要素と、それぞれのルール要素のルール記述内における記述形式が示されている。なお、同図において、小文字のアルファベット（ａ〜ｊ）は、ライブラリに含まれる関数又はメソッド（以下、「メソッド」で統一する。）を示す。
【００１９】
一つ目は、ｃメソッド内において、ａメソッドがｂメソッドの実行前の必須条件であることを示すルール要素である。すなわち、ｃメソッド内において、ｂメソッドが実行される場合は、ｂメソッドの実行前にａメソッドが必ず実行されなければならないことを示すルール要素である。当該ルール要素は、「＠Ｂｅｆｏｒｅ（ａ，ｂ，ｃ）」の形式でルール記述に記述される。以下、当該ルール要素を「Ｂｅｆｏｒｅルール要素」という。
【００２０】
二つ目は、ｆメソッド内において、ｄメソッドがｅメソッドの実行後の必須条件であることを示すルール要素である。すなわち、ｆメソッド内において、ｅメソッドが実行される場合は、ｅメソッドの実行後に必ずｄメソッドが実行されなければならないことを示すルール要素である。当該ルール要素は、「＠Ａｆｔｅｒ（ｄ，ｅ，ｃ）」の形式でルール記述に記述される。以下、当該ルール要素を「Ａｆｔｅｒルール要素」という。
【００２１】
三つ目は、ｈメソッド内におけるｇメソッドの呼び出しが必須条件であることを示すルール要素である。すなわち、ｇメソッドが、ｈメソッド内において必ず呼び出されなければならないことを示すルール要素である。当該ルール要素は、「＠Ｃａｌｌ（ｇ，ｈ）」の形式でルール記述に記述される。以下、当該ルール要素を「Ｃａｌｌルール要素」という。
【００２２】
四つ目は、引数の型が指定されたメソッドの呼び出しの必須条件を示すルール要素である。すなわち、ｉメソッドについて、特定の型の引数が指定されたバージョンがｊメソッド内において必ず呼び出されなければならないことを示すルール要素である。当該ルール要素は、「＠Ｃａｌｌ（ｉ（型），ｊ）」の形式でルール記述に記述される。以下、当該ルール要素を「型指定Ｃａｌｌルール要素」という。
【００２３】
また、図４は、ルール記述を構成するオペレータの例を示す図である。同図には４つのオペレータと、それぞれのオペレータのルール記述内における記述形式が示されている。
【００２４】
一つ目は、（式ｋ）かつ（式ｌ）の関係を示すためのオペレータである。すなわち、（式ｋ）及び（式ｌ）の双方が必ず満たされなければならないというルールを記述するためのオペレータである。当該オペレータは、「＆＆」によってルール記述に記述される。
【００２５】
二つ目は、（式ｍ）または（式ｎ）の関係を示すためのオペレータである。すなわち、（式ｍ）又は（式ｎ）のいずれか一方が満たされなければならないというルールを記述すためのオペレータである。当該オペレータは、「｜｜」によってルール記述に記述される。
【００２６】
三つ目は、（式ｏ）ならば（式ｐ）の関係を示すためのオペレータである。すなわち、（式ｏ）が満たされる場合は、（式ｐ）が必ず満たされなければならないというルールを記述するためのオペレータである。当該オペレータは、「−＞」によってルール記述に記述される。
【００２７】
四つ目は、（式ｑ）の否定を示すためのオペレータである。すなわち、（式ｑ）が満たされてはならないというルールを記述ためのオペレータである。当該オペレータは、「！」によってルール記述に記述される。
【００２８】
なお、ルールは、ライブラリごとに異なる。したがって、ルール記述は、例えば、ライブラリの開発者、又はライブラリの使用者の中でライブラリの仕様に精通している者等によってライブラリごとに作成される。
【００２９】
ルール解析部１２は、ルール記述記憶部１１に記録されているルール記述を解析し、ルール記述の内容を、コンピュータ（プログラム生成部１３）が処理し易い形式に変換する。より詳しくは、ルール解析部１２は、ルール記述よりその構成要素（後述されるルール要素一覧及び式構造）を抽出する。すなわち、ルール記述は、人によって記述されうるため、人に理解し易い形式を有する。一方、人に理解し易い形式は、コンピュータによるロジカルな処理には不向きである傾向がある。そこで、ルール解析部１２は、人とコンピュータ（プログラム生成部１３）との間を仲介するための処理を実行する。
【００３０】
プログラム生成部１３は、ルール解析部１２による解析結果（ルール解析部１２によって抽出されたルール記述の構成要素）に基づいて、ルール違反を検出するためのプログラムのソースコードを自動的に生成する。より詳しくは、プログラム生成部１３は、履歴記録プログラム生成部１３１及びルール検証プログラム生成部１３２等を含む。履歴記録プログラム生成部１３１は、ルール違反を検出するためのプログラムの一部として履歴記録プログラムＰｒを生成する。ルール検証プログラム生成部１３２は、ルール違反を検出するためのプログラムの一部としてルール検証プログラムＰｃを生成する。
【００３１】
履歴記録プログラムＰｒは、開発対象のアプリケーションによるメソッドの呼び出し（メソッドの実行）を検知し、当該呼び出しの履歴を記録するプログラムである。ルール検証プログラムＰｃは、履歴記録プログラムＰｒによって記録された履歴に基づいて、ルール違反の有無を検証するプログラムである。
【００３２】
なお、履歴記録プログラムＰｒ及びルール検証プログラムＰｃは、アスペクト指向プログラミングに基づいて作成される。アスペクト指向プログラミングが有する特長の一つが、本実施の形態に好適だからである。当該特長は、対象のプログラム（本実施の形態におけるライブラリ）の外側から当該対象のプログラムに対して作用することができるという性質である。斯かる性質により、ライブラリ側に変更を加えずに、ライブラリのメソッドの呼び出し（実行）を検知等することができる。本実施の形態では、アスペクト指向プログラミング言語として、ＡｓｐｅｃｔＪを利用する。但し、他の言語が用いられてもよい。
【００３３】
雛形データ記憶部１４は、履歴記録プログラムＰｒ又はルール検証プログラムＰｃのソースコードの雛形となるデータ（雛形データ）を補助記憶装置１０２を用いて記憶する。
【００３４】
以下、文脈違反検出支援装置１０の処理手順について説明する。図５は、ルール解析部が実行する処理手順の一例を説明するためのフローチャートである。同図の処理は、例えば、ユーザによって入力される、処理の開始指示に応じて開始される。当該指示において、解析対象のルール記述の識別情報が指定される。なお、ルール記述の識別情報を、以下「ルール名」という。
【００３５】
ステップＳ１０１において、ルール解析部１２は、指定されたルール名に係るルール記述をルール記述記憶部１１よりメモリ装置１０３に読み込む。すなわち、ルール記述は、ルール名に関連付けられてルール記述記憶部１１に記憶されている。
【００３６】
図６は、第一のルール記述の一例を示す図である。同図に示されるルール記述ｒｄ１は、記述ｄ１１及び記述ｄ１２を含む。
【００３７】
記述ｄ１１は、ルール記述ｒｄ１の対象となるメソッド名を示す。したがって、記述ｄ１１より、ルール記述ｒｄ１は、メソッド「SSLSocket.startHandshake()」に関するルール記述であることが分かる。なお、一つのルール記述内に、複数のメソッドに関するルールが記述されてもよい。また、対象となるメソッド名を示す記述は、必須ではない。
【００３８】
記述ｄ１２は、ルールを示す式である。記述ｄ１２では、二つのＢｅｆｏｒｅルール要素が「−＞」オペレータによって接続されている。第一項のＢｅｆｏｒｅルール要素は、「@Before(X509TrustManager.checkServerTrusted(),SSLSocket.startHandshake(),httpServlet.doPost())」であり、第二項のＢｅｆｏｒｅルール要素は、「@Before(X509Certificate.checkValidity(),SSLSocket.startHandshake(),httpServlet.doPost()))」である。
【００３９】
したがって、記述ｄ１２に係る式は、「httpServlet.doPost()内において、SSLSocket.startHandshake()より前にX509TrustManager.checkServerTrusted()が実行される場合（実行されるならば）、httpServlet.doPost()内において、SSLSocket.startHandshake()より前にX509Certificate.checkValidity()が実行されなければならない。」というルールを示す。
【００４０】
ルール記述ｒｄ１２は、Ｊａｖａ（登録商標）のＳＳＬ（Secure Socket Layer）クライアントとしてのアプリケーションの実装におけるＳＳＬＳｏｃｋｅｔライブラリの利用に関するルールを記述したものである。
【００４１】
すなわち、ＳＳＬ通信では、サーバ証明書が信頼できるものか否かを検証することが必要とされる。Ｊａｖａ（登録商標）のＳＳＬＳｏｃｋｅｔライブラリは、startHandshake()を呼び出してハンドシェークを開始する場合、証明書の検証処理は自動的に行われるため通常は問題ない。但し、X509TrustManagerの実装クラスにおいてcheckServerTrusted()がオーバーライドされた場合、上記証明書の検証処理は、オーバーライドされてしまう。したがって、この場合、上記証明書の検証処理は、アプリケーションの開発者が適切に実装しなければならない。
【００４２】
したがて、ＳＳＬクライアントとしてのアプリケーションを実装する場合におけるＳＳＬＳｏｃｋｅｔライブラリの利用に関するルールは、以下のようになる。
【００４３】
対象メソッド：javax.net.ssl.SSLSocket#startHandshake()
ルール：サーブレッドから呼び出された処理内において、javax.net.ssl.SSLSocket#startHandshake()よりも前に、X509TrustManager(の実装クラス)の checkServerTrusted()が実行される場合、必ずX509Certificate#checkValidity()も実行されなければならない
当該ルールをルール要素及びオペレータを用いて表現したものが、ルール記述ｒｄ１である。
【００４４】
なお、ここでは、サーブレットから呼び出されるＷｅｂアプリケーションがアプリケーションの例とされている。また、httpServlet.doPost()は、Ｗｅｂサーバにおいて、ＨＴＴＰリクエストのＰＯＳＴコマンドが受信されたときに呼び出されるメソッドである。したがって、「サーブレットから呼び出された処理」に対して、「httpServlet.doPost()」が当てはめられている。
【００４５】
ルール記述は、その解析処理の便宜を考慮して、ＸＭＬ形式等の構造化文書形式によって記述されてもよい。
【００４６】
図７は、ＸＭＬ形式による第一のルール記述の一例を示す図である。同図のルール記述ｒｄ２は、図６のルール記述ｒｄ１において定義されているルールと同じルールをＸＭＬ形式によって記述したものである。
【００４７】
ルート要素であるｒｕｌｅ要素（＜ｒｕｌｅ＞タグによって囲まれた要素）のｌｉｂｒａｒｙ属性の値（「SSLSocket.startHandshake()」は、対象となるメソッド名を示す。ｒｕｌｅ要素の子要素ｒｄ２１のタグ名（「−＞」）は、当該子要素の値として含まれている二つのＢｅｆｏｒｅルール要素を接続するオペレータを示す。ｂｅｆｏｒｅ要素ｒｄ２２は、図６の記述ｄ１２における第一項のＢｅｆｏｒｅルール要素に対応する。ｂｅｆｏｒｅ要素ｒｄ２３は、図６の記述ｄ１２における第二項のＢｅｆｏｒｅルール要素に対応する。すなわち、各ｂｅｆｏｒｅ要素において、ｐｒｏｃ属性、ｓｕｃｃ要素、ｗｉｔｈｉｎ要素は、それぞれ、Ｂｅｆｏｒｅ要素のａメソッド、ｂメソッド、ｃメソッド（図３参照）に対応する。
【００４８】
ＸＭＬ形式のデータは、既存のＸＭＬパーサによって解析が容易である。したがって、ルール解析部１２の処理内容を簡便化することができる。
【００４９】
続いて、ルール解析部１２は、読み込んだルール記述の構造を解析する（Ｓ１０２）。具体的には、ルール記述内のルール要素とオペレータとが分解され、構造化される。すなわち、各ルール要素間の論理関係がルール解析部１２によって認識される。なお、ルール記述が図７に示されるようにＸＭＬ形式の場合、ＸＭＬパーサによってＤＯＭ（Document Object Model）形式に読み込まれることが、ステップＳ１０２でいうところの解析に相当する。したがって、ルール記述が構造化文書形式によって記述されている場合、ステップＳ１０１及びＳ１０２は、実質的に一つのステップとなりうる。
【００５０】
続いて、ルール解析部１２は、必要に応じてルール記述の式を変形（又は変換）する（Ｓ１０３）。本実施の形態では、オペレータ「−＞」を含む式に関して、オペレータ「！」及び「｜｜」を用いて変形（又は変換）が行われる。具体的には、「Ａ−＞Ｂ」の構造を有する式は、「！Ａ｜｜Ｂ」に変形される。双方の式においてＡとＢとの論理関係は同じであるところ、「！」及び「｜｜」のオペレータの方が、式の論理値（真偽値）の評価（式が示すルールが満たされているか否かの評価）をし易いからである。なお、ここでの「Ａ」及び「Ｂ」は、一つのルール要素又は式を示す。ステップＳ１０３において、オペレータ「−＞」は、全て解決（置換）される。
【００５１】
続いて、ルール解析部１２は、ルール記述ｒｄ１の解析結果よりルール要素を抽出する（Ｓ１０４）。続いて、ルール解析部１２は、抽出されたルール要素ごとに変数名を生成する（割り当てる）（Ｓ１０５）。変数名とは、ルール要素の論理値（真偽値）を記憶するための変数に対する識別名である。ルール要素間で一意性が保証されれば変数名の命名規則は所定のものに限定されない。続いて、ルール解析部１２は、ルール要素と変数名との組の一覧を、ルール名に関連付けて補助記憶装置１０２に記録（出力）する（Ｓ１０６）。当該一覧を以下「ルール要素一覧」という。
【００５２】
図８は、第一のルール要素一覧の例を示す図である。同図のルール要素一覧ｒＬ１は、図６に示したルール記述ｒｄ１に基づいて生成されるルール要素一覧である。同図では、第一項のＢｅｆｏｒｅルール要素に対して、変数名「Ｒ１」が割り当てられ（生成され）、第二項のＢｅｆｏｒｅルール要素に対して、変数名「Ｒ２」が割り当てられた例が示されている。
【００５３】
続いて、ルール解析部１２は、ルール記述の式における各ルール要素を、当該ルール要素に対応する変数名によって置き換えたものを、式構造とする（Ｓ１０７）。なお、ステップＳ１０３において変形された式については、変形後の式が置換の対象とされる。図６のルール要素記述ｒｄ１及び図８のルール要素一覧ｒＬ１に基づく式構造は、以下の（１）のようになる。
【００５４】
！Ｒ１｜｜Ｒ２  ・・・（１）
【００５５】
なお、ルール記述ｒｄ１の各ルール要素について、単純に変数名への置換を行った結果は、
Ｒ１−＞Ｒ２
であるが、ステップＳ１０３における変形により、ルール記述ｒｄ１より抽出される式構造は、上記（１）の通りとなる。
【００５６】
続いて、ルール解析部１２は、式構造をルール名に関連付けて補助記憶装置１０２に記録（出力）する（Ｓ１０８）。
【００５７】
続いて、プログラム生成部１３の処理手順について説明する。図９は、プログラム生成部が実行する処理手順の一例を説明するためのフローチャートである。同図の処理は、例えば、ユーザによって入力される、処理の開始指示に応じて開始される。当該指示において、ルール名が指定される。
【００５８】
ステップＳ２０１において、プログラム生成部１３は、アスペクトの雛形（アスペクト雛形）を雛形データ記憶部１４よりメモリ装置１０３に読み込む。
【００５９】
図１０は、アスペクト雛形の一例を示す図である。同図に示されるように、アスペクト雛形は、アスペクト指向プログラミング言語（ＡｓｐｅｃｔＪ）におけるアスペクトの定義の雛形である。同図のアスペクト雛形ｔ１において、アスペクト名は、パラメタ化されている。すなわち、アスペクト名には具体的な値ではなく、「＜アスペクト名＞」が記述されている。また、アスペクト雛形ｔ１には、一行のステップｓ１１が記述されている。ステップｓ１１では、ＭＡＰ＜ＭＡＰ＞型の変数ｖａｒＴａｂｌｅのメモリへの生成が定義されている。ＭＡＰ＜ＭＡＰ＞型とは、キー名とＭＡＰ型の変数とを関連付けて記憶することのできるデータ型をいう。本実施の形態では、斯かるＭＡＰ＜ＭＡＰ＞型の変数ｖａｒＴａｂｌｅを用いて、ライブラリのメソッドの呼び出し履歴（実行履歴）を管理する。
【００６０】
図１１は、本実施の形態においてライブラリの呼び出し履歴を管理するためのデータ構造の一例を概念的に示す図である。
【００６１】
同図には、変数ｖａｒＴａｂｌｅが、便宜上、テーブル形式によって表現されている。変数ｖａｒＴａｂｌｅは、キーとしてスレッドの識別子を記憶し、値として履歴テーブルを記憶する。スレッドの識別子とは、アプリケーションによるライブラリの適否の検証時において履歴記録プログラムＰｒが動作するスレッドの識別子である。マルチスレッド環境では、履歴記録プログラムＰｒは、複数のスレッド上で並列的に実行されうる。そして、ライブラリに関するルール記述（文脈に関するルール）は、スレッドごとに満たされる必要がある。そこで、変数ｖａｒＴａｂｌｅは、スレッドごとに履歴テーブルを対応付けて記憶する。なお、通信用のライブラリの場合は、変数ｖａｒＴａｂｌｅにおいて、セッションごとに（セッションＩＤに対応付けて）履歴テーブルが記憶されてもよい。また、スレッド又はセッション以外の単位で、ルール記述が満たされる必要が有る場合、当該単位ごとに、履歴テーブルが対応付けられればよい。
【００６２】
一方、履歴テーブルとは、本実施の形態において生成される履歴記録プログラムＰｒ内においてｃｕｒｒｅｎｔＴａｂｌｅという変数名によって参照される、ＭＡＰ＜ｂｏｏｌｅａｎ＞型の変数である。ｃｕｒｒｅｎｔＴａｂｌｅ変数（履歴テーブル）は、キーとしてルール要素の変数名又はルール要素内のメソッドごとに割り当てられる変数名を記憶し、値として当該ルール要素が満たされているか否かを示す真偽値、又は当該メソッドが呼び出されたか（実行されたか）否かを示す真偽値を記憶する。
【００６３】
続いて、プログラム生成部１３は、アスペクト雛形ｔ１の＜アスペクト名＞に対して、ユーザによって指定されたルール名を当てはめて（＜アスペクト名＞をルール名によって置換して）、当該ルール名に係るルール記述ｒｄ１に対応した具体的なアスペクトのソースコード（アスペクトコード）を生成する（Ｓ２０２）。
【００６４】
図１２は、第一のアスペクトコードの具体例を示す図である。同図におけるアスペクトコードａｃ１では、図１０の「＜アスペクト名＞」が、「ＳＳＬＳｏｃｋｅｔ」に置換されている。すなわち、本実施の形態において、ルール記述ｒｄ１に関するルール名は、「ＳＳＬＳｏｃｋｅｔ」であるとする。
【００６５】
なお、ステップＳ２０２では、ルール名の当てはめだけでなく、ルール名が当てはめられたアスペクトコードａｃ１を含むファイルが補助記憶装置１０２に生成される。
【００６６】
続いて、履歴記録プログラム生成部１３１は、指定されたルール名に関連付けられているルール要素一覧ｒＬ１及び式構造を補助記憶装置１０２からメモリ装置１０３に読み込む（Ｓ２０３）。続いて、履歴記録プログラム生成部１３１は、読み込まれたルール要素一覧ｒＬ１の中で、未処理のルール要素を処理対象とする（Ｓ２０４）。未処理のルール要素とは、ステップＳ２０５の処理対象とされていないルール要素をいう。したがって、最初は、読み込まれた全てのルール要素一覧ｒＬ１に含まれる全てのルール要素が未処理のルール要素である。
【００６７】
続いて、履歴記録プログラム生成部１３１は、処理対象のルール要素（以下、「カレントルール要素」という。）について、履歴記録プログラムＰｒの生成処理を実行する（Ｓ２０５）。履歴記録プログラムＰｒの生成処理においては、カレントルール要素について、履歴記録プログラムＰｒとしてのソースコードが、ステップＳ２０２において生成されたアスペクトコードａｃ１に追加される。ステップＳ２０５は、読み込まれたルール要素一覧ｒＬ１に含まれる全てのルール要素について順番に実行される（Ｓ２０６）。
【００６８】
続いて、ルール検証プログラム生成部１３２は、ルール検証プログラムＰｃの生成処理を実行する（Ｓ２０７）。ルール検証プログラムＰｃの生成処理においては、指定されたルール名に対応するルール記述に対するルール検証プログラムＰｃとしてのソースコードが、ステップＳ２０２において生成されたアスペクトコードａｃ１に追加される。したがって、履歴記録プログラムＰｒとルール検証プログラムＰｃとは、ファイル単位としては（ソースコードの単位としては）、一つのソースコードとして生成される。
【００６９】
続いて、ステップＳ２０５の履歴記録プログラムＰｒの生成処理の詳細について説明する。履歴記録プログラムＰｒの生成処理は、カレントルール要素が、Ｂｅｆｏｒｅルール要素、Ａｆｔｅｒルール要素、Ｃａｌｌルール要素、又は型指定Ｃａｌｌルール要素のいずれのタイプであるかに応じて異なる。したがって、履歴記録プログラム生成部１３１は、カレントルール要素が、いずれのタイプであるかを判定し、処理を分岐させる。以下、分岐後の各処理手順について説明する。
【００７０】
まず、Ｂｅｆｏｒｅルール要素（＠Ｂｅｆｏｒｅ（ａ，ｂ，ｃ））に関する履歴記憶プログラムの生成処理について説明する。当該生成処理では、要するに次のような処理を実行する履歴プロログラムが生成される。以下の説明において、ａメソッド、ｂメソッド、ｃメソッドとは、＠Ｂｅｆｏｒｅ（ａ，ｂ，ｃ）における、ａメソッド、ｂメソッド、又はｃメソッドをいう。
【００７１】
（１）ｃメソッドの実行をフックし（検知し）、Ｂｅｆｏｒｅルール要素の評価値（当該要素の要件が満たされているか否かを示す真偽値）をｔｒｕｅとする。また、ａメソッドは実行されていないことを記録する。
【００７２】
（２）ａメソッドの実行をフックし（検知し）、ａメソッドが実行されたことを記録する。
【００７３】
（３）ｂメソッドの実行をフックし（検知し）、ａメソッドが実行されたか否かを示す真偽値を、当該Ｂｅｆｏｒｅルール要素の評価値とする。
【００７４】
したがって、ｂメソッドが実行されたにも拘わらず、ｂメソッドの実行前にａメソッドが実行されていない場合は、評価値はｆａｌｓｅとなる履歴記憶プログラムが生成される。
【００７５】
以下、斯かる履歴記録プログラムＰｒの生成処理の詳細について説明する。
【００７６】
図１３は、Ｂｅｆｏｒｅルール要素に関する履歴記録プログラム生成処理の処理手順の一例を説明するためのフローチャートである。すなわち、同図は、カレントルール要素がＢｅｆｏｒｅルール要素である場合の履歴記録プログラムＰｒの生成処理の処理手順の一例である。
【００７７】
ステップＳ３０１において、カレントルール要素のｃメソッドの呼び出しをフックするためのポイントカット定義をアスペクトコードａｃ１に追加生成する。具体的には、履歴記録プログラム生成部１３１は、雛形データ記憶部１４よりポイントカット定義雛形を取得し、ポイントカット定義雛形にカレントルール要素のｃメソッドを当てはめた結果をアスペクトコードａｃ１に追加する。なお、ポイントカット定義とは、アスペクト指向プログラミング言語において、１以上のジョインポイントの集合の定義をいう。ジョインポイントとは、アスペクトをウィーブするコード上のポイントをいう。すなわち、ジョインポイントとは、対象のプログラムにおいて、フックする位置をいう。
【００７８】
図１４は、ポイントカット定義雛形の一例を示す図である。同図のポイントカット定義雛形ｔ２において、ポイントカット名と、ジョインポイントとされるメソッドのメソッド名とは、それぞれ、＜ポイントカット名＞又は＜メソッド名＞としてパラメタ化されている。なお、ポイントカット定義雛形ｔ２のポイントカットタイプは、ｃａｌｌである。したがって、ポイントカット定義雛形ｔ２は、＜メソッド名＞に係るメソッドの呼び出しをジョインポイントとするポイントカット定義の雛形である。
【００７９】
ステップＳ３０１において、履歴記録プログラム生成部１３１は、ポイントカット定義雛形ｔ２の＜ポイントカット名＞を適当な値に置換し、＜メソッド名＞をカレントルール要素のｃメソッドのメソッド名に置換して、当該ｃメソッドに対するポイントカット定義を生成する。
【００８０】
図１５は、履歴記録プログラムにおけるポイントカット定義の第一の具体例を示す図である。同図のポイントカット定義ｐｃ１１は、図１４のポイントカット定義雛形ｔ２に対して、図８の１行目のルール要素（以下、「ルール要素Ｒ１」という。）のｃメソッドが当てはめられた場合に生成されるポイントカット定義である。すなわち、現段階において、ルール要素Ｒ１がカレント要素であるとする。
【００８１】
ポイントカット定義ｐｃ１１において、ポイントカット定義雛形ｔ２の＜ポイントカット名＞は、「ｃａｌｌＲ１−ｃ」に置換されている。また、ポイントカット定義雛形ｔ２の＜メソッド名＞は、ルール要素Ｒ１におけるｃメソッドのメソッド名「httpServlet.doPost()」に置換されている。なお、ポイントカット名は、各ポイントカット定義間で一意性が保証され、かつ、プログラミング言語の仕様の範囲内において、任意の文字列が指定されてよい。本実施の形態では、Ｂｅｆｏｒｅルール要素のｃメソッドに対するポイントカット名は、「ｃａｌｌ＜カレントルール要素の変数名＞−ｃ」という命名規則に従って生成される。＜カレントルール要素の変数名＞は、カレントルール要素に対する変数名によって置換される。ルール要素Ｒ１の変数名は、「Ｒ１」であるため、「Ｒ１」に置換される。
【００８２】
続いて、履歴記録プログラム生成部１３１は、ポイントカット定義ｐｃ１１に対するｂｅｆｏｒｅアドバイス定義ａｄ１１（図３３参照）を、アスペクトコードａｃ１に追加生成する（Ｓ３０２）。具体的には、履歴記録プログラム生成部１３１は、雛形データ記憶部１４よりｂｅｆｏｒｅアドバイス定義雛形を取得し、ｂｅｆｏｒｅアドバイス定義雛形に基づいてｂｅｆｏｒｅアドバイス定義を生成する。
【００８３】
アドバイスとは、アスペクト指向プログラミング言語において、ジョイントポイントに対して実行される処理をいう。アドバイスのうち、ｂｅｆｏｒｅアドバイスは、「事前処理」を意味する。すなわち、ｂｅｆｏｒｅアドバイスは、ジョイントポイントの実行前に織り込まれる（組み込まれる）処理である。
【００８４】
図１６は、ｂｅｆｏｒｅアドバイス定義雛形の一例を示す図である。同図のｂｅｆｏｒｅアドバイス定義ｔ５において、ポイントカット名は、＜ポイントカット名＞としてパラメタ化されている。
【００８５】
また、ｂｅｆｏｒｅアドバイス定義雛形ｔ５は、３つの処理ステップを含む。３つの処理ステップを含む。ステップｓ５１は、現在のスレッドの識別子を取得する。ステップｓ５２は、変数ｖａｒＴａｂｌｅ（図１１参照）より、現在のスレッドに対応する履歴テーブルを取得し、変数ｃｕｒｒｅｎｔＴａｂｌｅに代入する。ステップｓ５３は、現在のスレッドに対応する履歴テーブルがまだ生成されていない場合は生成し、生成された履歴テーブルを変数ｃｕｒｒｅｎｔＴａｂｌｅに代入する。
【００８６】
ステップＳ３０２において、履歴記録プログラム生成部１３１は、ｂｅｆｏｒｅアドバイス定義雛形ｔ５の＜ポイントカット名＞を、ステップＳ３０１において生成したポイントカット名（「ｃａｌｌＲ１−ｃ」）に置換することによりｂｅｆｏｒｅアドバイス定義を生成する。
【００８７】
続いて、履歴記録プログラム生成部１３１は、カレントルール要素の要件が満たされたことを暫定的に履歴テーブル（変数ｃｕｒｒｅｎｔＴａｂｌｅ）へ記録するためのステップをｂｅｆｏｒｅアドバイス定義に対して追加する（Ｓ３０３）。具体的には、履歴記録プログラム生成部１３１は、履歴記録雛形を雛形データ記憶部１４より取得し、履歴記録雛形に基づいて、履歴テーブルへの記録処理に関するステップを追加する。
【００８８】
図１７は、履歴記録雛形の一例を示す図である。同図の履歴記録雛形ｔ４において、履歴テーブル（変数ｃｕｒｒｅｎｔＴａｂｌｅ）に記録（設定）されるキー名と値とは、それぞれ＜キー名＞、＜値＞としてパラメタ化されている。ステップＳ３０３において、履歴記録プログラム生成部１３１は、＜キー名＞を、カレントルール要素（ルール要素Ｒ１）のｃメソッドに対する変数名（Ｒ１）によって置換し、＜値＞をｔｒｕｅによって置換した結果をｂｅｆｏｒｅアドバイス定義に追加する。なお、ステップｓ４１及びｓ４２の詳細については後述する。
【００８９】
続いて、履歴記録プログラム生成部１３１は、ａメソッドは実行されていないことを履歴テーブル（変数ｃｕｒｒｅｎｔＴａｂｌｅ）へ記録するためのステップをｂｅｆｏｒｅアドバイス定義に対して追加する（Ｓ３０４）。具体的には、履歴記録プログラム生成部１３１は、履歴記録雛形ｔ４の＜キー名＞を、カレントルール要素（ルール要素Ｒ１）のａメソッドに対する変数名によって置換し、＜値＞をｆａｌｓｅによって置換した結果をｂｅｆｏｒｅアドバイス定義に追加する。当該ａメソッドに対する変数名は、本実施の形態において、「＜カレントルール要素の変数名＞−ｐｒｅｄ」という命名規則に従って生成される。したがって、ルール要素Ｒ１のａメソッドに関して、＜キー名＞は、「Ｒ１−ｐｒｅｄ」という値によって置換される。
【００９０】
ステップＳ３０４の実行により、ステップＳ３０１において生成されたポイントカット定義に対する具体的なｂｅｆｏｒｅアドバイス定義は完成する。図１８は、具体的なｂｅｆｏｒｅアドバイス定義の第一の例を示す図である。
【００９１】
同図のｂｅｆｏｒｅアドバイス定義ａｄ１１に含まれる各ステップについて、図１６又は図１７と同ステップには、同一ステップ番号を付している。
【００９２】
ステップｓ５１〜ｓ５３については、図１６において説明した通りである。ステップｓ４１−１は、カレントルール要素の変数名「Ｒ１」のキー名に対して、ｔｒｕｅを履歴テーブルに記録する。すなわち、ｃメソッドの実行前に、ルール要素Ｒ１の要件が満たされたことが、暫定的に当該履歴テーブルに記録される。同図のｂｅｆｏｒｅアドバイス定義ａｄ１１は、ポイントカット定義ｐｃ１１の作用により、当該ｃメソッドの実行前に実行されるからである。ステップｓ４２−１は、現在のスレッドの識別子に対応付けて当該履歴テーブルを変数ｖａｒＴａｂｌｅに格納する。その結果、現在のスレッドにおいて、ルール要素Ｒ１の要件が満たされたことが暫定的に変数ｖａｒＴａｂｌｅに記録されたことになる。
【００９３】
ステップｓ４１−２は、履歴テーブル（ｃｕｒｒｅｎｔＴａｂｌｅ）に、カレントルール要素のａメソッドに対する変数名（「Ｒ１−ｐｒｅｄ」）に対してｆａｌｓｅを記録する。すなわち、当該ａメソッドは実行されていないことが当該履歴テーブルに記録される。ステップｓ４２−２は、現在のスレッドの識別子に対応付けて当該履歴テーブルを変数ｖａｒＴａｂｌｅに格納する。その結果、現在のスレッドにおいて、当該ａメソッドは実行されていないことが変数ｖａｒＴａｂｌｅに記録されたことになる。
【００９４】
続いて、履歴記録プログラム生成部１３１は、カレントルール要素のａメソッドの呼び出しをフックするためのポイントカット定義をアスペクトコードａｃ１に追加生成する（Ｓ３０５）。具体的には、履歴記録プログラム生成部１３１は、ポイントカット定義雛形ｔ２（図１４）の＜ポイントカット名＞を適当な値に置換し、＜メソッド名＞をカレントルール要素のａメソッドのメソッド名に置換して、当該ａメソッドに対するポイントカット定義を生成する。
【００９５】
図１９は、履歴記録プログラムにおけるポイントカット定義の第二の具体例を示す図である。同図のポイントカット定義ｐｃ１２は、図１４のポイントカット定義雛形ｔ２に対して、ルール要素Ｒ１（図８）のａメソッドが当てはめられた場合に生成されるポイントカット定義である。
【００９６】
ポイントカット定義ｐｃ１２において、ポイントカット定義雛形ｔ２の＜ポイントカット名＞は、「ｃａｌｌＲ１−ｐｒｅｄ」に置換されている。また、ポイントカット定義雛形ｔ２の＜メソッド名＞は、ルール要素Ｒ１におけるａメソッドのメソッド名「X509TrustManager.checkServerTrusted()」に置換されている。なお、Ｂｅｆｏｒｅルール要素のａメソッドに対するポイントカット名は、「ｃａｌｌ＜カレントルール要素の変数名＞−ｐｒｅｄ」という命名規則に従って生成される。
【００９７】
続いて、履歴記録プログラム生成部１３１は、ステップＳ３０５において生成したポイントカット定義に対するａｆｔｅｒアドバイス定義をアスペクトコードａｃ１に追加生成する（Ｓ３０６）。具体的には、履歴記録プログラム生成部１３１は、雛形データ記憶部１４よりａｆｔｅｒアドバイス定義雛形を取得し、ａｆｔｅｒアドバイス定義雛形に基づいてａｆｔｅｒアドバイス定義を生成する。
【００９８】
ａｆｔｅｒアドバイスは、「事後処理」を意味する。すなわち、ａｆｔｅｒアドバイスは、ジョイントポイントの実行後に織り込まれる（組み込まれる）処理である。
【００９９】
図２０は、ａｆｔｅｒアドバイス定義雛形の一例を示す図である。同図のａｆｔｅｒアドバイス定義雛形ｔ３において、ポイントカット名は、＜ポイントカット名＞としてパラメタ化されている。
【０１００】
また、ａｆｔｅｒアドバイス定義雛形ｔ３は、３つの処理ステップを含む。ステップｓ３１は、現在のスレッドの識別子を取得する。ステップｓ３２は、変数ｖａｒＴａｂｌｅ（図１１参照）より、現在のスレッドに対応する履歴テーブルを取得し、変数ｃｕｒｒｅｎｔＴａｂｌｅに代入する。ステップｓ３３は、現在のスレッドに対応する履歴テーブルがまだ生成されていない場合は生成し、生成された履歴テーブルを変数ｃｕｒｒｅｎｔＴａｂｌｅに代入する。
【０１０１】
ステップＳ３０６において、履歴記録プログラム生成部１３１は、ａｆｔｅｒアドバイス定義雛形ｔ３の＜ポイントカット名＞を、ステップＳ３０５において生成したポイントカット名（「ｃａｌｌＲ１−ｐｒｅｄ」）に置換することによりａｆｔｅｒアドバイス定義を生成する。
【０１０２】
続いて、履歴記録プログラム生成部１３１は、ａメソッドが呼び出されたことを履歴テーブル（変数ｃｕｒｒｅｎｔＴａｂｌｅ）へ記録するためのステップを、ステップＳ３０６において生成されたａｆｔｅｒアドバイス定義に対して追加する（Ｓ３０７）。具体的には、履歴記録プログラム生成部１３１は、履歴記録雛形ｔ４（図１７）を雛形データ記憶部１４より取得し、履歴記録雛形ｔ４に基づいて、履歴テーブルへの記録処理に関するステップを追加する。すなわち、履歴記録プログラム生成部１３１は、履歴記録雛形ｔ４の＜キー名＞を、カレントルール要素（ルール要素Ｒ１）のａメソッドに対する変数名（Ｒ１−ｐｒｅｄ）によって置換し、＜値＞をｔｒｕｅによって置換した結果をａｆｔｅｒアドバイス定義に追加する。
【０１０３】
ステップＳ３０７の実行により、ステップＳ３０５において生成されたポイントカット定義に対する具体的なａｆｔｅｒアドバイス定義は完成する。
【０１０４】
図２１は、具体的なａｆｔｅｒアドバイス定義の第一の例を示す図である。同図のａｆｔｅｒアドバイス定義ａｄ１２に含まれる各ステップについて、図１７又は図２０と同ステップには、同一ステップ番号を付している。
【０１０５】
ステップｓ３１〜ｓ３３については、図２０において説明した通りである。ステップｓ４１は、変数ｖａＴａｂｌｅより取得された（ｓ３２）、又は新に生成された（ｓ３３）履歴テーブル（ｃｕｒｒｅｎｔＴａｂｌｅ）に、カレントルール要素のａメソッド対する変数名（「Ｒ１−ｐｒｅｄ」）に対してｔｒｕｅを記録する。すなわち、ａメソッドが呼び出されたことが、￥当該履歴テーブルに記録される。ステップｓ４２は、現在のスレッドの識別子に対応付けて当該履歴テーブルを変数ｖａｒＴａｂｌｅに格納する。その結果、現在のスレッドにおいて、ａメソッドが呼び出されたことが変数ｖａｒＴａｂｌｅに記録されたことになる。
【０１０６】
続いて、履歴記録プログラム生成部１３１は、カレントルール要素のｂメソッドの呼び出しをフックするためのポイントカット定義をアスペクトコードａｃ１に追加生成する（Ｓ３０８）。具体的には、履歴記録プログラム生成部１３１は、雛形データ記憶部１４よりポイントカット定義雛形ｔ２（図１４）を取得し、ポイントカット定義雛形ｔ２にカレントルール要素のｂメソッドを当てはめた結果をアスペクトコードａｃ１に追加する。その結果、図２２に示されるポイントカット定義がアスペクトコードａｃ１に追加される。
【０１０７】
図２２は、履歴記録プログラムにおけるポイントカット定義の第三の具体例を示す図である。同図のポイントカット定義ｐｃ１３は、図１４のポイントカット定義雛形ｔ２に対して、ルール要素Ｒ１のｂメソッドが当てはめられた場合に生成されるポイントカット定義である。
【０１０８】
ポイントカット定義ｐｃ１３において、ポイントカット定義雛形ｔ２の＜ポイントカット名＞は、「ｃａｌｌＲ１−ｓｕｃｃ」に置換されている。また、ポイントカット定義雛形ｔ２の＜メソッド名＞は、ルール要素Ｒ１におけるｂメソッドのメソッド名「SSLSocket.startHandshake ()」に置換されている。なお、本実施の形態では、Ｂｅｆｏｒｅルール要素のｂメソッドに対するポイントカット名は、「ｃａｌｌ＜カレントルール要素の変数名＞−ｓｕｃｃ」という命名規則に従って生成される。
【０１０９】
続いて、履歴記録プログラム生成部１３１は、ステップＳ３０８において生成したポイントカット定義に対するａｆｔｅｒアドバイス定義をアスペクトコードａｃ１に追加生成する（Ｓ３０９）。具体的には、履歴記録プログラム生成部１３１は、ａｆｔｅｒアドバイス定義雛形ｔ３の＜ポイントカット名＞を、ステップＳ３０８において生成したポイントカット名（「ｃａｌｌＲ１−ｓｕｃｃ」）に置換することによりａｆｔｅｒアドバイス定義を生成する。
【０１１０】
続いて、プログラム生成部１３は、ｂメソッドより前に呼ばれているべきａメソッドに関する呼び出し履歴（実行履歴）を参照するためのステップを、ステップＳ３０９において生成されたａｆｔｅｒアドバイス定義に追加する（Ｓ３１０）。当該ステップは、雛形データ記憶部１４より取得される履歴参照雛形に基づいて生成される。
【０１１１】
図２３は、履歴参照雛形の一例を示す図である。同図の履歴参照雛形ｔ６において、履歴テーブル（変数ｃｕｒｒｅｎｔＴａｂｌｅ）より値を取得するキー名と、取得された値を格納する変数（参照用変数）の変数名とは、それぞれ＜キー名＞、＜参照用変数名＞としてパラメタ化されている。ステップＳ３１０において、履歴記録プログラム生成部１３１は、＜参照用変数名＞を適当な値によって置換し、＜キー名＞をａメソッドに対する変数名（ここでは、「Ｒ１−ｐｒｅｄ」）によって置換した結果をａｆｔｅｒアドバイス定義に追加する。本実施の形態において、ａメソッドの変数名に対応する値を参照するための変数名は、「ｒ１」とされる。したがって、＜参照用変数名＞は、「ｒ１」に置換される。なお、ステップｓ６１及びｓ６２の詳細については後述する。
【０１１２】
続いて、プログラム生成部１３は、履歴記録雛形ｔ４（図１７）を用いて、カレントルール要素の評価値を変数ｖａｒＴａｂｌｅに記録するためのステップを、ステップＳ３０９において生成されたａｆｔｅｒアドバイス定義に追加する（Ｓ３１１）。具体的には、履歴記録雛形ｔ４の＜キー名＞がカレントルール要素の変数名（「Ｒ１」）によって置換され、＜値＞が、履歴記録雛形ｔ４（図２３）の＜参照用変数名＞の置換先と同じ変数名（「ｒ１」）に置換された結果が、当該ａｆｔｅｒアドバイスに追加される。
【０１１３】
ステップＳ３１１の実行により、ステップＳ３０８において生成されたポイントカット定義に対する具体的なａｆｔｅｒアドバイス定義は完成する。
【０１１４】
図２４は、具体的なａｆｔｅｒアドバイス定義の第二の例を示す図である。同図のａｆｔｅｒアドバイス定義ａｄ１３に含まれる各ステップについて、図１６、図２３、又は図１７と同ステップには、同一ステップ番号を付している。
【０１１５】
ステップｓ３１〜ｓ３３については、図２０において説明した通りである。ステップｓ６１は、現在のスレッドに対応する履歴テーブル（変数ｃｕｒｒｅｎｔＴａｂｌｅ）において、キー名「Ｒ１−ｐｒｅｄ」に対して記録されている値を取得し、変数ｒ１に代入する。すなわち、カレントルール要素のａメソッドが実行されたか否かを示す真偽値が変数ｒ１に代入される。
【０１１６】
ステップｓ６２は、変数ｒ１の値がｎｕｌｌ（空）である場合（すなわち、ｂｅｆｏｒｅアドバイス定義ａｄ１１及びａｆｔｅｒアドバイス定義ａｄ１２が実行されていない場合）、変数ｒ１にｆａｌｓｅを代入する。したがって、ａメソッドが実行された後にアドバイス定義ａｄ１３が実行されている場合は、変数ｒ１はｔｒｕｅが代入された状態となる。それ以外の場合は、変数ｒ１はｆａｌｓｅが代入された状態となる。なお、ａｆｔｅｒアドバイス定義ａｄ１３は、ｂメソッドの実行後に実行される処理である。したがって、ａメソッドが実行された後にアドバイス定義ａｄ１３が実行されている場合とは、ａメソッドの実行後にｂメソッドが実行されている場合に相当する。これは、Ｂｅｆｏｒｅ要素であるカレントルール要素の要件が満たされていることを意味する。
【０１１７】
ステップｓ４１は、カレントルール要素の変数名「Ｒ１」のキー名に対して、変数ｒ１の値を履歴テーブルに記録する。すなわち、変数ｒ１の値が、カレントルール要素の評価値として履歴テーブルに記録される。上記したように、変数ｒ１の値は、カレントルール要素の要件が満たされているか否かを示すからである。
【０１１８】
ステップｓ４２は、現在のスレッドの識別子に対応付けて当該履歴テーブルを変数ｖａｒＴａｂｌｅに格納する。その結果、現在のスレッドにおいて、カレントルール要素の要件が満たされているか否かがが変数ｖａｒＴａｂｌｅに記録されたことになる。
【０１１９】
以上で、カレントルール要素がＢｅｆｏｒｅルール要素である場合の処理手順は終了する。図８に示されるように、本実施の形態の場合、図８のルール要素一覧ｒＬ１において２番目のルール要素（ルール要素Ｒ２）もＢｅｆｏｒｅルール要素である。したがって、続けて、ルール要素Ｒ２に関して図１３に示される処理手順が実行される。その結果、変数名Ｒ２に対してルール要素Ｒ２の評価値が現在のスレッドの履歴テーブルに記録され、当該履歴テーブルが変数ｖａｒＴａｂｌｅに格納される。なお、当該処理手順の内容の説明は、上記より自明であるため省略する。
【０１２０】
続いて、図８のルール要素一覧ｒＬ１に基づいて、図９のステップＳ２０７のルール検証プログラムＰｃ生成処理について説明する。なお、カレント要素がＡｆｔｅｒルール要素、Ｃａｌｌルール要素、又は型指定Ｃａｌｌルール要素である場合の履歴記録プログラムＰｒの生成処理の処理手順の説明は、便宜上、後回しにする。
【０１２１】
図２５は、ルール検証プログラム生成処理の処理手順の一例を説明するためのフローチャートである。
【０１２２】
ステップＳ４０１において、ルール検証プログラム生成部１３２は、ルール要素一覧ｒＬ１において、各ルール要素の最後の引数として指定されているメソッドをフック（以下、「呼出元メソッド」という。）するためのポイントカット定義を、アスペクトコードａｃ１に追加する。すなわち、Ｂｅｆｏｒｅルール要素についてはｃメソッド、Ａｆｔｅｒルール要素についてはｆメソッド、Ｃａｌｌルール要素についてはｈメソッド、型指定Ｃａｌｌルール要素についてはｊメソッドが、呼出元メソッドに相当する。なお、本実施の形態において、一つのルール内の各ルール要素の呼出元メソッドは共通である必要がある。ルールが充足されているか否かの検証は、当該呼出元メソッドの実行後の一箇所において行われる必要があるからである。ステップＳ４０１におけるポイントカット定義の生成には、ポイントカット定義雛形ｔ２（図１４）が用いられる。
【０１２３】
図２６は、ルール検証プログラムにおけるポイントカット定義の具体例を示す図である。
【０１２４】
同図のポイントカット定義ｐｃ１７において、図１４のポイントカット定義雛形ｔ２の＜ポイントカット名＞は、「ｃａｌｌＬｉｂ」に置換されている。また、＜メソッド名＞は、ルール記述ｒｄ１の対象メソッドのメソッド名（「httpServlet.doPost()」）によって置換されている。なお、対象メソッドに対するポイントカット定義におけるポイントカット名は、本実施の形態では固定的に「ｃａｌｌＬｉｂ」に置換される。但し、当該ポイントカット名は、プログラミング言語の仕様の範囲内において任意に決定されてよい。
【０１２５】
続いて、ルール検証プログラム生成部１３２は、ａｆｔｅｒアドバイス定義雛形ｔ３を用いて、ステップＳ４０１において生成したポイントカット定義に対するａｆｔｅｒアドバイス定義をアスペクトコードａｃ１に追加生成する（Ｓ４０２）。具体的には、ａｆｔｅｒアドバイス定義雛形ｔ３の＜ポイントカット名＞が、ステップＳ４０１において置換先とされたポイントカット名（「ｃａｌｌＬｉｂ」）に置換された結果が、アスペクトコードａｃ１に追加される。
【０１２６】
続いて、ルール検証プログラム生成部１３２は、ルール記述ｒｄ１の式構造（！Ｒ１｜｜Ｒ２）内に含まれる変数名ごとに、当該変数名に対する値を参照するためのステップを、アスペクトコードａｃ１に追加する（Ｓ４０３）。具体的には、ルール検証プログラム生成部１３２は、雛形データ記憶部１４より履歴参照雛形ｔ６（図２３）を取得し、履歴参照雛形ｔ６に当該変数名を当てはめた結果を当該変数名ごとにアスペクトコードａｃ１に追加する。
【０１２７】
式構造（！Ｒ１｜｜Ｒ２）には、変数名Ｒ１及び変数名Ｒ２が含まれている。したがって、履歴参照雛形ｔ６の＜参照変数名＞が「ｒ１」に置換され、＜キー名＞が「Ｒ１」に置換された結果が追加される。更に、履歴参照雛形ｔ６の＜参照変数名＞が「ｒ２」に置換され、＜キー名＞が「Ｒ２」に置換された結果が追加される。
【０１２８】
続いて、ルール検証プログラム生成部１３２は、当該式構造の各変数名に当該変数名の値を当てはめた結果として生成される式の真偽値に応じて、例外を発生させるステップをアスペクトコードａｃ１に追加する（Ｓ４０４）。当該ステップは、雛形データ記憶部１４より取得されるルール評価雛形を用いて生成される。
【０１２９】
図２７は、ルール評価雛形の一例を示す図である。同図のルール評価雛形ｔ７において、＜式＞は、式構造の各変数名が、当該変数名に対する値が代入された参照用変数の変数名によって置換された式によって置換される。ステップｓ７１の詳細については後述する。
【０１３０】
ステップＳ４０４の実行により、ステップＳ４０２において生成されたａｆｔｅｒアドバイス定義は、図２８に示されるように完成する。
【０１３１】
図２８は、ルール検証プログラムにおけるａｆｔｅｒアドバイス定義の具体例を示す図である。同図のａｆｔｅｒアドバイス定義ａｄ１７に含まれる各ステップについて、図２０、図２３、又は図２７と同ステップには、同一ステップ番号を付している。
【０１３２】
ステップｓ３１〜ｓ３３については、図２０において説明した通りであり、ステップＳ４０２において生成される。ステップｓ６１−１〜ｓ６２−２は、ステップＳ４０３において生成される。ステップｓ６１−１は、現在のスレッドに対応する履歴テーブル（変数ｃｕｒｒｅｎｔＴａｂｌｅ）において、キー名「Ｒ１」に対して記録されている値を取得し、変数ｒ１に代入する。すなわち、ルール要素Ｒ１の評価値を示す真偽値が変数ｒ１に代入される。ステップｓ６２−１は、変数ｒ１の値がｎｕｌｌ（空）である場合、変数ｒ１にｆａｌｓｅを代入する。したがって、ルール要素Ｒ１の要件が満たされている場合、変数ｒ１にはｔｒｕｅが代入され、ルール要素Ｒ１の要件が満たされていない場合、変数ｒ１にはｆａｌｓｅが代入された状態となる。
【０１３３】
ステップｓ６１−２は、現在のスレッドに対応する履歴テーブル（変数ｃｕｒｒｅｎｔＴａｂｌｅ）において、キー名「Ｒ２」に対して記録されている値を取得し、変数ｒ２に代入する。すなわち、ルール要素Ｒ２の評価値を示す真偽値が変数ｒ２に代入される。ステップｓ６２−２は、変数ｒ２の値がｎｕｌｌ（空）である場合、変数ｒ２にｆａｌｓｅを代入する。したがって、ルール要素Ｒ２の要件が満たされている場合、変数ｒ２にはｔｒｕｅが代入され、ルール要素Ｒ２の要件が満たされていない場合、変数ｒ２にはｆａｌｓｅが代入された状態となる。
【０１３４】
ステップｓ７１は、ステップＳ４０４において生成される。ステップｓ７１は、「！（！ｒ１｜｜ｒ２）」を評価し、評価値がｔｒｕｅであれば（すなわち、（！ｒ１｜｜ｒ２）がｆａｌｓｅであれば）、例外（ＲｕｎｔｉｍｅＥｘｃｅｐｔｉｏｎ）を発生させる。評価値がｆａｌｓｅであれば（すなわち、（！ｒ１｜｜ｒ２）がｔｒｕｅであれば）、何もしない。なお、「！（！ｒ１｜｜ｒ２）」は、ｒ１の値の否定とｒ２の値との論理和の否定を意味する。
【０１３５】
以上で、ルール記述ｒｄ１に対する履歴記録プログラムＰｒ及びルール検証プログラムＰｃのソースコード（アスペクトコードａｃ１）の生成は完了する。その結果、アスペクトコードａｃ１は、図２９及び図３０に示されるようになる。
【０１３６】
図２９及び図３０は、本実施の形態の第一のルール記述に関して生成される履歴記録プログラム及びルール検証プログラムのアスペクトコードの具体例を示す図である。図２９及び図３０は、一つのアスペクトコードａｃ１を、便宜上、二つの図面に分割して示したものである。
【０１３７】
図２９において、図１５、図１８、図１９、図２１、図２２、又は図２４と同一のポイントカット定義又はアドバイス定義には、同一符号を付している。すなわち、図２９には、ルール記述ｒｄ１より抽出されたルール要素Ｒ１に関するポイントカット定義又はアドバイス定義が示されている。
【０１３８】
図３０において、図２６又は図２８と同一のポイントカット定義又はアドバイス定義には、同一符号を付している。
【０１３９】
また、図３０において、ポイントカット定義ｐｃ１４及びａｆｔｅｒアドバイス定義ａｄ１４は、ルール要素Ｒ２に関して図１３のステップＳ３０１〜Ｓ３０４が実行されることにより生成されるポイントカット定義又はアドバイス定義である。ポイントカット定義ｐｃ１５及びａｆｔｅｒアドバイス定義ａｄ１５は、ルール要素Ｒ２に関して図１３のステップＳ３０５〜Ｓ３０７が実行されることにより生成されるポイントカット定義又はアドバイス定義である。ポイントカット定義ｐｃ１６及びａｆｔｅｒアドバイス定義ａｄ１６は、ルール要素Ｒ２に関して図１３のステップＳ３０８〜Ｓ３１１が実行されることにより生成されるポイントカット定義又はアドバイス定義である。
【０１４０】
同図のように生成されたアスペクトコードａｃ１は、コンパイルされ、ライブラリを使用するアプリケーションに適用されることにより、履歴記録プログラムＰｒ及びルール検証プログラムＰｃとして機能する。履歴記録プログラムＰｒにおけるポイントカット定義により、アプリケーションによるライブラリのメソッドの呼び出しがフックされる。当該呼び出しのフックに応じ、履歴記録プログラムＰｒにおけるアドバイス定義が実行され、当該呼び出しに関する履歴が変数ｖａｒＴａｂｌｅに記録される。更に、ルール記述ｒｄ１の呼出元メソッドの実行後に、ルール検証プログラムＰｃにおけるアドバイス定義が実行され、ルール記述ｒｄ１の要件が満たされているか否かが評価される。要件が満たされていない場合（ｆａｌｓｅである場合）、例外が発生する。例外の発生により、ユーザは、ライブラリの利用が不適切であることを認識することができる。
【０１４１】
続いて、図５のステップＳ２０５の履歴記録プログラムＰｒの生成処理に関して、便宜上、説明を後回しにした、カレントルール要素がＡｆｔｅｒルール要素である場合について説明する。ここでは、図５のステップＳ１０１において、ルール解析部１２によって、図３１に示されるルール記述が読み込まれたこととする。
【０１４２】
図３１は、第二のルール記述の一例を示す図である。同図に示されるルール記述ｒｄ２のルールを示す式では、二つのＡｆｔｅｒルール要素が「｜｜」オペレータによって接続されている。第一項のＡｆｔｅｒルール要素は、「@After(java.io.File.delete(), java.io.File.createTempFile(), httpServlet.doPost())」であり、第二項のＡｆｔｅｒルール要素は、「@After(java.io.File.deleteOnExit(), java.io.File.createTempFile(), httpServlet.doPost())」である。
【０１４３】
したがって、ルール記述ｒｄ２に係る式は、「httpServlet.doPost()内でjava.io.File.createTempFile()が呼び出された場合は、java.io.File.createTempFile()の呼び出し後にjava.io.File.delete()が呼び出されなければならない。又は、httpServlet.doPost()内で、java.io.File.createTempFile()が呼び出された場合は、、java.io.File.createTempFile()の呼び出し後に、java.io.File.deleteOnExit()が呼び出されなければならない。」というルールを示す。
【０１４４】
ルール記述ｒｄ２は、アプリケーション内においてファイルが一時的に生成された場合、当該ファイルはアプリケーションの終了時に削除されないと、情報漏洩の虞があることを考慮して本実施の形態において規定されたものである。
【０１４５】
ファイルが適切に削除されるためには、Java.io.File#createTempFile()の実行後には、delete()又はdeleteOnExit()が実行される必要があるというルールが規定されればよい。当該ルールをルール要素及びオペレータを用いて表現したものが、ルール記述ｒｄ２である。
【０１４６】
ルール記述ｒｄ２について、ステップＳ１０２〜Ｓ１０６が実行された結果、図３２に示されるルール要素一覧が補助記憶装置１０２に記録（出力）される。
【０１４７】
図３２は、第二のルール要素一覧の例を示す図である。同図では、第一項のＡｆｔｅｒルール要素に対して、変数名「Ｒ３」が割り当てられ（生成され）、第二項のＡｆｔｅｒルール要素に対して、変数名「Ｒ４」が割り当てられた例が示されている。以下、第一項のＡｆｔｅｒルール要素を「ルール要素Ｒ３」といい、第二項のＡｆｔｅｒルール要素を「ルール要素Ｒ４」という。
【０１４８】
続いてステップＳ１０７では、以下の式構造（２）が生成される。
【０１４９】
Ｒ３｜｜Ｒ４  ・・・（２）
【０１５０】
続いて、ルール記述ｒｄ２に関してプログラム生成部１３によって図９において説明した処理が実行される。ステップＳ２０２では、ルール記述ｒｄ２に関するアスペクトコードの一部が生成される。
【０１５１】
図３３及び図３４は、本実施の形態の第二のルール記述に関して生成される履歴記録プログラム及びルール検証プログラムのアスペクトコードの具体例を示す図である。
【０１５２】
同図には、ルール記述ｒｄ２に関して生成されるアスペクトコードａｃ２の完成形が示されているが、ステップＳ２０２において生成される部分は、アスペクトの定義とステップｓ１１である。すなわち、図１２に示されるアスペクトコードａｃ１と同様の内容である。なお、ステップｓ１１は、図１２のアスペクトコードａｃ１におけるステップｓ１１と同じである。すなわち、履歴を記録するためのデータ構造（図１１参照）は、ルール要素のタイプに拘わらず同じである。
【０１５３】
続いて、図９のステップＳ２０５について説明する。ルール要素一覧ｒＬ２に含まれているルール要素は、いずれもＡｆｔｅｒルール要素である。したがって、履歴記録プログラム生成部１３１は、履歴記録プログラムＰｒの生成処理として、Ａｆｔｅｒルール要素に関する履歴記録プログラムＰｒを生成するための処理を実行する。当該生成処理では、要するに次のような処理を実行する履歴記憶プログラムが生成される。以下の説明において、ｄメソッド、ｅメソッド、ｆメソッドとは、＠Ａｆｔｅｒ（ｄ，ｅ，ｆ）における、ｄメソッド、ｅメソッド、又はｆメソッドをいう。
【０１５４】
（１）ｆメソッドの実行をフックし、当該Ａｆｔｅｒルール要素の評価値をｔｒｕｅとする。
【０１５５】
（２）ｅメソッドの実行をフックし、当該評価値をｆａｌｓｅとする。
【０１５６】
（３）ｄメソッドの実行をフックし、当該評価値をｔｒｕｅとする。
【０１５７】
以上により、ｅメソッドが実行された場合、その後にｄメソッドが実行されなければ、当該Ａｆｔｅｒルール要素の評価値をｆａｌｓｅとする履歴記録プログラムＰｒが生成される。
【０１５８】
以下、斯かる履歴記録プログラムＰｒの生成処理の詳細について説明する。
【０１５９】
図３５は、Ａｆｔｅｒルール要素に関する履歴記録プログラム生成処理の処理手順の一例を説明するためのフローチャートである。以下の説明において、ルール記述ｒｄ２に関して、図９のステップＳ２０２において生成されているアスペクトコードを、「アスペクトコードａｃ２」という。図３５の開始時点におけるアスペクトコードａｃ２の状態は、図１２に示されるアスペクトコードａｃ１と同じである。
【０１６０】
ステップＳ５０１において、履歴記録プログラム生成部１３１は、ポイントカット定義雛形ｔ２（図１４）を用いて、カレントルール要素（ルール要素Ｒ３）のｆメソッドの呼び出しをフックするためのポイントカット定義ｐｃ２１をアスペクトコードａｃ２に追加生成する。具体的には、履歴記録プログラム生成部１３１は、ポイントカット定義雛形ｔ２の＜ポイントカット名＞を「ｃａｌｌＲ３−ｆ」に置換し、＜メソッド名＞をカレントルール要素のｆメソッドのメソッド名（「httpServlet.doPost()」）に置換して、当該ｆメソッドに対するポイントカット定義ｐｃ２１（図３３参照）を生成する。なお、本実施の形態では、Ａｆｔｅｒルール要素のｆメソッドに対するポイントカット名は、「ｃａｌｌ＜カレントルール要素の変数名＞−ｆ」という命名規則に従って生成される。
【０１６１】
続いて、履歴記録プログラム生成部１３１は、ポイントカット定義ｐｃ２１に対するｂｅｆｏｒｅアドバイス定義ａｄ２１（図３３参照）を、ｂｅｆｏｒｅアドバイス定義雛形ｔ５（図１６）を用いて生成し、アスペクトコードａｃ２に追加する（Ｓ５０２）。ステップＳ５０２では、ｂｅｆｏｒｅアドバイス定義ａｄ２１のうち、ステップｓ５１〜ｓ５３が生成される。当該ステップ番号は、図１６に対応する。
【０１６２】
続いて、履歴記録プログラム生成部１３１は、カレントルール要素の要件が満たされたことを、暫定的に履歴テーブル（変数ｃｕｒｒｅｎｔＴａｂｌｅ）へ記録するためのステップをｂｅｆｏｒｅアドバイス定義ａｄ２１に対して追加する（Ｓ５０３）。当該ステップの追加には、履歴記録雛形ｔ４（図１７）が使用される。追加されたステップは、アドバイス定義ａｄ２１内（図３３）におけるｓ４１及び４２に相当する。
【０１６３】
アドバイス定義ａｄ２１内のステップｓ４１は、変数ｖａＴａｂｌｅより取得された（ｓ５２）、又は新に生成された（ｓ５３）履歴テーブル（ｃｕｒｒｅｎｔＴａｂｌｅ）に、カレントルール要素（ルール要素Ｒ３）の変数名（「Ｒ３」）に対してｔｒｕｅを記録する。すなわち、ｆメソッドの実行前に、ルール要素Ｒ３の要件が満たされたことが、暫定的に当該履歴テーブルに記録される。ステップｓ４２は、現在のスレッドの識別子に対応付けて当該履歴テーブルを変数ｖａｒＴａｂｌｅに格納する。その結果、現在のスレッドにおいて、ルール要素Ｒ３の要件が満たされたことが暫定的に変数ｖａｒＴａｂｌｅに記録されたことになる。
【０１６４】
続いて、履歴記録プログラム生成部１３１は、ポイントカット定義雛形ｔ２（図１４）を用いて、カレントルール要素（ルール要素Ｒ３）のｅメソッドの呼び出しをフックするためのポイントカット定義ｐｃ２２をアスペクトコードａｃ２に追加生成する（Ｓ５０４）。具体的には、履歴記録プログラム生成部１３１は、ポイントカット定義雛形ｔ２の＜ポイントカット名＞を「Ｒ３−ｐｒｅｄ」に置換し、＜メソッド名＞をカレントルール要素のｅメソッドのメソッド名（「java.io.File.createTempFile()」）に置換して、当該ｅメソッドに対するポイントカット定義ｐｃ２２（図３３参照）を生成する。なお、本実施の形態で、Ａｆｔｅｒルール要素のｅメソッドに対するポイントカット名は、「ｃａｌｌ＜カレントルール要素の変数名＞−ｐｒｅｄ」という命名規則に従って生成される。
【０１６５】
続いて、履歴記録プログラム生成部１３１は、ポイントカット定義ｐｃ２２に対するａｆｔｅｒアドバイス定義ａｄ２２（図３３参照）を、ａｆｔｅｒアドバイス定義雛形ｔ３（図２０）を用いて生成し、アスペクトコードａｃ２に追加する（Ｓ５０５）。ステップＳ５０５では、ａｆｔｅｒアドバイス定義ａｄ２２のうち、ステップｓ３１〜ｓ３３が生成される。当該ステップ番号は、図２０に対応する。
【０１６６】
続いて、履歴記録プログラム生成部１３１は、カレントルール要素は満たされていないことを、暫定的に履歴テーブル（変数ｃｕｒｒｅｎｔＴａｂｌｅ）へ記録するためのステップをａｆｔｅｒアドバイス定義ａｄ２２に対して追加する（Ｓ５０６）。当該ステップの追加には、履歴記録雛形ｔ４（図１７）が使用される。追加されたステップは、アドバイス定義ａｄ２２内（図３３）におけるｓ４１及びｓ４２に相当する。
【０１６７】
アドバイス定義ａｄ２２内のステップｓ４１は、変数ｖａＴａｂｌｅより取得された（ｓ３２）、又は新に生成された（ｓ３３）履歴テーブル（ｃｕｒｒｅｎｔＴａｂｌｅ）に、ルール要素Ｒ３の変数名（「Ｒ３」）に対してｆａｌｓｅを記録する。すなわち、ｅメソッドの実行後に、ルール要素Ｒ３の要件が満たされていないことが、暫定的に当該履歴テーブルに記録される。ステップｓ４２は、現在のスレッドの識別子に対応付けて当該履歴テーブルを変数ｖａｒＴａｂｌｅに格納する。その結果、現在のスレッドにおいて、ルール要素Ｒ３の要件が満たされていないことが暫定的に変数ｖａｒＴａｂｌｅに記録されたことになる。
【０１６８】
続くステップＳ５０７及びＳ５０８において、履歴記録プログラム生成部１３１は、ｄメソッドに関して、ステップＳ５０４及びＳ５０５において説明した処理を実行する。その結果、ポイントカット定義ｐｃ２３及びａｆｔｅｒアドバイス定義ａｄ２３のｓ３１〜ｓ３３までが生成される。なお、本実施の形態では、Ａｆｔｅｒルール要素のｄメソッドに対するポイントカット名は、「ｃａｌｌ＜カレントルール要素の変数名＞−ｓｕｃｃ」という命名規則に従って生成される。
【０１６９】
続いて、履歴記録プログラム生成部１３１は、カレントルール要素は満たされていることを履歴テーブル（変数ｃｕｒｒｅｎｔＴａｂｌｅ）へ記録するためのステップをａｆｔｅｒアドバイス定義ａｄ２３に対して追加する（Ｓ５０９）。当該ステップの追加には、履歴記録雛形ｔ４（図１７）が使用される。追加されたステップは、アドバイス定義ａｄ２３内（図３３）におけるｓ４１及びｓ４２に相当する。
【０１７０】
以上で、カレントルール要素がＡｆｔｅｒルール要素である場合の処理手順は終了する。図３２に示されるように、本実施の形態の場合、図８のルール要素一覧ｒＬ２において２番目のルール要素（ルール要素Ｒ４）もＡｆｔｅｒルール要素である。したがって、続けて、ルール要素Ｒ４に関して図１３に示される処理手順が実行される。その結果、変数名Ｒ４に対してルール要素Ｒ４の評価値が現在のスレッドの履歴テーブルに記録され、当該履歴テーブルが変数ｖａｒＴａｂｌｅに格納される。なお、当該処理手順の内容の説明は、上記より自明であるため省略する。
【０１７１】
続いて、図５のステップＳ２０５の履歴記録プログラムＰｒの生成処理に関して、カレントルール要素がＣａｌｌルール要素である場合について説明する。
【０１７２】
図３６は、Ｃａｌｌルール要素に関する履歴記録プログラム生成処理の処理手順の一例を説明するためのフローチャートである。以下の説明において、ｇメソッド、ｈメソッドとは、＠Ｃａｌｌ（ｇ，ｈ）におけるｇメソッド又はｈメソッドをいう。
【０１７３】
ステップＳ６０１において、履歴記録プログラム生成部１３１は、ポイントカット定義雛形ｔ２（図１４）を用いて、カレントルール要素のｈメソッドの呼び出しをフックするためのポイントカット定義を作成中のアスペクトコードに追加生成する。
【０１７４】
続いて、履歴記録プログラム生成部１３１は、ポイントカット定義に対するｂｅｆｏｒｅアドバイス定義を、ｂｅｆｏｒｅアドバイス定義雛形ｔ５（図１６）を用いて生成し、アスペクトコードに追加する（Ｓ６０２）。
【０１７５】
続いて、履歴記録プログラム生成部１３１は、カレントルール要素の要件が満たされていないこと示す評価値を、暫定的に履歴テーブル（変数ｃｕｒｒｅｎｔＴａｂｌｅ）へ記録するためのステップをｂｅｆｏｒｅアドバイス定義に対して追加する（Ｓ６０３）。
【０１７６】
続いて、履歴記録プログラム生成部１３１は、ポイントカット定義雛形ｔ２（図１４）を用いて、カレントルール要素（ルール要素Ｒ３）のｇメソッドの呼び出しをフックするためのポイントカット定義をアスペクトコードに追加生成する（Ｓ６０４）。
【０１７７】
続いて、履歴記録プログラム生成部１３１は、ポイントカット定義に対するａｆｔｅｒアドバイス定義を、ａｆｔｅｒアドバイス定義雛形ｔ３（図２０）を用いて生成し、アスペクトコードに追加する（Ｓ６０５）。
【０１７８】
続いて、履歴記録プログラム生成部１３１は、カレントルール要素は満たされたことを示す評価値を履歴テーブル（変数ｃｕｒｒｅｎｔＴａｂｌｅ）へ記録するためのステップをａｆｔｅｒアドバイス定義に対して追加する（Ｓ６０６）。当該ステップの追加には、履歴記録雛形ｔ４（図１７）が使用される。
【０１７９】
このように、Ｃａｌｌルール要素については、ｈメソッドの実行の検知に応じて評価値がｆａｌｓｅとされ、ｇメソッドの実行の検知に応じて評価値がｔｒｕｅとされる。したがって、当該評価値は、ｇメソッドが呼ばれたときに限ってｔｒｕｅとなる。
【０１８０】
なお、型指定Ｃａｌｌルール要素に関する履歴記録プログラムＰｒの生成処理は、例えば、図３６のｈメソッドがｊメソッドに置換され、ｇメソッドがｉメソッドに置換された処理が実行されたものであればよい。
【０１８１】
上述したように、本実施の形態の文脈違反検出支援装置１０によれば、ルール記述を作成することにより、当該ルール記述に基づいて、履歴記録プログラムＰｒ及びルール検証プログラムＰｃが自動生成される。当該履歴記録プログラムＰｒ及びルール検証プログラムＰｃを、ライブラリを利用するアプリケーションに適用することにより、当該アプリケーションによる当該ライブラリの利用の適否を検査することができる。したがって、文脈違反検出支援装置１０は、ライブラリの文脈上のルールに対する違反の検出を適切に支援することができる。
【０１８２】
より詳しくは、履歴記録プログラムＰｒは、ライブラリのメソッドの呼び出し履歴を採取し、記録しておく。ルール検証プログラムＰｃは、履歴の内容が、ライブラリの文脈上のルールに適合しているか否かを判定する。したがって、デバッガのようにコールスタック(呼び出しの親子関係)だけではない、呼出の有無又は前後関係に関するルール違反の検出が可能になる。
【０１８３】
また、本実施の形態では、メソッドの呼び出しに対して動的なフック機構が採用されて、アプリケーションによるライブラリの呼出が検知される。したがって、ライブラリ又はアプリケーションのソースコード等に修正を加える必要はない。その結果、例えば、ライブラリの作成後に、後付けでルールを作成し、ライブラリと一体化して提供することもできる。そうすることにより、検査ツールを別途提供されなくても、アプリケーションのテストの過程で、文脈上のルール違反を自動的に検出することができる。
【０１８４】
以上、本発明の実施例について詳述したが、本発明は斯かる特定の実施形態に限定されるものではなく、特許請求の範囲に記載された本発明の要旨の範囲内において、種々の変形・変更が可能である。
【０１８５】
以上の説明に関し、更に以下の項を開示する。
（付記１）
記憶手段が記憶する、メソッドの集合に関する文脈上の規則情報を、前記記憶手段から読み出して解析する規則解析手順と、
前記メソッドの集合を利用するプログラムによる前記規則情報に係る前記メソッドの実行の検知に応じて該実行の履歴を記録する履歴記録プログラムを生成する履歴記憶プログラム生成手順と、
前記履歴を前記規則情報と照合して、前記プログラムによる前記メソッドの利用が前記規則情報を満たしているか否かを判定する検証プログラムを生成するルール検証プログラム生成手順とをコンピュータが実行する文脈違反検出支援方法。
（付記２）
前記規則情報は、前記メソッドの呼び出しの要又は前記メソッドの呼び出し順に関する要件を規定するルール要素と、複数の前記ルール要素間の論理関係とを含み、
前記履歴記憶プログラム生成手順は、前記ルール要素に係る前記メソッドの実行の検知に応じて該実行の履歴を記録し、前記履歴に基づいて前記ルール要素に規定された要件が満たされているか否かを判定し、該判定結果を記録する前記履歴記録プログラムを生成し、
前記ルール検証プログラム生成手順は、該判定結果を前記論理関係に当てはめて、前記プログラムによる前記メソッドの呼び出しが前記規則情報を満たしているか否かを判定する前記検証プログラムを生成する付記１記載の文脈違反検出支援方法。
（付記３）
前記ルール要素は、ｃメソッド内において、ｂメソッドが実行される場合はｂメソッドの実行前にａメソッドが実行されなければならないことを規定し、
前記履歴記憶プログラム生成手順は、ｃメソッドの実行の検知に応じ、ａメソッドが呼び出されていないことを記録し、ａメソッドの実行の検知に応じ、ａメソッドが実行されたことを記録し、ｂメソッドの実行の検知に応じ、ａメソッドが実行されたか否かに基づいて当該ルール要素に規定された要件が満たされたか否かを判定し、該判定結果を記録する前記履歴記録プログラムを生成する付記２記載の文脈違反検出支援方法。
（付記４）
前記ルール要素は、ｆメソッド内において、ｅメソッドが実行される場合はｅメソッドの実行後にｄメソッドが実行されなければならないことを規定し、
前記履歴記憶プログラム生成手順は、ｆメソッドの実行の検知に応じ、当該ルール要素に規定された要件が満たされていることを記録し、ｅメソッドの実行の検知に応じ、当該要件が満たされていないことを記録し、ｄメソッドの実行の検知に応じ、当該要件が満たされていることを記録する前記履歴記録プログラムを生成する付記２記載の文脈違反検出支援方法。
（付記５）
前記ルール要素は、ｈメソッド内において、ｇメソッドが実行されなければならないことを規定し、
前記履歴記憶プログラム生成手順は、ｈメソッドの実行の検知に応じ、当該ルール要素に規定された要件が満たされていないことを記録し、ｇメソッドの実行の検知に応じ、当該要件が満たされていることを記録する前記履歴記録プログラムを生成する付記２記載の文脈違反検出支援方法。
（付記６）
記憶手段が記憶する、メソッドの集合に関する文脈上の規則情報を、前記記憶手段から読み出して解析する規則解析手段と、
前記メソッドの集合を利用するプログラムによる前記規則情報に係る前記メソッドの実行の検知に応じて該実行の履歴を記録する履歴記録プログラムを生成する履歴記憶プログラム生成手段と、
前記履歴を前記規則情報と照合して、前記プログラムによる前記メソッドの利用が前記規則情報を満たしているか否かを判定する検証プログラムを生成するルール検証プログラム生成手段とを有する文脈違反検出支援装置。
（付記７）
前記規則情報は、前記メソッドの呼び出しの要又は前記メソッドの呼び出し順に関する要件を規定するルール要素と、複数の前記ルール要素間の論理関係とを含み、
前記履歴記憶プログラム生成手段は、前記ルール要素に係る前記メソッドの実行の検知に応じて該実行の履歴を記録し、前記履歴に基づいて前記ルール要素に規定された要件が満たされているか否かを判定し、該判定結果を記録する前記履歴記録プログラムを生成し、
前記ルール検証プログラム生成手段は、該判定結果を前記論理関係に当てはめて、前記プログラムによる前記メソッドの呼び出しが前記規則情報を満たしているか否かを判定する前記検証プログラムを生成する付記６記載の文脈違反検出支援装置。
（付記８）
前記ルール要素は、ｃメソッド内において、ｂメソッドが実行される場合はｂメソッドの実行前にａメソッドが実行されなければならないことを規定し、
前記履歴記憶プログラム生成手段は、ｃメソッドの実行の検知に応じ、ａメソッドが呼び出されていないことを記録し、ａメソッドの実行の検知に応じ、ａメソッドが実行されたことを記録し、ｂメソッドの実行の検知に応じ、ａメソッドが実行されたか否かに基づいて当該ルール要素に規定された要件が満たされたか否かを判定し、該判定結果を記録する前記履歴記録プログラムを生成する付記７記載の文脈違反検出支援装置。
（付記９）
前記ルール要素は、ｆメソッド内において、ｅメソッドが実行される場合はｅメソッドの実行後にｄメソッドが実行されなければならないことを規定し、
前記履歴記憶プログラム生成手段は、ｆメソッドの実行の検知に応じ、当該ルール要素に規定された要件が満たされていることを記録し、ｅメソッドの実行の検知に応じ、当該要件が満たされていないことを記録し、ｄメソッドの実行の検知に応じ、当該要件が満たされていることを記録する前記履歴記録プログラムを生成する付記７記載の文脈違反検出支援装置。
（付記１０）
前記ルール要素は、ｈメソッド内において、ｇメソッドが実行されなければならないことを規定し、
前記履歴記憶プログラム生成手段は、ｈメソッドの実行の検知に応じ、当該ルール要素に規定された要件が満たされていないことを記録し、ｇメソッドの実行の検知に応じ、当該要件が満たされていることを記録する前記履歴記録プログラムを生成する付記７記載の文脈違反検出支援装置。
（付記１１）
記憶手段が記憶する、メソッドの集合に関する文脈上の規則情報を、前記記憶手段から読み出して解析する規則解析手順と、
前記メソッドの集合を利用するプログラムによる前記規則情報に係る前記メソッドの実行の検知に応じて該実行の履歴を記録する履歴記録プログラムを生成する履歴記憶プログラム生成手順と、
前記履歴を前記規則情報と照合して、前記プログラムによる前記メソッドの利用が前記規則情報を満たしているか否かを判定する検証プログラムを生成するルール検証プログラム生成手順とをコンピュータに実行させる文脈違反検出支援プログラム。
（付記１２）
前記規則情報は、前記メソッドの呼び出しの要又は前記メソッドの呼び出し順に関する要件を規定するルール要素と、複数の前記ルール要素間の論理関係とを含み、
前記履歴記憶プログラム生成手順は、前記ルール要素に係る前記メソッドの実行の検知に応じて該実行の履歴を記録し、前記履歴に基づいて前記ルール要素に規定された要件が満たされているか否かを判定し、該判定結果を記録する前記履歴記録プログラムを生成し、
前記ルール検証プログラム生成手順は、該判定結果を前記論理関係に当てはめて、前記プログラムによる前記メソッドの呼び出しが前記規則情報を満たしているか否かを判定する前記検証プログラムを生成する付記１１記載の文脈違反検出支援プログラム。
（付記１３）
前記ルール要素は、ｃメソッド内において、ｂメソッドが実行される場合はｂメソッドの実行前にａメソッドが実行されなければならないことを規定し、
前記履歴記憶プログラム生成手順は、ｃメソッドの実行の検知に応じ、ａメソッドが呼び出されていないことを記録し、ａメソッドの実行の検知に応じ、ａメソッドが実行されたことを記録し、ｂメソッドの実行の検知に応じ、ａメソッドが実行されたか否かに基づいて当該ルール要素に規定された要件が満たされたか否かを判定し、該判定結果を記録する前記履歴記録プログラムを生成する付記１２記載の文脈違反検出支援プログラム。
（付記１４）
前記ルール要素は、ｆメソッド内において、ｅメソッドが実行される場合はｅメソッドの実行後にｄメソッドが実行されなければならないことを規定し、
前記履歴記憶プログラム生成手順は、ｆメソッドの実行の検知に応じ、当該ルール要素に規定された要件が満たされていることを記録し、ｅメソッドの実行の検知に応じ、当該要件が満たされていないことを記録し、ｄメソッドの実行の検知に応じ、当該要件が満たされていることを記録する前記履歴記録プログラムを生成する付記１２記載の文脈違反検出支援プログラム。
（付記１５）
前記ルール要素は、ｈメソッド内において、ｇメソッドが実行されなければならないことを規定し、
前記履歴記憶プログラム生成手順は、ｈメソッドの実行の検知に応じ、当該ルール要素に規定された要件が満たされていないことを記録し、ｇメソッドの実行の検知に応じ、当該要件が満たされていることを記録する前記履歴記録プログラムを生成する付記１２記載の文脈違反検出支援プログラム。
【符号の説明】
【０１８６】
１０          文脈違反検出支援装置
１１          ルール記述記憶部
１２          ルール解析部
１３          プログラム生成部
１４          及び雛形データ記憶部
１００        ドライブ装置
１０１        記録媒体
１０２        補助記憶装置
１０３        メモリ装置
１０４        ＣＰＵ
１０５        インタフェース装置
１０６        表示装置
１０７        入力装置
１３１        履歴記録プログラム生成部
１３２        ルール検証プログラム生成部
Ｂ            バス
Ｐｒ          履歴記録プログラム
Ｐｃ          ルール検証プログラム
【図１】
0005556480.tif 000002
【図２】
0005556480.tif 000003
【図３】
0005556480.tif 000004
【図４】
0005556480.tif 000005
【図５】
0005556480.tif 000006
【図６】
0005556480.tif 000007
【図７】
0005556480.tif 000008
【図８】
0005556480.tif 000009
【図９】
0005556480.tif 000010
【図１０】
0005556480.tif 000011
【図１１】
0005556480.tif 000012
【図１２】
0005556480.tif 000013
【図１３】
0005556480.tif 000014
【図１４】
0005556480.tif 000015
【図１５】
0005556480.tif 000016
【図１６】
0005556480.tif 000017
【図１７】
0005556480.tif 000018
【図１８】
0005556480.tif 000019
【図１９】
0005556480.tif 000020
【図２０】
0005556480.tif 000021
【図２１】
0005556480.tif 000022
【図２２】
0005556480.tif 000023
【図２３】
0005556480.tif 000024
【図２４】
0005556480.tif 000025
【図２５】
0005556480.tif 000026
【図２６】
0005556480.tif 000027
【図２７】
0005556480.tif 000028
【図２８】
0005556480.tif 000029
【図２９】
0005556480.tif 000030
【図３０】
0005556480.tif 000031
【図３１】
0005556480.tif 000032
【図３２】
0005556480.tif 000033
【図３３】
0005556480.tif 000034
【図３４】
0005556480.tif 000035
【図３５】
0005556480.tif 000036
【図３６】
0005556480.tif 000037