(57)【要約】【課題】コンパイル後のバイナリデータから更新されたモジュールを特定することを課題とする。【解決手段】モジュール更新検出装置は、モジュールが更新されたソースファイルをコンパイルして得られたバイナリデータから該バイナリデータによって実行される操作情報を抽出する。そして、モジュール更新検出装置は、操作情報から機械語命令を抽出し、抽出された機械語命令から更新後のオペコードを抽出する。一方で、モジュール更新検出装置は、モジュールが更新される前のソースファイルをコンパイルして得られたバイナリデータから該バイナリデータによって実行される操作情報を抽出する。そして、モジュール更新検出装置は、操作情報から機械語命令を抽出し、抽出された機械語命令から更新前のオペコードを抽出する。その後、モジュール更新検出装置は、更新後のオペコードと更新前のオペコードとを比較してモジュールが更新されたか否かを検出する。【選択図】図１
2011141702.tif 000002
【特許請求の範囲】
【請求項１】
モジュールが更新されたソースファイルをコンパイルして得られたバイナリデータから該バイナリデータによって実行される操作情報を抽出する操作抽出手順と、
前記操作抽出手順により抽出された操作情報から機械語命令を抽出する命令抽出手順と、
前記命令抽出手順によって抽出された機械語命令からオペコードを抽出するコード抽出手順と、
前記コード抽出手順によって抽出されたオペコードと、前記モジュールが更新される前のソースファイルをコンパイルして得られたバイナリデータから抽出されたオペコードとを比較して、前記モジュールが更新されたか否かを検出する更新検出手順と
をコンピュータに実行させることを特徴とするモジュール更新検出プログラム。
【請求項２】
前記更新検出手順は、前記コード抽出手順によって抽出されたオペコードのハッシュ値と、前記更新される前のバイナリデータから抽出されたオペコードのハッシュ値とを比較して、前記モジュールが更新されたか否かを検出することを特徴とする請求項１に記載のモジュール更新検出プログラム。
【請求項３】
モジュールが更新されたソースファイルをコンパイルして得られたバイナリデータから該バイナリデータによって実行される操作情報を抽出する操作抽出工程と、
前記操作抽出工程により抽出された操作情報から機械語命令を抽出する命令抽出工程と、
前記命令抽出工程によって抽出された機械語命令からオペコードを抽出するコード抽出工程と、
前記コード抽出工程によって抽出されたオペコードと、前記モジュールが更新される前のソースファイルをコンパイルして得られたバイナリデータから抽出されたオペコードとを比較して、前記モジュールが更新されたか否かを検出する更新検出工程と
を含んだことを特徴とするモジュール更新検出方法。
【請求項４】
前記更新検出工程は、前記コード抽出工程によって抽出されたオペコードのハッシュ値と、前記更新される前のバイナリデータから抽出されたオペコードのハッシュ値とを比較して、前記モジュールが更新されたか否かを検出することを特徴とする請求項３に記載のモジュール更新検出方法。
【請求項５】
モジュールが更新される前のソースファイルをコンパイルして得られたバイナリデータから抽出したオペコードを記憶するコード記憶部と、
前記モジュールが更新されたソースファイルをコンパイルして得られたバイナリデータから該バイナリデータによって実行される操作情報を抽出する操作抽出部と、
前記操作抽出部により抽出された操作情報から機械語命令を抽出する命令抽出部と、
前記命令抽出部によって抽出された機械語命令からオペコードを抽出するコード抽出部と、
前記コード抽出部によって抽出されたオペコードと、前記コード記憶部に記憶されるオペコードとを比較して、前記モジュールが更新されたか否かを検出する更新検出部と
を有することを特徴とするモジュール更新検出装置。
【請求項６】
前記更新検出部は、前記コード抽出部によって抽出されたオペコードのハッシュ値と、前記コード記憶部に記憶されるオペコードのハッシュ値とを比較して、前記モジュールが更新されたか否かを検出することを特徴とする請求項５に記載のモジュール更新検出装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、モジュール更新検出プログラム、モジュール更新検出方法及びモジュール更新検出装置に関する。
【背景技術】
【０００２】
従来、システム仕様の変更等によってプログラムのモジュールが変更されたことを検出する手法として、更新前のモジュールと更新後のモジュールを比較して検出する手法が利用されている。具体的には、モジュールのソースファイルを比較する手法やモジュールのコンパイル後のバイナリデータを比較する手法が利用されている。
【０００３】
例えば、モジュールのソースファイルを比較する手法の場合、図１３の（１）に示すように、ユーザは、ソースファイル内のメソッド等を目視で確認することができるので、メソッドの更新や追加、削除など更新された箇所も目視によって検出することができる。ところが、規模が大きいソースファイルの場合には、ユーザの負担が大きく、さらには、見落としなども発生し、正確に検出することが難しい。このため、最近では、Windiffなどのファイル比較ツールによってソースファイルの比較を行う手法が利用されている。
【０００４】
そして、コンパイル後のバイナリデータであるクラスファイルを比較する手法の場合、図１３の（２）に示すように、ユーザは、クラスファイルを目視で確認することが難しい。ところが、クラスファイルは、元のソースファイルが異なればコンパイル結果も異なる。このことから、モジュール変更前のコンパイルで得られたクラスファイルと変更後のコンパイルで得られたクラスファイルとを比較することで、ソースファイル自体が更新されたか否かを検出することができる。なお、図１３は、従来技術を説明する図である。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平９−２５１４００号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、従来の技術では、更新前後のモジュールのソースファイルを比較しなければ、更新されたモジュールを特定することができないという課題があった。例えば、ファイル比較ツールによって更新前後のソースファイルを比較した場合、更新されたモジュールを特定できるが、モジュールのソースファイルの比較が必須である。
【０００７】
また、コンパイル後のバイナリデータを比較した場合、ソースファイルが更新された又は更新されていないことしか特定することができず、どのモジュールが更新されたかまで特定することができない。つまり、従来のいずれの技術を用いた場合でも、モジュールのソースファイルがなければ、更新されたモジュールを特定することができない。
【０００８】
開示の技術は、上記に鑑みてなされたものであって、コンパイル後のバイナリデータから更新されたモジュールを特定することが可能であるモジュール更新検出プログラム、モジュール更新検出方法及びモジュール更新検出装置を提供することを目的とする。
【課題を解決するための手段】
【０００９】
本願の開示するモジュール更新検出プログラム、モジュール更新検出方法及びモジュール更新検出装置は、一つの態様において、モジュールが更新されたソースファイルをコンパイルして得られたバイナリデータから該バイナリデータによって実行される操作情報を抽出する操作抽出手順をコンピュータに実行させる。また、前記操作抽出手順により抽出された操作情報から機械語命令を抽出する命令抽出手順と、前記命令抽出手順によって抽出された機械語命令からオペコードを抽出するコード抽出手順とをコンピュータに実行させる。また、前記コード抽出手順によって抽出されたオペコードと、前記モジュールが更新される前のソースファイルをコンパイルして得られたバイナリデータから抽出されたオペコードとを比較して、前記モジュールが更新されたか否かを検出する更新検出手順とをコンピュータに実行させる。
【発明の効果】
【００１０】
本願の開示するモジュール更新検出プログラム、モジュール更新検出方法及びモジュール更新検出装置の一つの態様によれば、コンパイル後のバイナリデータから更新されたモジュールを特定することが可能であるという効果を奏する。
【図面の簡単な説明】
【００１１】
【図１】図１は、実施例１に係るモジュール更新検出装置の構成を示すブロック図である。
【図２】図２は、実施例２に係るモジュール更新検出装置の構成を示すブロック図である。
【図３】図３は、検出対象クラスファイルＤＢに記憶される情報の例を示す図である。
【図４】図４は、抽出条件ＤＢに記憶されるメソッド抽出の条件例を示す図である。
【図５】図５は、抽出条件ＤＢに記憶される属性抽出の条件例を示す図である。
【図６】図６は、抽出条件ＤＢに記憶されるバイトコード抽出の条件例を示す図である。
【図７】図７は、抽出条件ＤＢに記憶されるオペコード抽出の条件例を示す図である。
【図８】図８は、更新前オペコード情報ＤＢに記憶される情報の例を示す図である。
【図９】図９は、クラスファイルからメソッドを抽出する例を示す図である。
【図１０】図１０は、メソッドからオペコードを抽出する例を示す図である。
【図１１】図１１は、実施例２に係るモジュール更新検出装置における処理の流れを示すフローチャートである。
【図１２】図１２は、モジュール更新検出プログラムを実行するコンピュータシステムの例を示す図である。
【図１３】図１３は、従来技術を説明する図である。
【発明を実施するための形態】
【００１２】
以下に、本願の開示するモジュール更新検出プログラム、モジュール更新検出方法及びモジュール更新検出装置の実施例を図面に基づいて詳細に説明する。なお、この実施例によりこの発明が限定されるものではない。
【実施例１】
【００１３】
図１は、実施例１に係るモジュール更新検出装置の構成を示すブロック図である。図１に示すモジュール更新検出装置１は、開発途中または開発されたソースコード等のプログラムをテストするテスト機に内蔵されていてもよく、ソースコードをコンパイルするコンパイラーに内蔵されていてもよい。実施例１に係るモジュール更新検出装置１は、コンパイラーと接続され、コンパイラーからコンパイル後のバイナリデータ２を受信する例を示している。
【００１４】
実施例１に係るモジュール更新検出装置１は、操作抽出部１ａと命令抽出部１ｂとコード抽出部１ｃと更新検出部１ｄとを有する。操作抽出部１ａは、モジュールが更新されたソースファイルをコンパイルして得られたバイナリデータ２から該バイナリデータによって実行される操作情報を抽出する。
【００１５】
命令抽出部１ｂは、操作抽出部１ａにより抽出された操作情報から機械語命令を抽出する。コード抽出部１ｃは、命令抽出部１ｂによって抽出された機械語命令からオペコードを抽出する。更新検出部１ｄは、コード抽出部１ｃによって抽出されたオペコードと、モジュールが更新される前のソースファイルをコンパイルして得られたバイナリデータから抽出されたオペコードとを比較して、モジュールが更新されたか否かを検出する。そして、モジュール更新検出装置１は、比較した結果を更新検出結果３として外部装置に送信したり、ディスプレイ等に表示したりする。
【００１６】
すなわち、実施例１に係るモジュール更新検出装置１は、モジュール変更によって変更されるオペコードを比較することで、コンパイル後の実資産であるバイナリデータからソースコード内のそのモジュールが更新されたかを検出することができる。この結果、実施例１に係るモジュール更新検出装置１は、コンパイル後のバイナリデータから更新されたモジュールを特定することが可能である。
【実施例２】
【００１７】
ところで、モジュール更新検出装置は、実施例１で説明した制御部以外にも様々な制御部を有していてもよい。そこで、実施例２では、実施例１で説明した制御部以外にも様々な制御部を有するモジュール更新検出装置について説明する。
【００１８】
［モジュール更新検出装置の構成］
まず、図２を用いて、実施例２に係るモジュール更新検出装置の構成を説明する。図２は、実施例２に係るモジュール更新検出装置の構成を示すブロック図である。図２に示すように、モジュール更新検出装置１０は、通信制御Ｉ／Ｆ（InterFace）部１１と入力部１２と表示部１３と記憶部１５と制御部２０とを有する。
【００１９】
通信制御Ｉ／Ｆ部１１は、少なくとも１つの通信ポートを有するインタフェースであり、他の装置との間でやり取りされる情報を制御する。例えば、通信制御Ｉ／Ｆ部１１は、コンパイラーと接続され、Java（登録商標）ソースファイルをコンパイルして得られたクラスファイルを受信し、後述する記憶部１５の検出対象クラスファイルＤＢ（DataBase）１６や更新前オペコード情報ＤＢ１８に格納する。また、通信制御Ｉ／Ｆ部１１は、プログラム開発者が利用する管理コンピュータと接続され、モジュールの更新検出処理開始指示を受信し、モジュール更新検出結果等を送信する。
【００２０】
入力部１２は、例えば、キーボードやマウス、マイクなどであり、モジュールの更新検出処理開始指示や終了指示の入力をユーザから受付け、後述する制御部２０等に入力する。また、入力部１２は、ＣＤ（Compact  Disc）、ＤＶＤ（Digital  Versatile  Disc）や磁気ディスクなどの記憶媒体を読み込んで情報を読み出したり、情報を書き込んだりすることができる。例えば、入力部１２は、クラスファイルを記憶媒体から読み出して記憶部１５に格納することができる。
【００２１】
なお、後述する表示部１３も、マウスと協働してポインティングディバイス機能を実現する。表示部１３は、例えば、モニタ、ディスプレイ、タッチパネルやスピーカなどであり、後述する制御部２０で実施されたモジュール更新検出結果などを表示出力する。
【００２２】
記憶部１５は、制御部２０による各種処理に必要なデータおよびプログラムを格納するとともに、検出対象クラスファイルＤＢ１６と、抽出条件ＤＢ１７と、更新前オペコード情報ＤＢ１８とを有する。この検出対象クラスファイルＤＢ１６、抽出条件ＤＢ１７、更新前オペコード情報ＤＢ１８は、例えば、ＲＡＭ（Random  Access  Memory）などの半導体メモリ素子やハードディスク、光ディスクなどの記憶装置である。
【００２３】
検出対象クラスファイルＤＢ１６は、モジュール更新検出処理を実施するクラスファイルを記憶する。例えば、検出対象クラスファイルＤＢ１６は、図３に示すように、コンパイラーによってコンパイルされたバイナリデータであり、１６進数表記でダンプされたクラスファイルを記憶する。検出対象クラスファイルＤＢ１６は、通信制御Ｉ／Ｆ部１１を介して受け付けたクラスファイルを記憶してもよく、入力部１２によって受け付けられた記憶媒体から読み出して記憶してもよく、記憶させる手法はどのような手法であってもよい。なお、図３は、検出対象クラスファイルＤＢに記憶される情報の例を示す図である。
【００２４】
抽出条件ＤＢ１７は、制御部２０の各機能部が検出対象クラスファイルＤＢ１６に記憶されるクラスファイルからオペコードを抽出する際に使用する抽出条件を記憶する。例えば、抽出条件ＤＢ１７は、図４〜図７に示す各条件を記憶する。なお、図４は、抽出条件ＤＢに記憶されるメソッド抽出の条件例を示す図であり、図５は、抽出条件ＤＢに記憶される属性抽出の条件例を示す図である。図６は、抽出条件ＤＢに記憶されるバイトコード抽出の条件例を示す図であり、図７は、抽出条件ＤＢに記憶されるオペコード抽出の条件例を示す図である。
【００２５】
例えば、抽出条件ＤＢ１７は、図４に示すように、「クラスファイル」から「メソッド」を抽出する際に、メソッド抽出部２１によって使用されるメソッド抽出条件を記憶する。具体的には、抽出条件ＤＢ１７は、クラスファイルに記憶される「要素」と該要素の「サイズ」を対応付けて記憶する。例えば、抽出条件ＤＢ１７は、「要素、サイズ」として「マジックナンバー、４バイト」、「マイナーバージョン、２バイト」、「メジャーバージョン、２バイト」、「コンスタントプール数、２バイト」、「コンスタントプール、可変長」を記憶する。また、抽出条件ＤＢ１７は、「アクセスフラグ、２バイト」、「自クラス、２バイト」、「親クラス、２バイト」、「インタフェース数、２バイト」、「インタフェース、２バイト×インタフェース数」を記憶する。また、抽出条件ＤＢ１７は、「フィールド数、２バイト」、「フィールド、可変長」、「メソッド数、２バイト」、「メソッド、可変長」、「属性数、２バイト」、「属性、可変長」を記憶する。
【００２６】
ここで記憶されるメソッド抽出条件は、クラスファイルのどの位置にどのような情報が書き込まれているかを示す情報である。一例としては、クラスファイルの先頭から４バイト目までの位置に「マジックナンバー」が書き込まれており、マジックナンバーの次の２バイト、言い換えると、クラスファイルの５バイト目と６バイト目の位置に「マイナーバージョン」が書き込まれている。そして、メソッド抽出部２１は、このようにクラスファイルの先頭からメソッド抽出条件に従って各情報を抽出していき、クラスファイル内から「メソッド数」情報と「メソッド」情報とを抽出する。
【００２７】
なお、マジックナンバーは、クラスファイルフォーマットを識別する情報であり、例えば０ｘＣＡＦＥＢＡＢＥという値となる。マイナーバージョンは、クラスファイルのマイナーバージョンを示し、メジャーバージョンは、クラスファイルのメジャーバージョンを示す。コンスタントプール数とは、次に続くコンスタントプールの要素数を示し、コンスタントプールとは、インデックスによるアクセスが可能であり、クラスファイル内から参照される様々な定数を表現するための構造体テーブルを示す。アクセスフラグは、クラスやインタフェースのアクセス許可や属性を表すフラグである。
【００２８】
自クラスは、自身のクラス情報を表すコンスタントプール情報のインデックスを示す情報であり、親クラスは、自身の親クラス情報を表すコンスタントプール情報のインデックスを示す情報である。インタフェース数は、実装しているインタフェースの数を示し、インタフェースは、実装しているインタフェース情報を表すコンスタントプール情報のインデックスの配列を示す。フィールド数は、クラスフィールドの数を示し、フィールドは、クラスフィールドを表す情報の配列を示す。メソッド数は、メソッドの数を示し、メソッドは、メソッドを表す情報の配列を示す。属性数は、属性の数を示し、属性は、属性を表す情報の配列を示す。
【００２９】
また、抽出条件ＤＢ１７は、図５に示すように、「メソッド」情報から「属性」情報を抽出する際に、属性抽出部２２によって使用される属性抽出条件を記憶する。具体的には、抽出条件ＤＢ１７は、メソッド情報に含まれる「要素」と該要素の「サイズ」を対応付けて記憶する。例えば、抽出条件ＤＢ１７は、「要素、サイズ」として「アクセスフラグ、２バイト」、「メソッド名、２バイト」、「デスクリプタ、２バイト」、「属性数、２バイト」、「属性、可変長」などと記憶する。
【００３０】
ここで記憶される属性抽出条件は、クラスファイルから抽出された「メソッド」情報のどの位置に「属性」情報が書き込まれているかを示す情報である。一例としては、メソッド抽出部２１により抽出されたメソッド情報の先頭から２バイト目までの位置に「アクセスフラグ」が書き込まれている。また、アクセスフラグの次の２バイト、言い換えると、メソッド情報の３バイト目と４バイト目の位置に「メソッド名」が書き込まれている。そして、属性抽出部２２は、このようにメソッド情報の先頭から属性抽出条件に従って各情報を抽出していき、「メソッド」情報内から「属性」情報を抽出する。
【００３１】
なお、アクセスフラグは、メソッドのアクセス許可や属性を表すマスクフラグを示し、メソッド名は、メソッド名を表すコンスタントプール情報のインデックスを示す。デスクリプリタは、メソッドディスクリプタを表すコンスタントプール情報のインデックスを示す。属性数は、属性の数を示し、属性は、メソッドの属性を表す情報の配列を示す。
【００３２】
また、抽出条件ＤＢ１７は、図６に示すように、「属性」情報から「バイトコード」情報を抽出する際に、バイトコード抽出部２３によって使用されるバイトコード抽出条件を記憶する。具体的には、抽出条件ＤＢ１７は、属性情報に記憶される「要素」と該要素の「サイズ」を対応付けて記憶する。例えば、抽出条件ＤＢ１７は、「要素、サイズ」として「アトリビュート名、２バイト」、「アトリビュート長さ、４バイト」、「最大スタック、２バイト」、「最大ローカル変数数、２バイト」を記憶する。また、抽出条件ＤＢ１７は、「コードの長さ、４バイト」、「コード、コードの長さ」、「例外テーブル数、２バイト」、「例外テーブル、８×例外テーブル数」、「属性数、２バイト」、「属性、可変長」を記憶する。
【００３３】
ここで記憶されるバイトコード抽出条件は、クラスファイルから抽出された「属性」情報のどの位置に「バイトコード」情報が書き込まれているかを示す情報である。一例としては、属性抽出部２２によって抽出された属性情報の先頭から２バイト目までの位置に「アトリビュート名」が書き込まれている。また、アトリビュート名の次の４バイト、言い換えると、属性情報の３バイト目から６バイト目の位置に「アトリビュート長さ」が書き込まれている。そして、バイトコード抽出部２３は、このように属性情報の先頭からバイトコード抽出条件に従って各情報を抽出していき、「属性」情報内から「バイトコード」情報を抽出する。
【００３４】
なお、アトリビュート名は、文字列「Code」を表すコンスタントプール情報のインデックスを示し、アトリビュート長さは、このアトリビュート（属性）の長さを示す。最大スタックは、オペランド・スタックの最大深さを示し、最大ローカル変数数は、ローカル変数の数を示す。コードの長さは、バイトコードの長さを示し、コードは、機械語命令であるバイトコードを示す。例外テーブル数は、例外テーブルの数を示し、例外テーブルは、このメソッドが扱う例外情報の配列を示す。属性数は、属性の数を示し、属性は、CodeAttributeの属性を表す情報の配列を示す。
【００３５】
また、抽出条件ＤＢ１７は、図７に示すように、「バイトコード」情報から「オペコード」情報を抽出する際に、オペコード抽出部２４によって使用されるオペコード抽出条件を記憶する。具体的には、抽出条件ＤＢ１７は、バイトコード情報に含まれる情報として、「オペコード、オペランド１、オペランド２・・・」などと記憶する。ここで記憶されるオペコード抽出条件は、クラスファイルから抽出された「バイトコード」情報のどの位置に「オペコード」情報が書き込まれているかを示す情報である。オペコード抽出部２４は、この情報を用いて、「バイトコード」情報内から「オペコード」情報を抽出する。オペコードは２０４種類存在し、それぞれオペランドのサイズ、意味が異なるが、オペコードごとにそのサイズと意味は決まっている。このため、オペコード抽出部２４は、オペコードとそのオペランドのサイズが全て把握できている状態であるオペコード抽出条件を用いることで、バイトコードを先頭から順に参照してオペコードのみを抜き出すことができる。
【００３６】
図２に戻り、更新前オペコード情報ＤＢ１８は、検出対象となるクラスファイルの更新前の状態から抽出したオペコードを記憶する。この更新前オペコード情報ＤＢ１８で記憶されるオペコードやオペランドは、後述する制御部２０の各制御部が実行されることで取得されて格納される。
【００３７】
また、更新前オペコード情報ＤＢ１８は、例えば、クラスファイルを特定する「識別子」と、クラスファイル内のメソッドごとに抽出した「オペコード」とを対応付けて記憶する。こうすることで、更新前オペコード情報ＤＢ１８は、複数のクラスファイル各々から抽出したオペコードを一意に特定できるように記憶することができる。
【００３８】
一例としては、更新前オペコード情報ＤＢ１８は、図８に示すように、「Ｉｎｄｅｘ、オペコード、オペランド」として「０、２Ａ、−」、「１、Ｂ１、−」、「３、−、００」、「４、−、２Ｅ」などと記憶する。さらに、更新前オペコード情報ＤＢ１８は、図８に示すように、ソースファイル内で実際に実行される行を示す有効行位置情報を記憶する。このＩｎｄｅｘは、抽出したオペコードやオペランドを区別する項番を示す。オペコードは、ＣＰＵ（Central  Processing  Unit）などのプロセッサの命令をビット列に置き換えたものであり、プロセッサに処理させる命令の番号を示す。オペランドは、演算が作用する対象であり、情報として利用するデータが格納されているメモリアドレスや演算結果を格納する場所等を示す。なお、図８は、更新前オペコード情報ＤＢに記憶される情報の例を示す図である。
【００３９】
また、更新前オペコード情報ＤＢ１８は、クラスファイルのバージョンごとに、抽出したメソッド、オペコードを対応付けて記憶してもよい。例えば、更新前オペコード情報ＤＢ１８は、クラスファイルを特定する「クラス識別子」、クラスファイルの更新履歴を示す「バージョン」、メソッドを識別する「メソッド識別子」、抽出した「オペコード」を対応付けて記憶する。こうすることで、モジュール更新検出装置１０は、現在のクラスファイルから抽出したオペコードと、ユーザが指定する任意のバージョンのクラスファイルから抽出したオペコードとを比較することができる。この結果、開発者などは、現在のクラスファイルが任意のバージョンのクラスファイルからどの程度更新されているかを認識することができる。また、モジュール更新検出装置１０は、ユーザが指定する２つの任意のバージョンのクラスファイル各々から抽出したオペコードを比較することもできる。
【００４０】
制御部２０は、例えば、ＡＳＩＣ（Application  Specific  Integrated  Circuit）などの集積回路やＣＰＵやＭＰＵ（Micro  Processing  Unit）などの電子回路である。この制御部２０は、ＯＳ（Operating  System）などの制御プログラム、各種の処理手順などを規定したプログラムおよび所要データを格納するための内部メモリを有する。さらに、制御部２０は、メソッド抽出部２１と属性抽出部２２とバイトコード抽出部２３とオペコード抽出部２４と更新検出部２５とを有し、これらによって各種処理を実行する。
【００４１】
メソッド抽出部２１は、モジュールが更新されたJavaソースファイルをコンパイルして得られたクラスファイルからメソッド情報を抽出する。例えば、メソッド抽出部２１は、入力部１２等によってモジュールの更新検出処理開始指示が受け付けられると、検出対象クラスファイルＤＢ１６に記憶されるクラスファイルを読み込む。そして、メソッド抽出部２１は、抽出条件ＤＢ１７に記憶されるメソッド抽出条件に従って、読み込んだクラスファイルからメソッドを抽出し、抽出したメソッドを属性抽出部２２に出力する。または、メソッド抽出部２１は、抽出したメソッドをメモリ等に書き込む。
【００４２】
一例としては、メソッド抽出部２１は、メソッド抽出条件に従って、図３に示す１６進数表記のクラスファイルから「ＣＡ  ＦＥ  ＢＡ  ＢＥ」をマジックナンバーとして抽出する。続いて、メソッド抽出部２１は、「００  ００」をマイナーバージョン、続く「００  ３１」をメジャーバージョンとして抽出する。続けて、メソッド抽出部２１は、「００  ３７」をコンスタントプール数として抽出し、「０ｘ００３７」＝「５４」個の要素を有するコンスタントプールを抽出する。すなわち、メソッド抽出部２１は、要素１を「０７  ００  ０２」として抽出する。このように、メソッド抽出部２１は、クラスファイルのコンスタントプール数「００  ３７」以降から順番にコンスタントプールを抽出する。
【００４３】
コンスタントプール数を抽出後、メソッド抽出部２１は、メソッド抽出条件に従って、「アクセスフラグ」、「自クラス」、「親クラス」、「インタフェース数」、「インタフェース」、「フィールド数」、「フィールド」をクラスファイルから順番に抽出する。その後、メソッド抽出部２１は、「メソッド数」をクラスファイルから抽出し、抽出されたメソッド数分の「メソッド」をクラスファイルから抽出する。
【００４４】
例えば、メソッド抽出部２１は、図９に示すように、クラスファイルから「６１  ２Ｆ  ６Ｃ  ６１  ６Ｅ  ６７  ２Ｆ  ４Ｆ  ６２  ６Ａ  ６５  ６３  ７４  ０１  ００  ０５  ６３  ６Ｆ  ７５  ６Ｅ  ７４  ０１  ００  ０１」をメソッドＡとして抽出する。同様に、メソッド抽出部２１は、「４９  ０１  ００  ０６  ３Ｃ  ６９  ６Ｅ  ６９  ７４  ３Ｅ  ０１  ００  １５  ２８  ４Ｃ  ６Ａ  ６１  ７６  ６１  ２Ｆ  ６Ｃ  ６１  ６Ｅ  ６７」をメソッドＢとして抽出する。同様に、メソッド抽出部２１は、「２Ｆ  ５３  ７４  ７２  ６９  ６Ｅ  ６７  ３Ｂ  ２９  ５６  ０１  ００  ０４  ４３  ６Ｆ  ６４  ６５  ０７  ００  ０Ｂ  ０１  ００  ０Ｆ  ６Ａ」をメソッドＣとして抽出する。そして、メソッド抽出部２１は、抽出したメソッドＡ、Ｂ、Ｃを属性抽出部２２に出力する。なお、図８は、クラスファイルからメソッドを抽出する例を示す図である。
【００４５】
属性抽出部２２は、メソッド抽出部２１により抽出されたメソッド情報からメソッド情報の属性を抽出する。例えば、属性抽出部２２は、メソッド抽出部２１により抽出されたメソッドＡ、メソッドＢ、メソッドＣそれぞれから、抽出条件ＤＢ１７に記憶される属性抽出条件に従って属性情報を抽出し、抽出した属性情報をバイトコード抽出部２３に出力する。
【００４６】
一例としては、属性抽出部２２は、メソッドＢ「４９  ０１  ００  ０６  ３Ｃ  ６９  ６Ｅ  ６９  ７４  ３Ｅ  ０１  ００  １５  ２８  ４Ｃ  ６Ａ  ６１  ７６  ６１  ２Ｆ  ６Ｃ  ６１  ６Ｅ  ６７」の「４９  ０１」をアクセスフラグとして抽出する。続いて、属性抽出部２２は、アクセスフラグの次の２バイト「００  ０６」をメソッド名として抽出し、メソッド名の次の２バイト「３Ｃ  ６９」をデスクリプタとして抽出する。さらに、属性抽出部２２は、デスクリプタの次の２バイト「６Ｅ  ６９」を属性数として抽出し、その後の「７４  ３Ｅ  ０１  ００  １５  ２８  ４Ｃ  ６Ａ  ６１  ７６  ６１  ２Ｆ  ６Ｃ  ６１  ６Ｅ  ６７」を属性情報として抽出する。
【００４７】
バイトコード抽出部２３は、属性抽出部２２によって抽出された属性情報から機械語命令であるバイトコードを抽出する。例えば、バイトコード抽出部２３は、属性抽出部２２によって各メソッドから抽出された各属性情報から、抽出条件ＤＢ１７に記憶されるバイトコード抽出条件に従ってバイトコード情報を抽出し、抽出したバイトコード情報をオペコード抽出部２４に出力する。
【００４８】
一例としては、バイトコード抽出部２３は、メソッドＢの属性情報「７４  ３Ｅ  ０１  ００  １５  ２８  ４Ｃ  ６Ａ  ６１  ７６  ６１  ２Ｆ  ６Ｃ  ６１  ６Ｅ  ６７」の「７４  ３Ｅ」をアトリビュート名として抽出する。続いて、バイトコード抽出部２３は、アトリビュート名の次の４バイト「０１  ００  １５  ２８」をアトリビュート長さとして抽出する。さらに続いて、バイトコード抽出部２３は、アトリビュート長さの次の２バイト「４Ｃ  ６Ａ」を最大スタックとして抽出する。このように、バイトコード抽出部２３は、各属性情報について、属性情報の先頭から順に、バイトコード抽出条件に従って各情報を抽出していき、バイトコード情報を抽出する。
【００４９】
オペコード抽出部２４は、バイトコード抽出部２３によって抽出されたバイトコード情報からオペコードを抽出する。例えば、オペコード抽出部２４は、バイトコード抽出部２３によって各属性情報から抽出された各バイトコード情報から、抽出条件ＤＢ１７に記憶されるオペコード抽出条件に従ってオペコード情報を抽出し、抽出したオペコード情報を更新検出部２５に出力する。
【００５０】
一例としては、バイトコード抽出部２３によって抽出された各メソッド情報のバイトコード情報は、基本的に「オペコード、オペランド１、オペランド２」が繰り返して記載されている。これを利用して、オペコード抽出部２４は、図１０に示すように、「Ｉｎｄｅｘ、オペコード、オペランド」として「０、２Ａ、−」、「１、Ｂ４、−」、「３、−、００」、「４、−、２Ｅ」などと記憶する。さらに、更新前オペコード情報ＤＢ１８は、図８に示すように、ソースファイル内で実際に実行される行を示す有効行位置情報を記憶する。なお、Ｉｎｄｅｘ、オペコード、オペランドについては、図８と同様の情報であり、ここでは詳細な説明は省略する。図１０は、メソッドからオペコードを抽出する例を示す図である。
【００５１】
更新検出部２５は、バイトコード抽出部２３によって抽出されたオペコードと、Javaモジュールが更新される前のクラスファイルから抽出されたオペコードとを比較して、モジュールが更新されたか否かを検出する。例えば、更新検出部２５は、オペコード抽出部２４によって各バイトコード情報から抽出された各オペコード情報について、Javaモジュールが更新される前のクラスファイルから抽出されたオペコードと比較する。そして、比較結果、差異が生じている場合には、更新検出部２５は、更新があったと検出し、更新されたオペコードを有するメソッドを表示部１３や管理コンピュータ等に出力する。
【００５２】
例えば、更新検出部２５は、ユーザにより指定されたバージョンのクラスファイルのオペコードを更新前オペコード情報ＤＢ１８から取得する。そして、更新検出部２５は、バイトコード抽出部２３によって抽出されたオペコードとオペランドと有効行位置情報のうちのオペコードと、更新前オペコード情報ＤＢ１８から取得したオペコードとを比較ツールなどを用いて比較する。比較結果、差異が生じている場合には、更新検出部２５は、ソースファイルが更新されたと検出し、差異があるオペコードを有するメソッドを更新されたメソッドとして検出する。
【００５３】
一例として、更新検出部２５は、更新前のオペコード情報である図８と、更新後のオペコード情報である図１０とを比較した場合、「Ｉｎｄｅｘ＝１」の値が更新前「Ｂ１」であり、更新後「Ｂ４」となっていることから、更新ありを検出する。
【００５４】
［処理の流れ］
次に、図１１を用いて、実施例２に係るモジュール更新検出装置における処理の流れを説明する。図１１は、実施例２に係るモジュール更新検出装置における処理の流れを示すフローチャートである。
【００５５】
図１１に示すように、モジュール更新検出装置１０のメソッド抽出部２１は、入力部１２等によってモジュールの更新検出処理開始指示を受け付ける（ステップＳ１０１）。続いて、メソッド抽出部２１は、検出対象クラスファイルＤＢ１６に記憶されるクラスファイルを１ファイル読み込む（ステップＳ１０２）。
【００５６】
続いて、メソッド抽出部２１は、抽出条件ＤＢ１７に記憶されるメソッド抽出条件に従って、読み込んだクラスファイルからメソッドを抽出する（ステップＳ１０３）。そして、属性抽出部２２は、メソッド抽出部２１により抽出されたメソッド情報を１つ読み込み、読み込んだメソッド情報から抽出条件ＤＢ１７に記憶される属性抽出条件に従ってメソッド情報の属性を抽出する（ステップＳ１０４）。
【００５７】
続いて、バイトコード抽出部２３は、属性抽出部２２によって抽出された属性から、抽出条件ＤＢ１７に記憶されるバイトコード抽出条件に従ってバイトコードを抽出する（ステップＳ１０５）。続いて、オペコード抽出部２４は、バイトコード抽出部２３によって抽出されたバイトコード情報から、抽出条件ＤＢ１７に記憶されるオペコード抽出条件に従ってオペコード情報を抽出する（ステップＳ１０６）。
【００５８】
その後、更新検出部２５は、バイトコード抽出部２３によって抽出されたオペコードと、Javaモジュールが更新される前のクラスファイルから抽出されたオペコードとを比較する（ステップＳ１０７）。比較した結果、差異がある場合には（ステップＳ１０８肯定）、更新検出部２５は、対象のメソッドは更新されたと検出する（ステップＳ１０９）。一方、比較した結果、差異がない場合には（ステップＳ１０９否定）、更新検出部２５は、対象のメソッドは更新されていないと検出する（ステップＳ１１０）。
【００５９】
そして、更新検出部２５は、クラスファイルの全てのメソッドについてステップＳ１０４からステップＳ１１０までの処理を実行した場合には（ステップＳ１１１肯定）、ステップＳ１１２の処理を実行する。その後、更新検出部２５は、更新検出対象のクラスファイルについてステップＳ１０２からステップＳ１１１までの処理を実行した場合には（ステップＳ１１２肯定）、処理を終了する。
【００６０】
一方、ステップＳ１０４からステップＳ１１０までの処理を実行していないメソッドが存在する場合には（ステップＳ１１１否定）、モジュール更新検出装置１０は、ステップＳ１０４以降の処理を実行する。また、ステップＳ１０２からステップＳ１１１までの処理を実行していないクラスファイルが存在する場合には（ステップＳ１１２否定）、モジュール更新検出装置１０は、ステップＳ１０２以降の処理を実行する。
【００６１】
［実施例２による効果］
このように、実施例２に係るモジュール更新検出装置１０は、メソッドが変更された場合に変更されるオペコードのみを比較対象として抽出する。この結果、実施例２に係るモジュール更新検出装置１０は、更新前後のモジュールのソースファイルを比較することなく、コンパイルで得られた更新前後のクラスファイルを比較することで、更新されたメソッドを特定することが可能である。また、モジュール更新検出装置１０は、他のメソッドが変更された場合など他からの影響を受けるオペランドについては比較対象から除外するので、無駄な比較処理を省略することができ、効率的な比較処理を実施でき、更新検出を高速に実行できる。
【００６２】
また、ソースファイル自体を用いず、コンパイル後のクラスファイルから更新を検出できるので、ソースファイルが無い状況であっても、モジュール（メソッド）の更新を確認することができる。また、クラスファイルよりも容量が大きいソースファイルを保持しておく必要もないので、メモリを有効的に活用することができる。
【実施例３】
【００６３】
さて、これまで本発明の実施例について説明したが、本発明は上述した実施例以外にも、種々の異なる形態にて実施されてよいものである。そこで、以下に異なる実施例を説明する。
【００６４】
（比較手法）
例えば、実施例２に係るモジュール更新検出装置１０は、更新前のクラスファイルから抽出したオペコードと、更新後のクラスファイルから抽出されたオペコードとを比較ツールなどを用いて比較する例について説明したが、これに限定されるものではない。一例としては、モジュール更新検出装置１０は、更新前のクラスファイルから抽出したオペコードのハッシュ値と、更新後のクラスファイルから抽出されたオペコードのハッシュ値とを比較して、更新されたか否かを検出することもできる。また、各オペコードのハッシュ値を算出する手法については、一般的なハッシュ関数を用いることができる。
【００６５】
一例としては、モジュール更新検出装置１０は、更新後のクラスファイルから抽出した全てのオペコードを組み合わせた一つのデータを生成し、生成したデータでハッシュ関数を使って計算することで、ハッシュ値を算出する。同様に、モジュール更新検出装置１０は、更新前のクラスファイルから抽出した全てのオペコードを組み合わせた一つのデータを生成し、生成したデータでハッシュ関数を使って計算することで、ハッシュ値を算出する。そして、モジュール更新検出装置１０は、両方のハッシュ値が一致している場合には更新なしと検出し、両方のハッシュ値が一致していない場合には更新ありと検出する。こうすることで、複雑で膨大なソースファイルから得られた膨大なオペコードを比較する場合であっても、効率的に比較することができる。
【００６６】
（対象プログラム）
例えば、実施例２では、更新検出対象として、Javaソースファイルを例にして説明したが、これに限定されるものではない。例えば、コンパイル後のバイナリデータのどの位置にどのような情報が書き込まれているかを判断できる場合には、どのような言語のソースファイルも実施例１や２と同様の手法で、更新を検出することができる。
【００６７】
また、実施例１や２では、オペコードのみを比較対象として更新があったか否かを検出する例について説明したが、これに限定されるものではない。例えば、更新前のオフセットを記憶しておくことで、オペランド自体が変更されたのか、他からの影響によってオペランドが変更されたのかを検出する。その結果、オペランドを用いた比較手法であっても、メソッドが更新されたか否かを検出することができる。
【００６８】
（システム構成等）
また、本実施例において説明した各処理のうち、自動的におこなわれるものとして説明した処理の全部または一部を手動的におこなうこともできる。あるいは、例えば処理開始指示受信など手動的におこなわれるものとして説明した処理の全部または一部を公知の方法で自動的におこなうこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、例えば図３〜図８等に示した各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
【００６９】
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、例えばメソッド抽出部２１と属性抽出部２２とを統合するなど各装置の分散・統合の具体的形態は図示のものに限られない。また、各装置の全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、ＣＰＵおよび当該ＣＰＵにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
【００７０】
（プログラム）
ところで、上記の実施例で説明した各種の処理は、あらかじめ用意されたプログラムをパーソナルコンピュータやワークステーションなどのコンピュータシステムで実行することによって実現することができる。そこで、以下では、上記の実施例と同様の機能を有するプログラムを実行するコンピュータシステムの一例を説明する。
【００７１】
図１２は、モジュール更新検出プログラムを実行するコンピュータシステムの例を示す図である。図１２に示すように、コンピュータシステム１００は、ＲＡＭ１０１と、ＨＤＤ１０２と、ＲＯＭ（Read  Only  Memory）１０３と、ＣＰＵ１０４とを有する。ここで、ＲＯＭ１０３には、上の実施例と同様の機能を発揮するプログラムがあらかじめ記憶されている。つまり、図１２に示すように、ＲＯＭ１０３には、メソッド抽出プログラム１０３ａ、属性抽出プログラム１０３ｂ、バイトコード抽出プログラム１０３ｃがあらかじめ記憶されている。また、ＲＯＭ１０３には、オペコード抽出プログラム１０３ｄ、更新検出プログラム１０３ｅがあらかじめ記憶されている。
【００７２】
そして、ＣＰＵ１０４には、これらのプログラム１０３ａ〜１０３ｅを読み出して実行することで、図１２に示すように、各プロセスとなる。つまり、プログラム１０３ａ〜１０３ｅ各々は、メソッド抽出プロセス１０４ａ、属性抽出プロセス１０４ｂ、バイトコード抽出プロセス１０４ｃ、オペコード抽出プロセス１０４ｄ、更新検出プロセス１０４ｅとなる。なお、メソッド抽出プロセス１０４ａは、図２に示したメソッド抽出部２１に対応し、同様に、属性抽出プロセス１０４ｂは、属性抽出部２２に対応し、バイトコード抽出プロセス１０４ｃは、バイトコード抽出部２３に対応する。また、オペコード抽出プロセス１０４ｄは、図２に示したオペコード抽出部２４に対応し、更新検出プロセス１０４ｅは、更新検出部２５に対応する。
【００７３】
また、ＨＤＤ１０２には、検出対象クラスファイルテーブル１０２ａと、抽出条件テーブル１０２ｂと、更新前オペコード情報テーブル１０２ｃとが設けられる。検出対象クラスファイルテーブル１０２ａは、図２に示した検出対象クラスファイルＤＢ１６に対応し、抽出条件テーブル１０２ｂは、抽出条件ＤＢ１７に対応し、更新前オペコード情報テーブル１０２ｃは、更新前オペコード情報ＤＢ１８に対応する。
【００７４】
ところで、上記したプログラム１０３ａ〜１０３ｅは、必ずしもＲＯＭ１０３に記憶させておく必要はない。例えば、プログラム１０３ａ〜１０３ｅは、コンピュータシステム１００に挿入されるフレキシブルディスク（ＦＤ）、ＣＤ−ＲＯＭ、ＤＶＤディスク、光磁気ディスク、ＩＣカードなどの「可搬用の物理媒体」に記憶させておくようにしてもよい。また、コンピュータシステム１００の内外に備えられるハードディスクドライブ（ＨＤＤ）などの「固定用の物理媒体」に記憶させておいてもよい。さらに、公衆回線、インターネット、ＬＡＮ（Local  Area  Network）、ＷＡＮ（Wide  Area  Network）などを介してコンピュータシステム１００に接続される「他のコンピュータシステム」に記憶させておいてもよい。そして、コンピュータシステム１００がこれらからプログラムを読み出して実行するようにしてもよい。
【００７５】
すなわち、この他の実施例でいうプログラムは、上記した「可搬用の物理媒体」、「固定用の物理媒体」、「通信媒体」などの記録媒体に、コンピュータ読み取り可能に記録されるものである。そして、コンピュータシステム１００は、このような記録媒体からプログラムを読み出して実行することで上記した実施例と同様の機能を実現する。なお、この他の実施例でいうプログラムは、コンピュータシステム１００によって実行されることに限定されるものではない。例えば、他のコンピュータシステムまたはサーバがプログラムを実行する場合や、これらが協働してプログラムを実行するような場合にも、本発明を同様に適用することができる。
【符号の説明】
【００７６】
１  モジュール更新検出装置
１ａ  操作抽出部
１ｂ  命令抽出部
１ｃ  コード抽出部
１ｄ  更新検出部
２  コンパイル後のバイナリデータ
３  更新検出結果
１０  モジュール更新検出装置
１１  通信制御Ｉ／Ｆ部
１２  入力部
１３  表示部
１５  記憶部
１６  検出対象クラスファイルＤＢ
１７  抽出条件ＤＢ
１８  更新前オペコード情報ＤＢ
２０  制御部
２１  メソッド抽出部
２２  属性抽出部
２３  バイトコード抽出部
２４  オペコード抽出部
２５  更新検出部
【図１】
2011141702.tif 000003
【図２】
2011141702.tif 000004
【図３】
2011141702.tif 000005
【図４】
2011141702.tif 000006
【図５】
2011141702.tif 000007
【図６】
2011141702.tif 000008
【図７】
2011141702.tif 000009
【図８】
2011141702.tif 000010
【図９】
2011141702.tif 000011
【図１０】
2011141702.tif 000012
【図１１】
2011141702.tif 000013
【図１２】
2011141702.tif 000014
【図１３】
2011141702.tif 000015