(57)【要約】      （修正有）【課題】バージョン番号その他のＤＬＬの名称以外の情報によって、ＤＬＬ（ダイナミックリンクライブラリ）を区別できるシステム環境において、１つのシステムが名称同一で区別され得る複数の異なるＤＬＬを使用するとシステムの状態を異常にする可能性があるため、このようなＤＬＬの組み合わせを検出する。【解決手段】システムがＤＬＬを読み込む時点でＤＬＬの解析を行い、状態をもつデータとそのデータを参照する可能性のあるメソッドを求める。次に、既にシステムに読み込まれているＤＬＬの解析情報を参照し、読み込みつつあるＤＬＬの、状態を持つデータ、そのデータを参照する可能性のあるメソッドの有無を判定する。また、ユーザが指定したＤＬＬについても、参照の対象とする。【選択図】図６
2007257385.tif 000002
【特許請求の範囲】
【請求項１】
バージョン番号その他のダイナミックリンクライブラリ（以下、ＤＬＬと記す）の名称以外の情報によって、当該ＤＬＬを区別できるシステム環境における、ＤＬＬの競合検出方法であって、
システムが、ＤＬＬの読み取りの際に、
(a)当該ＤＬＬに含まれる、ＤＬＬの状態を意味する状態データと、当該状態データを参照する、判定対象メソッドとを解析する解析ステップと、
(b)解析ステップによって得られた解析結果を、当該ＤＬＬに含まれる、当該ＤＬＬを区別する情報と対応させて記録する記録管理ステップと、
(c)解析ステップによって得られた前記状態データ、又は、前記判定対象メソッドが、別の記録管理ステップで既に記録されている解析結果に含まれるか否かを判定する判定ステップと、
を備える、ＤＬＬの競合検出方法。
【請求項２】
請求項１記載のＤＬＬの競合検出方法において、
システムが、メソッドの呼び出しの際に、前記判定ステップを行う、ＤＬＬの競合検出方法。
【請求項３】
バージョン番号その他のＤＬＬの名称以外の情報によって、当該ＤＬＬを区別できるシステム環境における、ＤＬＬの競合検出方法であって、
システムが、ＤＬＬの読み取りの際に、
(a)当該ＤＬＬに対して、予めユーザが指定したＤＬＬ競合情報を取得する、ユーザ指定取得ステップと、
(b)取得したＤＬＬ競合情報を、当該ＤＬＬに含まれる、当該ＤＬＬを区別する情報と対応させて記録する記録管理ステップと、
(c)当該ＤＬＬが、別の記録管理ステップで既に記録されているＤＬＬ競合情報に含まれるか否か、また、当該ＤＬＬのＤＬＬ競合情報で特定されるＤＬＬが既に記録済みか否かを判定する判定ステップと、
を備える、ＤＬＬの競合検出方法。
【請求項４】
請求項３記載のＤＬＬの競合検出方法において、
ユーザ指定取得ステップで、ＤＬＬ競合情報が取得されなかったときは、請求項1記載のＤＬＬの競合検出方法を用いる、ＤＬＬの競合検出方法。
【請求項５】
バージョン番号その他のＤＬＬの名称以外の情報によって、当該ＤＬＬを区別できる計算機システムであって、ＤＬＬの読み取りの際に、
(a)当該ＤＬＬに含まれる、ＤＬＬの状態を意味する状態データと、当該状態データを参照する、判定対象メソッドとを解析するソフトウエア部分と、
(b)上記(a)の解析によって得られた解析結果を、当該ＤＬＬに含まれる、当該ＤＬＬを区別する情報と対応させて記録管理するソフトウエア部分と、
(c) 上記(a)の解析によって得られた前記状態データ、又は、前記判定対象メソッドが、別の上記(b)の記録管理で既に記録されている解析結果に含まれるか否かを判定するソフトウエア部分と、
を備える、計算機システム。
【請求項６】
請求項５記載の計算機システムにおいて、システムが、メソッドの呼び出しの際に、前記判定を行う、計算機システム。
【請求項７】
バージョン番号その他のＤＬＬの名称以外の情報によって、当該ＤＬＬを区別できる計算機システムであって、当該計算機システムが、ＤＬＬの読み取りの際に、
(a)当該ＤＬＬに対して、予めユーザが指定したＤＬＬ競合情報を取得するソフトウエア部分と、
(b)取得したＤＬＬ競合情報を、当該ＤＬＬに含まれる、当該ＤＬＬを区別する情報と対応させて記録するソフトウエア部分と、
(c)当該ＤＬＬが、別の記録管理により既に記録されているＤＬＬ競合情報に含まれるか否か、また、当該ＤＬＬのＤＬＬ競合情報で特定されるＤＬＬが既に記録済みか否かを判定するソフトウエア部分と、
を備える、計算機システム。
【請求項８】
請求項７記載の計算機システムにおいて、
上記(a)のＤＬＬ競合情報を取得するソフトウエア部分により、ＤＬＬ競合情報が取得されなかったときは、請求項５記載の計算機システムを用いる、計算機システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウエアモジュールであるダイナミックリンクライブラリを区別する技術に係り、特に、同時に使用すると計算機システムを不安定にし得る、競合するダイナミックリンクライブラリを検出する技術に関する。
【背景技術】
【０００２】
プログラム間でデータ及びコードを共有するため、ダイナミックリンクライブラリ（ＤＬＬ）が利用されている。
ＤＬＬの関数を利用して作製されたプログラムでは、そのＤＬＬの関数の呼び出しが初めて行われるときに、動的にＤＬＬの検索が行われる。そのため、プログラムのコンパイル時と、プログラムの実行時とで、異なるバージョンのＤＬＬが利用され得る。バージョン間でＤＬＬに互換性がない場合には、実行不正などの問題を引き起こす。
このような状況の検出方法として、プログラムのコンパイル時に、利用するＤＬＬの情報を記録しておき、実行時に、その情報を確認することで、同一のＤＬＬか否かを確認し、不一致の場合はバージョンに不整合が生じたと判断して、エラー情報を表示し、実行を停止する手法が、特許文献1に開示されている。
【０００３】
また非特許文献1には、.NET Framework (登録商標)なるシステム環境が紹介されている。このシステムでは、ＤＬＬは、バージョン番号その他のＤＬＬの名称以外の情報によって区別され、いずれか１つの情報でも異なっている場合には、異なるＤＬＬであると認識される。そのため、このシステムは、バージョン番号の異なる、同一名称の複数のＤＬＬを同時に読み込むことができる(サイドバイサイド実行)。 
この機能により、あるバージョンのＤＬＬの呼び出しを行うプログラムは、新しいバージョンが作成された後も、以前のバージョンのＤＬＬの利用を続けることが出来るようになり、ＤＬＬの更新により、システムの不具合を避けることが可能となる。
【０００４】
【特許文献１】特開2004-005058：プログラムモジュールのバージョン管理装置
【非特許文献１】Don Box, Chris Sells: Essential .NET, Addison-wesley, 2003.
【発明の開示】
【発明が解決しようとする課題】
【０００５】
バージョン番号その他のＤＬＬの名称以外の情報によって、ＤＬＬ（ダイナミックリンクライブラリ）を区別できるシステム環境において、１つのシステムが、名称同一で区別され得る複数の異なるＤＬＬを使用すると、システムの状態を異常にする可能性がある。このような、ＤＬＬの組み合わせは、検出され、システム運用者らへ警告されるべきである。
【０００６】
ダイナミックリンクライブラリ（ＤＬＬ）が状態を持つ場合には、サイドバイサイド実行機能は、不具合を生じさせる可能性がある。
例えば、ショッピングカートを現すＤＬＬに、ユーザＩＤと購入物品を登録するＡＰＩ(Application Programming Interface)であるＡＤＤと、現在ショッピングカートに登録されている物品一覧を取得するＡＰＩであるＧｅｔＡｌｌが提供されているとする。なお、このＤＬＬでは、登録データをメモリ上に保持しているものとする。
この場合において、あるモジュールで古いバージョンのＤＬＬのＡＤＤで情報を登録し、別のモジュールでは、新しいバージョンのＧｅｔＡｌｌで情報を取得することになっているとき、サイドバイサイド実行機能はＤＬＬのバージョンの新旧を区別するため、登録したはずの情報を取得できないことになる。
【０００７】
この種の不具合を人手で検出することは、次の理由により困難である。
(1) 近年のシステムではプログラムの規模が巨大化し、利用されるＤＬＬの数が膨大となる。また、プログラムの一部ごとに、開発者が異なり、システム全体で利用されるＤＬＬの呼び出し関係を、すべて把握することは困難である。
(2) .NET Framework(登録商標)やJava(登録商標)は、動的呼出機能を提供しているため、実行時に呼び出されるＤＬＬが、変化する可能性がある。
(3) .NET Frameworkでは、実行時に、呼び出すＤＬＬを、作成時とは異なるバージョンに切り替えるリダイレクト機能を有しており、かかる機能が課題を複雑化する。
【課題を解決するための手段】
【０００８】
システムがＤＬＬを読み込む時点でＤＬＬの解析を行い、状態をもつデータとそのデータを参照する可能性のあるメソッドを求める。次に、既にシステムに読み込まれているＤＬＬの解析情報を参照し、読み込みつつあるＤＬＬの、状態を持つデータ、そのデータを参照する可能性のあるメソッドの有無を判定する。また、ユーザが指定したＤＬＬ競合情報（同時に使用されるとシステムを異常にするＤＬＬの情報）に含まれるＤＬＬについても、参照の対象とする。より具体的には、
Ａ．バージョン番号その他のＤＬＬの名称以外の情報によって、当該ＤＬＬを区別できるシステム環境において、ＤＬＬの読み取りの際に、
(a)当該ＤＬＬに含まれる、ＤＬＬの状態を意味する状態データと、当該状態データを参照する、判定対象メソッドとを解析する解析機能と、
(b)解析機能によって得られた解析結果を、当該ＤＬＬに含まれる、当該ＤＬＬを区別する情報と対応させて記録する記録管理機能と、
(c)解析機能によって得られた前記状態データ、又は、前記判定対象メソッドが、別の記録管理機能で既に記録されている解析結果に含まれるか否かを判定する判定機能と、をシステムに設ける。
Ｂ．バージョン番号その他のＤＬＬの名称以外の情報によって、当該ＤＬＬを区別できるシステム環境において、
システムが、ＤＬＬの読み取りの際に、
(a)当該ＤＬＬに対して、予めユーザが指定したＤＬＬ競合情報を取得する、ユーザ指定取得機能と、
(b)取得したＤＬＬ競合情報を、当該ＤＬＬに含まれる、当該ＤＬＬを区別する情報と対応させて記録する記録管理機能と、
(c)当該ＤＬＬが、別の記録管理ステップで既に記録されているＤＬＬ競合情報に含まれるか否か、また、当該ＤＬＬのＤＬＬ競合情報で特定されるＤＬＬが既に記録済みか否かを判定する判定機能と、をシステムに設ける。
【発明の効果】
【０００９】
１つのシステムで同時に利用すると、システムに異常をきたす可能性のある、ＤＬＬが読み込まれたことを検知することが可能となる。
【発明を実施するための最良の形態】
【００１０】
以下に、本発明の実施の形態を説明する。
【実施例１】
【００１１】
以下、本発明の１実施例を、図面を用いて説明する。なお、以下の説明により、本発明の適用が本実施例に限定されるものではない。
図２は、本発明を適用可能な、一般的な計算機システムのハードウェア構成例を示す図である。同計算機システムは、ＣＰＵ２０１と、メモリ２０２と、磁気ディスク、フラッシュメモリその他の外部記憶装置２０３と、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ、ＩＣカードその他の記憶媒体からデータを読み取る読取装置２０４と、キーボード、マウスその他の入力装置２０６と、モニタ、プリンタその他の出力装置２０７と、計算機システムの外部装置に接続するための通信装置２０８と、これらの各装置を接続するバス２０９と、を備える。
ＣＰＵ２０１がメモリ２０２上にロードされた、本実施形態のソフトウエアを実行することで、本実施例を実現できる。所定のプログラムは、読取装置２０４を介して記憶媒体から、又は、通信装置２０８を介して外部装置から、外部記憶装置２０３にダウンロードされ、それから、メモリ２０２上にロードされてＣＰＵ２０１により実行されるようにしてもよい。あるいは外部記憶装置２０３を経由せずに、メモリ２０２上に直接ロードされ、ＣＰＵ２０１により実行されるようにしてもよい。
【００１２】
図３は、本実施例における仮想マシン３０１の構成図である。仮想マシン３０１は、同一名称であって、名称以外の情報が異なるＤＬＬを別の名前空間として読み込む機能をもつ。以下の説明では、名称以外に、バージョン情報によっても、ＤＬＬが区別されるものとして説明する。
仮想マシン３０１は、オペレーティングシステム３０６上で動作し、メモリ管理３０２、実行管理３０３、ローダ３０５などで構成される。ローダ３０５は、実行されるＤＬＬ３０４をシステムに読み取る機能を有する。
【００１３】
図１に、本実施例のソフトウェアシステムの全体構成例を示す。
本ソフトウェアシステムは、仮想マシン３０１がＤＬＬをロードする時点で呼ばれる。ローダ３０５がライブラリのロード時に実行する追加プログラム(フック関数)を指定できる場合は、本ソフトウェアシステムをフック関数とできる。ローダ３０５がフック関数を呼び出す機能がない場合は、ローダ３０５の１つの機能としても良い。
【００１４】
本ソフトウェアシステムは、ライブラリ解析部１０２と、解析結果比較部１０３、解析結果管理テーブル１０４で構成される。ライブラリ解析部１０２は、ロード中のＤＬＬ１０５を解析して解析結果テーブル１０６を作成する。解析結果比較部１０３は、解析結果テーブル１０６を受け取り、解析結果管理テーブル１０４の情報と比較する。その結果、ロード中のＤＬＬと同時に使用するとシステムが異常になる可能性のあるＤＬＬが、既にシステムに読み込まれていると判断される場合には、警告メッセージを出力する。また、解析結果比較部１０３は、最後に、解析結果テーブル１０６を解析結果管理テーブル１０４に登録する。
【００１５】
図４に、解析結果管理テーブル１０４と、解析結果テーブル１０６の例を示す。
解析結果管理テーブル１０４は、ＤＬＬの名称４０２、バージョン番号４０３、解析結果テーブルへのポインタ４０４で構成される。解析結果テーブル１０６は、データ名４０７、参照グループ４０８で構成される。参照グループ４０８には、データ名４０７に記録されたデータを参照する可能性のあるメソッドの名前のリストが記録される。
【００１６】
図５に、ライブラリ解析部１０２（図１）の処理フローを示す。
ライブラリ解析部１０２では、ロード対象のＤＬＬを解析することで、状態を持つデータ（状態データ）の一覧を取得し、各データに対して、そのデータを参照する可能性のあるメソッド（判定対象メソッド）を求める。ライブラリ解析部１０２には、入力としてロード対象のＤＬＬが与えられる。ステップ５０１では、ロード対象のＤＬＬに含まれる静的フィールドの一覧を取得する。一覧はリフレクション機能を用いることで取得可能である。
【００１７】
次に、取得した一覧の各静的フィールドに対して、ステップ５０３からステップ５０８の処理を適用する。
ステップ５０３では、解析結果テーブルに新たなエントリ(行)を追加し、データ名４０７（図４）を、解析結果テーブル１０６へ登録する（記録管理ステップ、記録管理機能）。ステップ５０４では、各公開メソッドについて、現在処理対象の静的フィールドへの参照があるかを解析し、見つかった公開メソッド名を参照グループ４０８へ追加する（ステップ５０５）。静的フィールドへの参照の解析は、リフレクション機能により、メソッドのバイトコード列を取得し、ロード命令、ストア命令のオペランドに静的フィールドが指定されるか否かで判定できる。また、従来技術である手続き間解析を適用することにより、公開メソッドが呼び出す先のメソッドで当該フィールドを参照するか否かを解析する。
【００１８】
次に、ステップ５０６では、戻り値が参照型の各公開メソッドについて、静的データに対する露出使用があるか否かを解析し、露出使用のあるメソッド一覧と、露出使用となる参照型一覧を求める。露出使用の解析は、戻り値のデータに基づいて、従来技術であるデータフロー解析を適用することにより求めることができる。
【００１９】
ステップ５０７では、露出使用のある公開メソッド名を、参照グループに追加する。続いて、ステップ５０８では、引数および引数から到達可能な型に、ステップ５０６で求めた露出使用一覧に含まれる型を持つ各メソッドについて、露出使用一覧に含まれる型への参照があるか解析する。解析は、引数データに基づいてデータフロー解析を行うことで求めることができる。ステップ５０９では、ステップ５０８の解析の結果として見つかった公開メソッド名を、参照グループに追加する。
【００２０】
図６に、解析結果比較部１０３（図１）の処理フローの一例を示す。
解析結果比較部１０３は、既に読み込まれているＤＬＬの解析結果が、現在読み込み中のＤＬＬに含まれる状態を持つデータ（状態データ）、その参照メソッドと同一名称の状態をもつデータ、又は、参照メソッドを含むか否かを判定する（判定ステップ、判定機能）。
まず、ステップ６０１において、ロード対象のＤＬＬの名称を変数Ｎに、また、ロード対象のＤＬＬの解析結果テーブルを変数Ｔに格納する。次に、ステップ６０２、ステップ６０３により、解析結果管理テーブル１０４（図１、図４）の各エントリを順次、変数Ｅに取り出して、ステップ６０４からステップ６０９の処理を適用する。
【００２１】
ステップ６０４では、変数Ｅが格納しているエントリのＤＬＬ名称と、変数Ｎの値が一致するかを調べ、一致する場合にのみ、ステップ６０５へ進む。ステップ６０５では、変数Ｅに格納されている解析結果テーブル１０６（図１、図４）の参照グループに含まれるメソッド名一覧を変数Ｉ１に、変数Ｔに格納されている解析結果テーブルの参照グループに含まれるメソッド名の一覧を変数Ｉ２に、それぞれ求めて格納する。
【００２２】
ステップ６０６では、変数Ｉ１と変数Ｉ２に共通の要素があるか調べ、もし存在するなら、ステップ６０９において警告メッセージを出力する。もし共通要素が存在しない場合、ステップ６０７、ステップ６０８において共通するデータ名があるかを調べる。もし共通データ名がある場合は、ステップ６０９で警告メッセージを出力する。共通するデータ名がない場合は、ステップ６０２へ進み、次のエントリの処理を行う。すべてのエントリの処理が終了すると、ステップ６１０へ進み、変数Ｔに格納された解析結果テーブル１０６を解析結果管理テーブル１０４に追加する。
本処理フローでは、警告メッセージが出力される場合でも処理を継続し、すべての組み合わせを警告できるようになっているが、最初にステップ６０９に到達した時点で処理を打ち切り、システムを停止させても良い。
【００２３】
次に、上述のライブラリ解析部１０２（図１）と、解析結果比較部１０３の処理例を、図７(Ａ)と、図９(Ａ)で示すダイナミックリンクライブラリ（ＤＬＬ）を例示して説明する。
プログラム７０１には、ステップ７０３で示される1つのＣ１型の静的フィールドC::sf001が定義されている。Ｃ１型のオブジェクト７１０は、Ｃ２型のオブジェクト７１１への参照を保持するf002フィールドを持つ。また、プログラム７０１は、API_A(７０４)、API_B(７０６)、API_C(７０８)の３つの公開メソッドを持つ。図７(Ａ)のＤＬＬの名称は、DLL_A、バージョン番号は1.0とする。図９(Ａ)は、図７(Ａ)のＤＬＬに基づき作成した、同名のバージョン番号2.0のＤＬＬの例である。プログラム９０１は、プログラム７０１に対して、静的フィールド名をsf002に変更し、API_Aを削除し、API_Dを追加している。このような２つのバージョンのライブラリがある場合に、システムに、まず、図７(Ａ)のＤＬＬが読み込まれ、次に、図９(Ａ)のＤＬＬが読み込まれた場合の処理例を以下に説明する。
【００２４】
まず、プログラム７０１に対して、図５の処理が適用され、ステップ５０１によって、静的フィールド、sf001が取得される。次に、ステップ５０３により、解析結果テーブル７１２（図７(Ｂ)）のデータ名７１４にC::sf001が記録される。ステップ７０５は静的フィールドの参照命令のため、ステップ５０４の解析により、C::API_Aが参照グループ７１５に追加される。コード７０９により、API_Cは、Ｃ２型の引数を返す。そのため、ステップ５０６の解析結果として、メソッドC::API_CとＣ２型が得られ、ステップ５０７により、C::API_Cが参照グループ７１５に追加される。API_Bは、ステップ５０６で得られたＣ２型を引数としてもち、コード７０７で、その型の引数への参照を持つ。そのため、ステップ５０８の結果、C::API_Bが得られ、ステップ５０９において、参照グループ７１５に追加される。以上により、図７(Ａ)のプログラムの解析結果として、図７(Ｂ)に示す解析結果管理テーブル７１２が作成される。
【００２５】
次に、解析結果比較部１０３（図１）の処理（図６）が適用されるが、この段階では、解析結果管理テーブル８０１（図８）の内容は空のため、ステップ６１０（図６）により、解析結果管理テーブル８０１が構成される。次に図９(Ａ)のＤＬＬが読み込まれると、図５のライブラリ解析処理により、図９(Ｂ)に示す結果が得られる。
続いて、解析結果比較部１０３の処理が適用される。ステップ６０１で、変数Ｎに"DLL_A"が、変数Ｔに図９(Ｂ)に示す解析結果テーブル９１５が設定される。解析結果管理テーブル８０１には、1つエントリが格納されているため、ステップ６０３へ進み、変数Ｅにエントリ８０５（図８）が設定される。エントリ８０５のＤＬＬ名称８０２と変数Ｎが一致するため、ステップ６０５の処理へ進む。
【００２６】
ステップ６０５の処理で、変数Ｉ１には"C::API_A,C::API_B,C::API_C"が設定され、変数Ｉ２には"C::API_B,C::API_C,C::API_D"が設定される。変数Ｉ１と変数Ｉ２には、"C::API_B,C::API_C"が共通に含まれるため、処理６０９へ進み、警告メッセージが出力される。続いて、ステップ６０２へ進み、処理するエントリが無いため、ステップ６１０へ進む。ステップ６１０で変数Ｔを解析結果管理テーブル８０１に追加する。
以上により、同時に使用すると矛盾する状態を引き起こす可能性のあるＤＬＬが使用されたことを警告することが可能となる。なお、ここでは、状態を保持するデータとして、静的フィールドを用いて説明したが、ファイル、データベースその他の外部リソースも状態保持するデータとなり得る。これら外部リソースに関しては、外部リソースごとに、解析結果参照テーブルのエントリを作成することで対応すれば良い。外部リソースをアクセスするAPIは予め決まっているため、外部リソースとそのリソースをアクセスするAPIの対応表を持つことで、各外部リソースに対して参照する可能性のあるメソッドを解析により見つけることができる。
【００２７】
.NET Framework（登録商標）のシステムでは、ネィティブのＤＬＬを呼び出すことも可能である。
通常、ネィティブの呼び出し先が、どのリソースを参照しているかを解析することは困難である。そのため、あるメソッドに、ネィティブ呼び出しがある場合は、そのメソッドは全てのリソースを参照するものとして取り扱う。この場合、呼び出しているネィティブメソッドに対して、どのリソースにアクセスしているかを示すテーブルを予め用意することができる場合は、その情報に基づいて、参照する外部リソースの範囲を狭め、判定精度を向上させることが可能となる。
【実施例２】
【００２８】
実施例1では、ライブラリ解析の結果のみに基づいて警告を発している。
同時に使用されるとシステムを異常にするＤＬＬが、ユーザにより予めわかっている場合（ＤＬＬ競合情報）には、その情報を受け取ることで、より正確に判定することが可能となる。こうしたユーザの指示に基づいて、警告を発するか否かを判定する方法を以下に述べる。
ユーザの指示は、ＤＬＬと関連付けられたファイルに記載される（ユーザ指定取得ステップ、ユーザ指定取得機能）。ＤＬＬのヘッダ、ＤＬＬ中の所定のデータ、システムで指定された１つのファイルその他の格納領域に記載することが考えられる。
【００２９】
図１０は、ユーザの指示を受け取るために拡張した解析結果管理テーブル１００１の例である。図４に無い「同時使用不可ＤＬＬ欄」１００４が追加されている。ユーザ指示の入力、その入力による判定は、ソフトウェアシステムのライブラリ解析部１０２（図１）の直前に、追加処理部を設けることで対応可能である。
【００３０】
図１１に追加処理部の処理フローを示す。
まず、ステップ１１０１で解析結果管理テーブル１０４（図１）を検索し、使用不可ＤＬＬ欄に、現在、読み込み対象のライブラリ名が含まれていないかを確認する。含まれている場合は、ステップ１１０２へ進み、警告メッセージを出力する。
【００３１】
次に、ステップ１１０３で、読み込み対象のＤＬＬに対する同時使用不可ライブラリリストを取得し、そのリストに、解析結果管理テーブル１０４に登録されているＤＬＬが無いかを確認する。含まれている場合は、ステップ１１０４へ進み、警告メッセージを出力する。
最後に、ステップ１１０５では、取得した同時使用不可ＤＬＬ情報を解析結果管理テーブル１０４に記録する。もし、ステップ１１０２、又は、ステップ
１１０４で警告メッセージが出力された場合には、解析結果比較部１０３の処理では、ステップ６１０（図６）のみを適用する。
【００３２】
図１１で示した処理フローの動作例を次に示す。
まず、次の２つのＤＬＬの存在を前提とする。
(1)名称"DLL_A"、バージョン"1.0"、
(2)名称"DLL_A"、バージョン"2.0"、 同時使用不可DLL  "DLL_A,1.0"
(1)で示したＤＬＬには、同時使用不可ＤＬＬの情報は無いが、その後に作成された新バージョン２.０の(2)では、同時使用不可ＤＬＬ情報が付加されている。この２つのＤＬＬが、(１)、(２)の順にシステムに読み込まれるとする。
【００３３】
まず、(１)の読み込み時の処理においては、解析結果管理テーブルが空のため、ステップ１１０１（図１１）の処理ではエントリが見つからず、ステップ
１１０３へ進む。ステップ１１０３でも同様に解析結果管理テーブルが空のため、ステップ１１０５へ進む。解析結果管理テーブルにエントリが追加され、図１５(Ａ)に示す解析結果管理テーブルが作成される。
【００３４】
次に、(２)のＤＬＬの読み込み時の処理においては、解析結果管理テーブルの同時使用不可ＤＬＬ欄は空のため、ステップ１１０３へ進む。解析結果管理テーブルのエントリ１５０６（図１５(Ａ)）が、(２)のＤＬＬの同時使用不可情報に含まれるため、ステップ１１０４へ進み、警告メッセージを出力する。最後に、処理１１０５により、解析結果管理テーブルにエントリを追加する。これにより、図１５(Ｂ)の解析結果管理テーブルが作成される。
以上により、ユーザ指示取得機能に従って、同時使用不可ライブラリの使用を検出することができる。
【実施例３】
【００３５】
実施例1では、ダイナミックリンクライブラリ（ＤＬＬ）のロード時に、ライブラリの解析と、警告を発するか否かの判定処理を行う例を示した。かかる判定処理は、メソッドの呼び出し時に行っても良い。この場合には、本ソフトウェアシステム適用時のオーバーヘッドが大きくなる可能性がある。
しかしシステムの状態に矛盾を生じさせるようなデータが存在する場合であっても、現実の実行時にその利用がない場合を除外できるため、より正確な検出が期待できる。メソッド呼び出し時に、警告を発するか否かの判定処理を行う方法を以下に説明する。
【００３６】
図１２は、メソッド呼び出しの際の判定に対応するために拡張した、解析結果管理テーブル１２０１の例である。図４には無い、呼出しフラグ１２０８を解析結果テーブルに追加した構成となっている。同フラグ１２０８は、メソッドの呼出しがあったか否かを示す。
まず、ＤＬＬのロード時では、ライブラリ解析部１０１（図１）の処理のみを適用し、結果として得られる解析結果テーブルは、解析結果管理テーブル１０４に登録する。このとき、呼出しフラグ１２０８は、Falseに設定する。
次に、メソッド呼出し時に図１３、図１４のフローチャートで示す判定処理を適用する。まず、メソッド名を変数Ｍに登録するし、リフレクション機能を用いて、メソッドの属するＤＬＬの名前、バージョン番号を取得し、それぞれ、変数Ｎ、Ｖに設定する(ステップ１３０１)。次に、変数Ｎ、Ｖを用いて、解析結果管理テーブルを検索し、解析結果テーブルを変数Ｔに取得する(ステップ１３０２)。ステップ１３０３では、解析結果テーブルＴに対して、参照グループに変数Ｍで示されるメソッド名が含まれる各エントリの参照フラグをTrueにする。ステップ１３０３の結果、参照フラグがFalseからTrueに変化したエントリがある場合、ステップ１３０５の検索結果比較処理を適用する。
【００３７】
検索結果比較処理のフローを図１４に示す。
まず、ステップ１４０１で、変数Ｔで示される解析結果テーブルにおいて、呼出フラグがTrueとなっているエントリのデータ名の一覧を変数Ｉ１に設定する。また、呼出しフラグがTrueとなっているエントリの参照グループに含まれるメソッド名の一覧を変数Ｉ２に設定する。次に、解析結果テーブルに未処理のエントリがある場合、そのエントリを変数Ｅに取り出す(ステップ１４０２、ステップ１４０３)。次に、ステップ１４０４とステップ１４０５により、変数Ｅに格納されるエントリのＤＬＬ名称が変数Ｎと同じで、かつ、バージョン番号が変数Ｖと異なるかを調べる。もし結果が真なら、ステップ１４０６へ進む。偽の場合はステップ１４０２へ戻り次のエントリの処理を行う。
【００３８】
ステップ１４０６とステップ１４０７では、変数Ｅが格納する解析結果テーブルのエントリのうち、呼出フラグがTrueとなっているエントリの参照グループに含まれるメソッド名の一覧を変数Ｉ３に作成し、変数Ｉ１と変数Ｉ３に共通の要素が含まれるか否か判定する。もし、共通の要素がある場合、ステップ１４１０で警告メッセージを出力する。もし、共通要素がない場合は、ステップ１４０８に進む。
ステップ１４０８とステップ１４０９では、変数Ｅの解析結果テーブルのエントリのうち、呼出フラグがTrueとなっているエントリのデータ名の一覧を変数Ｉ４に取得し、共通要素があるか否か判定する。もし、共通要素が含まれる場合は、ステップ１４１０へ進み、警告メッセージを出力する。もし、共通要素がない場合は、次の解析結果管理テーブルのエントリの処理へ進む。
以上の処理により、同時に使用すると矛盾する状態を引き起こす可能性のあるメソッドが使用されたことを警告することが可能となる。
【産業上の利用可能性】
【００３９】
ＤＬＬの競合検出技術は、ＤＬＬを多数利用するソフトウェアの開発、デバッグ、障害解析に有用である。
【図面の簡単な説明】
【００４０】
【図１】本実施例のソフトウェアシステムの全体構成例を示す図である。
【図２】本発明を適用可能な、一般的な計算機システムのハードウェア構成例を示す図である。
【図３】本実施例における仮想マシン３０１の構成図である。
【図４】解析結果管理テーブル１０４と、解析結果テーブル１０６の例を示す図である。
【図５】ライブラリ解析部１０２（図１）の処理フローを示す図である。
【図６】解析結果比較部１０３の処理フローの一例を示す図である。
【図７】ダイナミックリンクライブラリ（ＤＬＬ）を例示する図である。
【図８】図７の処理結果として作成される、解析結果管理テーブル８０１と、解析結果テーブル７１２の例を示す図である。
【図９】図７のＤＬＬの修正版を例示する図である。
【図１０】ユーザの指示を受け取るために拡張した、解析結果管理テーブル１００１を例示する図ある。
【図１１】ユーザの指示を受け取る処理フローの動作例を示す図である。
【図１２】メソッド呼び出しの際の判定に対応するために拡張した、解析結果管理テーブル１２０１を例示する図である。
【図１３】メソッド呼び出しの際に適用される、判定処理のフローチャートである。
【図１４】メソッド呼び出しの際に適用される、検索結果比較処理のフローチャートである。
【図１５】ユーザによる指示情報を用いて、解析結果管理テーブルのエントリーが追加される様子を説明するための図である。
【符号の説明】
【００４１】
１０４……解析結果管理テーブル、
１０６……解析結果テーブル、
４０４……解析結果テーブルへのポインタ、
８０１……解析結果管理テーブル、
７１２……解析結果テーブル、
８０４……解析結果テーブルへのポインタ、
１００１……解析結果管理テーブル、
１００５……解析結果テーブルへのポインタ、
１２０１……解析結果管理テーブル、
１２０４……解析結果テーブルへのポインタ。
【図１】
2007257385.tif 000003
【図２】
2007257385.tif 000004
【図３】
2007257385.tif 000005
【図４】
2007257385.tif 000006
【図５】
2007257385.tif 000007
【図６】
2007257385.tif 000008
【図７】
2007257385.tif 000009
【図８】
2007257385.tif 000010
【図９】
2007257385.tif 000011
【図１０】
2007257385.tif 000012
【図１１】
2007257385.tif 000013
【図１２】
2007257385.tif 000014
【図１３】
2007257385.tif 000015
【図１４】
2007257385.tif 000016
【図１５】
2007257385.tif 000017