(57)【要約】  オープンソースソフトウェアのライセンスを検証する方法およびシステムを提供する。本発明の実施形態に係るライセンス検証方法は、オープンソースソフトウェアのライセンスを検査することができる。一実施形態として、ライセンス検証方法は、アンドロイド環境におけるｓｍａｌｉコードのような予め設定されたコード形態を活用することで、開発者のソースコードではなく、ビルドされた状態のバイナリーコードを利用してオープンソースソフトウェアのライセンスを検証することができる。他の実施形態として、ライセンス検証方法は、パッケージファイルの構造による形態の比較により、文字列が難読化されたコードに対してもオープンソースソフトウェアのライセンスを検証することができる。【選択図】      図３
2021516379.tif 000002
【特許請求の範囲】
【請求項１】
ライセンス検証装置であって、
ソフトウェアをダウンロードする段階、
前記ダウンロードされたソフトウェアからメソッド呼び出し情報を抽出する段階、
前記抽出されたメソッド呼び出し情報を利用して予め設定されたコード形態のパターンを生成する段階、
前記生成されたパターンを前記ダウンロードされたソフトウェアの識別子と連携させてデータベースに格納する段階
を実行する手段を含むことを特徴とする、ライセンス検証装置。
【請求項２】
前記メソッド呼び出し情報は、特定のメソッドを呼び出すために要求される情報として、Ｊａｖａコードにおけるクラス経路名、クラス名、およびメソッド名を含むことを特徴とする、請求項１に記載のライセンス検証装置。
【請求項３】
前記予め設定されたコード形態は、アンドロイドアプリケーションのためのパッケージファイルであるＡＰＫファイルで使用されるｓｍａｌｉコード形態を含み、
前記パターンは、前記ｓｍａｌｉコード形態でメソッドを抽出するために要求される前記メソッド呼び出し情報を含む形態で生成されることを特徴とする、
請求項１又は２に記載のライセンス検証装置。
【請求項４】
前記実行する手段は、
検査の対象となるパッケージファイルの入力を受ける段階、
前記パッケージファイルの実行ファイルを抽出する段階、
前記抽出した実行ファイルを前記予め設定されたコード形態に変換する段階、
前記予め設定されたコード形態に変換された実行ファイルからメソッド呼び出し情報を抽出する段階、および
前記抽出されたメソッド呼び出し情報と前記データベースに格納されたパターンとを比較する段階
をさらに実行することを特徴とする、請求項１〜３のうちの何れか１項に記載のライセンス検証装置。
【請求項５】
前記比較する段階は、
前記予め設定されたコード形態に変換された実行ファイルから抽出されたメソッド呼び出し情報を含むパターンを前記データベースから検索することを特徴とする、請求項４に記載のライセンス検証装置。
【請求項６】
前記実行する手段は、
前記予め設定されたコード形態に変換された実行ファイルから抽出されたメソッド呼び出し情報を含むパターンが前記データベースに存在する場合、前記パターンと連携されて前記データベースに格納されたオープンソースソフトウェアの識別子、および前記オープンソースソフトウェアで使用するライセンスの識別子を提供する段階
をさらに実行することを特徴とする、請求項４に記載のライセンス検証装置。
【請求項７】
前記予め設定されたコード形態のパターンを生成する段階は、
１つのオープンソースソフトウェアに対して２つ以上のパターンを生成し、
前記比較する段階は、
前記予め設定されたコード形態に変換された実行ファイルから抽出される２つ以上のメソッド呼び出し情報と前記２つ以上のパターンとをそれぞれ比較することを特徴とする、請求項４に記載のライセンス検証装置。
【請求項８】
ライセンス検証装置であって、
オープンソースソフトウェアをダウンロードする段階、
前記ダウンロードされたオープンソースソフトウェアのディレクトリ構造に対応する第１ツリー構造のデータを生成する段階、および
前記第１ツリー構造のデータを前記オープンソースソフトウェアの識別子と連携させてデータベースに格納する段階
を実行する手段を含むことを特徴とする、ライセンス検証装置。
【請求項９】
前記生成する段階は、
前記ディレクトリ構造のディレクトリをブランチノードとして含み、前記ディレクトリ構造のＪａｖａコードファイルをリーフノードとして含むツリー構造のデータを生成することを特徴とする、請求項８に記載のライセンス検証装置。
【請求項１０】
前記ブランチノードは、子ノードの数に対応する次数、および下位すべてのノードの数に対応する次数の和を含み、
前記リーフノードは、対応するＪａｖａコードファイルのメンバー変数の数、メンバー関数の数、および各メンバー関数のシグニチャを含むことを特徴とする、請求項９に記載のライセンス検証装置。
【請求項１１】
前記実行する手段は、
生成されたツリー構造のノードを整列する段階
をさらに実行することを特徴とする、請求項８〜１０のうちの何れか１項に記載のライセンス検証装置。
【請求項１２】
前記整列する段階は、
前記生成されたツリー構造が含む同じ親を有するブランチノードを前記ブランチノードそれぞれが含む次数および次数の和に基づいて整列し、前記生成されたツリー構造が含む同じ親を有するリーフノードを前記リーフノードそれぞれに対応するＪａｖａコードファイルのメンバー関数の数に基づいて整列することを特徴とする、請求項１１に記載のライセンス検証装置。
【請求項１３】
前記格納する段階は、
前記第１ツリー構造のデータを、Ｊａｖａのオブジェクト直列化を利用して直列化させて前記データベースに格納することを特徴とする、請求項８〜１２のうちの何れか１項に記載のライセンス検証装置。
【請求項１４】
前記Ｊａｖａのオブジェクト直列化は、前記第１ツリー構造のノードそれぞれをＪａｖａオブジェクトで定義して前記第１ツリー構造のデータを連続的なＪａｖａオブジェクトのデータに変形することを特徴とする、請求項１３に記載のライセンス検証装置。
【請求項１５】
前記実行する手段は、
検査の対象となるパッケージファイルの入力を受ける段階、
前記入力されたパッケージファイルのディレクトリ構造に対応する第２ツリー構造のデータを生成する段階、および
前記第２ツリー構造のデータと前記データベースに格納された前記第１ツリー構造のデータとを比較する段階
をさらに実行することを特徴とする、請求項８〜１４のうちの何れか１項に記載のライセンス検証装置。
【請求項１６】
前記比較する段階は、
前記第１ツリー構造のデータを前記第２ツリー構造のサブツリー構造のデータとして含むか否かを確認することを特徴とする、請求項１５に記載のライセンス検証装置。
【請求項１７】
前記比較する段階は、
前記第１ツリー構造および前記第２ツリー構造のブランチノードが含む次数および次数の和の比較、および前記第１ツリー構造および前記第２ツリー構造のリーフノードが含むメンバー変数の数、メンバー関数の数、および各メンバー関数のシグニチャ間の比較に基づき、前記第２ツリー構造のデータと前記データベースに格納された前記第１ツリー構造のデータとを比較することを特徴とする、請求項１６に記載のライセンス検証装置。
【発明の詳細な説明】
【技術分野】
【０００１】
以下の説明は、オープンソースソフトウェアのライセンスを検証する方法およびシステムに関し、より詳細には、オープンソースソフトウェアのライセンスを検査することができるライセンス検証方法、前記ライセンス検証方法を実行するコンピュータ装置、コンピュータと結合して前記ライセンス検証方法をコンピュータに実行させるためにコンピュータ読み取り可能な記録媒体に記録されたコンピュータプログラムとその記録媒体に関する。
【背景技術】
【０００２】
オープンソースソフトウェアは、ソフトウェア開発において自由に利用することのできるソフトウェアであるが、商用目的として利用する場合にはライセンス規約を守らなければならない。オープンソースソフトウェアを作った団体の性格に応じて準拠すべきライセンスは異なる可能性がある。代表的な例として、ＢＳＤ（Ｂｅｒｋｅｌｅｙ  Ｓｏｆｔｗａｒｅ  Ｄｉｓｔｒｉｂｕｔｉｏｎ）、ＧＰＬ（Ｇｅｎｅｒａｌ  Ｐｕｂｌｉｃ  Ｌｉｃｅｎｓｅ）、アパッチ（Ａｐａｃｈｅ）などがあるが、使用、複製、改変、改変後の再配布が自由に許容されているライセンスがある反面、修正したソースコードを公開しなければならないライセンスもある。
【０００３】
また、オープンソースソフトウェアの使用の増加にともない、オープンソースのセキュリティの脆弱性を悪用したサイバー攻撃も年々増加傾向にある。オープンソースの不十分なセキュリティ管理により、既に発見されているセキュリティの脆弱性さえもパッチされずに放置された場合には、これによる被害が発生してしまうことが懸念される。弱点を含んだオープンソースがソフトウェアに含まれて配布されることもあるため、使用したオープンソースの管理が必要となっている。
【０００４】
従来技術では、オープンソースライセンス検査システムに開発者のソースコードが入力されると、開発者のコードとオープンソースソフトウェアのコードとを比較してオープンソースソフトウェアを判別している。この場合、開発会社の立場では、オープンソースライセンスの検査のためにシステムにソースコードを送信しなければならず、このようなソースコードの流出は開発会社の観点ではセキュリティ上の危険要素になり得るため、不便と拒否感が発生するという問題を抱えている。
【発明の概要】
【発明が解決しようとする課題】
【０００５】
オープンソースソフトウェアのライセンスを検査することができるライセンス検証方法、ライセンス検証方法を実行するコンピュータ装置、コンピュータと結合してライセンス検証方法をコンピュータに実行させるためにコンピュータ読み取り可能な記録媒体に記録されたコンピュータプログラムとその記録媒体を提供する。
【０００６】
アンドロイド環境におけるｓｍａｌｉコードのような予め設定されたコード形態を活用することで、開発者のソースコードでなく、ビルドされた状態のバイナリーコードを利用してオープンソースソフトウェアのライセンスを検証することができるライセンス検証方法、ライセンス検証方法を実行するコンピュータ装置、コンピュータと結合してライセンス検証方法をコンピュータに実行させるためにコンピュータ読み取り可能な記録媒体に記録されたコンピュータプログラムとその記録媒体を提供する。
【０００７】
パッケージファイルの構造による形態比較により、文字列が難読化されたコードに対してもオープンソースソフトウェアのライセンスを検証することができるライセンス検証方法、ライセンス検証方法を実行するコンピュータ装置、コンピュータと結合してライセンス検証方法をコンピュータに実行させるためにコンピュータ読み取り可能な記録媒体に記録されたコンピュータプログラムとその記録媒体を提供する。
【課題を解決するための手段】
【０００８】
ライセンス検証方法であって、オープンソースソフトウェアをダウンロードする段階、前記ダウンロードされたオープンソースソフトウェアからメソッド呼び出し情報を抽出する段階、前記抽出されたメソッド呼び出し情報を利用して予め設定されたコード形態のパターンを生成する段階、および前記生成されたパターンを前記ダウンロードされたオープンソースソフトウェアの識別子と連携させてデータベースに格納する段階を含むことを特徴とする、ライセンス検証方法を提供する。
【０００９】
一側面によると、前記ライセンス検証方法は、検査の対象となるパッケージファイルの入力を受ける段階、前記パッケージファイルの実行ファイルを抽出する段階、前記抽出した実行ファイルを前記予め設定されたコード形態に変換する段階、前記予め設定されたコード形態に変換された実行ファイルからメソッド呼び出し情報を抽出する段階、および前記抽出されたメソッド呼び出し情報と前記データベースに格納されたパターンとを比較する段階をさらに含むことを特徴としてよい。
【００１０】
ライセンス検証方法であって、オープンソースソフトウェアをダウンロードする段階、前記ダウンロードされたオープンソースソフトウェアのディレクトリ構造に対応する第１ツリー構造のデータを生成する段階、および前記第１ツリー構造のデータを該当のオープンソースソフトウェアの識別子と連携させてデータベースに格納する段階を含むことを特徴とする、ライセンス検証方法を提供する。
【００１１】
一側面によると、前記ライセンス検証方法は、検査の対象となるパッケージファイルの入力を受ける段階、前記入力されたパッケージファイルのディレクトリ構造に対応する第２ツリー構造のデータを生成する段階、および前記第２ツリー構造のデータと前記データベースに格納された前記第１ツリー構造のデータとを比較する段階をさらに含むことを特徴としてよい。
【００１２】
コンピュータと結合して前記ライセンス検証方法をコンピュータに実行させるためにコンピュータ読み取り可能な記録媒体に記録された、コンピュータプログラムを提供する。
【００１３】
前記ライセンス検証方法をコンピュータに実行させるためのプログラムが記録されていることを特徴とする、コンピュータ読み取り可能な記録媒体を提供する。
【００１４】
コンピュータ装置であって、コンピュータ読み取り可能な命令を実行するように実現される少なくとも１つのプロセッサを含み、前記少なくとも１つのプロセッサは、オープンソースソフトウェアをダウンロードし、前記ダウンロードされたオープンソースソフトウェアからメソッド呼び出し情報を抽出し、前記抽出されたメソッド呼び出し情報を利用して予め設定されたコード形態のパターンを生成し、前記生成されたパターンを前記ダウンロードされたオープンソースソフトウェアの識別子と連携させてデータベースに格納することを特徴とする、コンピュータ装置を提供する。
【００１５】
コンピュータ装置であって、コンピュータ読み取り可能な命令を実行するように実現される少なくとも１つのプロセッサを含み、前記少なくとも１つのプロセッサは、オープンソースソフトウェアをダウンロードし、前記ダウンロードされたオープンソースソフトウェアのディレクトリ構造に対応する第１ツリー構造のデータを生成し、前記第１ツリー構造のデータを該当のオープンソースソフトウェアの識別子と連携させてデータベースに格納することを特徴とする、コンピュータ装置を提供する。
【発明の効果】
【００１６】
オープンソースソフトウェアのライセンスを検査することができるライセンス検証方法、ライセンス検証方法を実行するコンピュータ装置、コンピュータと結合してライセンス検証方法をコンピュータに実行させるためにコンピュータ読み取り可能な記録媒体に記録されたコンピュータプログラムとその記録媒体を提供することができる。
【００１７】
アンドロイド環境におけるｓｍａｌｉコードのような予め設定されたコード形態を活用することで、開発者のソースコードでなく、ビルドされた状態のバイナリーコードを利用してオープンソースソフトウェアのライセンスを検証することができる。
【００１８】
パッケージファイルの構造による形態比較により、文字列が難読化されたコードに対してもオープンソースソフトウェアのライセンスを検証することができる。
【図面の簡単な説明】
【００１９】
【図１】本発明の一実施形態における、ネットワーク環境の例を示した図である。
【図２】本発明の一実施形態における、コンピュータ装置の例を示したブロック図である。
【図３】本発明の一実施形態における、オープンソースソフトウェアのパターンを収集する方法の例を示したフローチャートである。
【図４】本発明の一実施形態における、パターンを利用したオープンソースソフトウェアの使用の可否を検査する方法の例を示したフローチャートである。
【図５】本発明の一実施形態における、オープンソースソフトウェアのソースコードからｓｍａｌｉコード形態のパターンを生成する例を示した図である。
【図６】本発明の一実施形態における、ｄｅｘファイルをｓｍａｌｉコードに変換する例を示した図である。
【図７】本発明の一実施形態における、ｄｅｘファイルをｓｍａｌｉコードに変換する例を示した図である。
【図８】本発明の一実施形態における、ＪａｖａコードとＪａｖａコードに対応するｓｍａｌｉコードの例を示した図である。
【図９】本発明の一実施形態における、パッケージファイルの構造をオープンソースソフトウェアのパターンとして収集する方法の例を示したフローチャートである。
【図１０】本発明の一実施形態における、パッケージファイルの構造による形態比較によってオープンソースソフトウェアの使用の可否を検査する方法の例を示したフローチャートである。
【図１１】本発明の一実施形態における、パッケージファイルのディレクトリ構造の例を示した図である。
【図１２】本発明の一実施形態における、ディレクトリ構造に対応するツリー構造の例を示した図である。
【図１３】本発明の一実施形態における、整列されたツリー構造の例を示した図である。
【図１４】本発明の一実施形態における、直列化されて格納されたデータの例を示した図である。
【図１５】本発明の一実施形態における、ツリー構造の比較例を示した図である。
【図１６】本発明の一実施形態における、ツリー構造の比較例を示した図である。
【発明を実施するための形態】
【００２０】
以下、実施形態について、添付の図面を参照しながら詳しく説明する。
【００２１】
本発明の実施形態に係るライセンス検証システムは、以下で説明されるサーバのようなコンピュータ装置によって実現されてよい。このとき、コンピュータ装置においては、本発明の一実施形態に係るコンピュータプログラムがインストールされて実行されてよく、コンピュータ装置は、実行されるコンピュータプログラムの制御にしたがって本発明の実施形態に係るライセンス検証方法を実行してよい。上述したコンピュータプログラムは、コンピュータ装置と結合してライセンス検証方法をコンピュータに実行させるためにコンピュータ読み取り可能な記録媒体に記録されてよい。
【００２２】
図１は、本発明の一実施形態における、ネットワーク環境の例を示した図である。図１のネットワーク環境は、複数の電子機器１１０、１２０、１３０、１４０、複数のサーバ１５０、１６０、およびネットワーク１７０を含む例を示している。このような図１は、発明の説明のための一例に過ぎず、電子機器の数やサーバの数が図１のように限定されることはない。
【００２３】
複数の電子機器１１０、１２０、１３０、１４０は、コンピュータ装置によって実現される固定端末や移動端末であってよい。複数の電子機器１１０、１２０、１３０、１４０の例としては、スマートフォン、携帯電話、ナビゲーション、ＰＣ（ｐｅｒｓｏｎａｌ  ｃｏｍｐｕｔｅｒ）、ノート型ＰＣ、デジタル放送用端末、ＰＤＡ（Ｐｅｒｓｏｎａｌ  Ｄｉｇｉｔａｌ  Ａｓｓｉｓｔａｎｔ）、ＰＭＰ（Ｐｏｒｔａｂｌｅ  Ｍｕｌｔｉｍｅｄｉａ  Ｐｌａｙｅｒ）、タブレットなどがある。一例として、図１では、電子機器１（１１０）の例としてスマートフォンを示しているが、本発明の実施形態において、電子機器１（１１０）は、実質的に無線または有線通信方式を利用し、ネットワーク１７０を介して他の電子機器１２０、１３０、１４０および／またはサーバ１５０、１６０と通信することのできる多様な物理的なコンピュータ装置のうちの１つを意味してよい。
【００２４】
通信方式が限定されることはなく、ネットワーク１７０が含むことのできる通信網（一例として、移動通信網、有線インターネット、無線インターネット、放送網）を利用する通信方式だけではなく、機器間の近距離無線通信が含まれてもよい。例えば、ネットワーク１７０は、ＰＡＮ（ｐｅｒｓｏｎａｌ  ａｒｅａ  ｎｅｔｗｏｒｋ）、ＬＡＮ（ｌｏｃａｌ  ａｒｅａ  ｎｅｔｗｏｒｋ）、ＣＡＮ（ｃａｍｐｕｓ  ａｒｅａ  ｎｅｔｗｏｒｋ）、ＭＡＮ（ｍｅｔｒｏｐｏｌｉｔａｎ  ａｒｅａ  ｎｅｔｗｏｒｋ）、ＷＡＮ（ｗｉｄｅ  ａｒｅａ  ｎｅｔｗｏｒｋ）、ＢＢＮ（ｂｒｏａｄｂａｎｄ  ｎｅｔｗｏｒｋ）、インターネットなどのネットワークのうちの１つ以上の任意のネットワークを含んでよい。さらに、ネットワーク１７０は、バスネットワーク、スターネットワーク、リングネットワーク、メッシュネットワーク、スター−バスネットワーク、ツリーまたは階層的ネットワークなどを含むネットワークトポロジのうちの任意の１つ以上を含んでもよいが、これらに限定されることはない。
【００２５】
サーバ１５０、１６０それぞれは、複数の電子機器１１０、１２０、１３０、１４０とネットワーク１７０を介して通信して命令、コード、ファイル、コンテンツ、サービスなどを提供する１つ以上のコンピュータ装置によって実現されてよい。例えば、サーバ１５０は、ネットワーク１７０を介して接続した複数の電子機器１１０、１２０、１３０、１４０に第１サービスを提供するシステムであってよく、サーバ１６０も、ネットワーク１７０を介して接続した複数の電子機器１１０、１２０、１３０、１４０に第２サービスを提供するシステムであってよい。より具体的な例として、サーバ１５０は、第１サービスとして複数の電子機器１１０、１２０、１３０、１４０にアプリケーションをインストールさせて実行させるためのファイルを複数の電子機器１１０、１２０、１３０、１４０に配布してよい。また、サーバ１６０は、上述したアプリケーションを通じ、該当のアプリケーションが目的とするサービスを第２サービスとして複数の電子機器１１０、１２０、１３０、１４０に提供してよい。
【００２６】
このとき、サーバ１５０には、本発明の実施形態に係るライセンス検証システムが実現されてよい。ライセンス検証システムは、開発者がサーバ１５０に登録するアプリケーションをインストールおよび実行させるためのファイルに対してオープンソースソフトウェアの使用を感知してよく、感知されたオープンソースソフトウェアのライセンス情報を管理者に提供してよい。実施形態によって、ライセンス検証システムは、サーバ１５０と区分される別のコンピュータ装置によって実現され、サーバ１５０とネットワーク１７０を介して連携してもよい。
【００２７】
図２は、本発明の一実施形態における、コンピュータ装置の例を示したブロック図である。上述した複数の電子機器１１０、１２０、１３０、１４０それぞれやサーバ１５０、１６０、さらに発明の実施形態に係るライセンス検証システムは、図２を参照しながら示したコンピュータ装置２００によって実現されてよく、一実施形態に係るライセンス検証方法は、このようなコンピュータ装置２００によって実現されるライセンス検証システムによって実行されてよい。ライセンス検証システムがサーバ１５０に実現される場合、サーバ１５０を実現するコンピュータ装置２００により、本発明の実施形態に係るライセンス検証方法が実行されてよい。例えば、コンピュータ装置２００においては、一実施形態に係るコンピュータプログラムがインストールされて実行されてよく、コンピュータ装置２００は、実行されるコンピュータプログラムの制御にしたがって本発明の実施形態に係るライセンス検証方法を実行してよい。実施形態によって、ライセンス検証システムは、複数のコンピュータ装置の結合によって実現されてもよい。
【００２８】
このようなコンピュータ装置２００は、図２に示すように、メモリ２１０、プロセッサ２１０、通信インタフェース２３０、および入力／出力インタフェース２４０を含んでよい。メモリ２１０は、コンピュータ読み取り可能な記録媒体であって、ＲＡＭ（ｒａｎｄｏｍ  ａｃｃｅｓｓ  ｍｅｍｏｒｙ）、ＲＯＭ（ｒｅａｄ  ｏｎｌｙ  ｍｅｍｏｒｙ）、およびディスクドライブのような永続的大容量記録装置を含んでよい。ここで、ＲＯＭやディスクドライブのような永続的大容量記録装置は、メモリ２１０とは区分される別の永続的記録装置としてコンピュータ装置２００に含まれてもよい。また、メモリ２１０には、オペレーティングシステムと、少なくとも１つのプログラムコードが記録されてよい。このようなソフトウェア構成要素は、メモリ２１０とは別のコンピュータ読み取り可能な記録媒体からメモリ２１０ロードされてよい。このような別のコンピュータ読み取り可能な記録媒体は、フロッピードライブ、ディスク、テープ、ＤＶＤ／ＣＤ−ＲＯＭドライブ、メモリカードなどのコンピュータ読み取り可能な記録媒体を含んでよい。他の実施形態において、ソフトウェア構成要素は、コンピュータ読み取り可能な記録媒体ではない通信インタフェース２３０を通じてメモリ２１０にロードされてもよい。例えば、ソフトウェア構成要素は、ネットワーク１７０を介して受信されるファイルによってインストールされるコンピュータプログラムに基づいてコンピュータ装置２００のメモリ２１０にロードされてよい。
【００２９】
プロセッサ２２０は、基本的な算術、ロジック、および入出力演算を実行することにより、コンピュータプログラムの命令を処理するように構成されてよい。命令は、メモリ２１０または通信インタフェース２３０によって、プロセッサ２２０に提供されてよい。例えば、プロセッサ２２０は、メモリ２１０のような記録装置に記録されたプログラムコードにしたがって受信される命令を実行するように構成されてよい。
【００３０】
通信インタフェース２３０は、ネットワーク１７０を介してコンピュータ装置２００が他の装置（一例として、上述した記録装置）と互いに通信するための機能を提供してよい。一例として、コンピュータ装置２００のプロセッサ２２０がメモリ２１０のような記録装置に記録されたプログラムコードにしたがって生成した要求や命令、データ、ファイルなどが、通信インタフェース２３０の制御にしたがってネットワーク１７０を介して他の装置に伝達されてよい。これとは逆に、他の装置からの信号や命令、データ、ファイルなどが、ネットワーク１７０を経てコンピュータ装置２００の通信インタフェース２３０を通じてコンピュータ装置２００に受信されてよい。通信インタフェース２３０を通じて受信された信号や命令、データなどは、プロセッサ２２０やメモリ２１０に伝達されてよく、ファイルなどは、コンピュータ装置２００がさらに含むことのできる記録媒体（上述した永続的記録装置）に記録されてよい。
【００３１】
入力／出力インタフェース２４０は、入力／出力装置２５０とのインタフェースのための手段であってよい。例えば、入力装置は、マイク、キーボード、またはマウスなどの装置を、出力装置は、ディスプレイやスピーカのような装置を含んでよい。他の例として、入力／出力インタフェース２４０は、タッチスクリーンのように入力と出力のための機能が１つに統合された装置とのインタフェースのための手段であってもよい。入力／出力装置２５０は、コンピュータ装置２００と１つの装置で構成されてもよい。
【００３２】
また、他の実施形態において、コンピュータ装置２００は、図２の構成要素よりも少ないか多くの構成要素を含んでもよい。しかし、大部分の従来技術的構成要素を明確に図に示す必要はない。例えば、コンピュータ装置２００は、上述した入力／出力装置２５０のうちの少なくとも一部を含むように実現されてもよいし、トランシーバやデータベースなどのような他の構成要素をさらに含んでもよい。
【００３３】
図３は、本発明の一実施形態における、オープンソースソフトウェアのパターンを収集する方法の例を示したフローチャートである。本実施形態に係る方法は、一実施形態に係るライセンス検証方法に含まれてよく、上述したコンピュータ装置２００によって実行されてよい。例えば、コンピュータ装置２００のプロセッサ２２０は、メモリ２１０が含むオペレーティングシステムのコードと、少なくとも１つのプログラムのコードとによる制御命令（ｉｎｓｔｒｕｃｔｉｏｎ）を実行するように実現されてよい。ここで、プロセッサ２２０は、コンピュータ装置２００に記録されたコードが提供する制御命令にしたがってコンピュータ装置２００が図３の方法に含まれる段階３１０〜３４０を実行するようにコンピュータ装置２００を制御してよい。
【００３４】
段階３１０で、コンピュータ装置２００は、オープンソースソフトウェアをダウンロードしてよい。例えば、コンピュータ装置２００は、オープンソースソフトウェアのソースコードを共有する複数のサイトのうちの少なくとも１つのサイトから複数のオープンソースソフトウェアをダウンロードしてよく、ダウンロードされた複数のオープンソースソフトウェアそれぞれに対しての次の段階３２０〜３４０を実行してよい。
【００３５】
段階３２０で、コンピュータ装置２００は、ダウンロードされたオープンソースソフトウェアからメソッド呼び出し情報を抽出してよい。一例として、メソッド呼び出し情報は、特定のメソッドを呼び出すために要求される情報として、Ｊａｖａコードでは、クラス経路名、クラス名、メソッド名、メソッド因子の数、各因子のタイプを含んでよい。このとき、コンピュータ装置２００は、少なくともクラス経路名、クラス名、およびメソッド名をメソッド呼び出し情報として抽出してよい。実施形態によって、メソッド因子の数および各因子のタイプのうちの少なくとも１つが、メソッド呼び出し情報としてさらに抽出されてもよい。
【００３６】
段階３３０で、コンピュータ装置２００は、抽出されたメソッド呼び出し情報を利用して予め設定されたコード形態のパターンを生成してよい。例えば、コンピュータ装置２００は、抽出されたメソッド呼び出し情報を利用し、アンドロイドアプリケーションのためのパッケージファイルであるＡＰＫ（Ａｎｄｒｏｉｄ  ａｐｐｌｉｃａｔｉｏｎ  ｐａｃｋａｇｅ）ファイルで使用されるｓｍａｌｉコード形態のパターンを生成してよい。以下でさらに詳しく説明するように、ｓｍａｌｉコード形態のパターンは、クラス経路名、クラス名、およびメソッド名を含んでよい。
【００３７】
段階３４０で、コンピュータ装置２００は、生成されたパターンを該当のオープンソースソフトウェアの識別子と連携させてデータベースに格納してよい。一例として、オープンソースソフトウェアの識別子は、該当のオープンソースソフトウェアの名称であってよい。また、ダウンロードされた複数のオープンソースソフトウェアそれぞれに対して少なくとも１つのパターンが生成されてよく、生成されたパターンは、複数のオープンソースソフトウェアそれぞれの識別子と連携されてデータベースに格納されてよい。
【００３８】
図４は、本発明の一実施形態における、パターンを利用したオープンソースソフトウェアの使用の可否を検査する方法の例を示したフローチャートである。本実施形態に係る方法も、一実施形態に係るライセンス検証方法に含まれてよい。例えば、図３の実施形態に係る方法により、多様なオープンソースソフトウェアそれぞれに対するパターンが生成されてデータベース化された後、図４の実施形態に係る方法により、特定のアプリケーションに対してオープンソースソフトウェアの検査が実行されてよい。本実施形態に係る方法も、上述したコンピュータ装置２００によって実行されてよい。例えば、コンピュータ装置２００のプロセッサ２２０は、メモリ２１０が含むオペレーティングシステムのコードと、少なくとも１つのプログラムのコードとによる制御命令（ｉｎｓｔｒｕｃｔｉｏｎ）を実行するように実現されてよい。ここで、プロセッサ２２０は、コンピュータ装置２００に記録されたコードが提供する制御命令にしたがってコンピュータ装置２００が図４の方法に含まれる段階４１０〜４４０を実行するようにコンピュータ装置２００を制御してよい。
【００３９】
段階４１０で、コンピュータ装置２００は、検査の対象となるパッケージファイルの入力を受けてよい。例えば、アンドロイドアプリケーションが検査の対象となる場合、コンピュータ装置２００は、該当のアンドロイドアプリケーションのインストールおよび実行のためのＡＰＫファイルの入力を受けてよい。
【００４０】
段階４２０で、コンピュータ装置２００は、パッケージファイルの実行ファイルを抽出してよい。上述したアンドロイドアプリケーションの例において、コンピュータ装置２００は、入力されたＡＰＫファイルの圧縮を解除し、「ｃｌａｓｓｅｓ．ｄｅｘ」のようなｄｅｘ（ｄａｌｖｉｋ  ｅｘｅｃｕｔａｂｌｅ）ファイルを実行ファイルとして抽出してよい。圧縮の解除後、ｄｅｘファイルは、圧縮が解除されたディレクトリのルート経路に存在するようになる。
【００４１】
段階４３０で、コンピュータ装置２００は、抽出した実行ファイルを予め設定されたコード形態に変換してよい。例えば、図３で説明したｓｍａｌｉコード形態を利用する場合、コンピュータ装置２００は、ｂａｋｓｍａｌｉライブラリを利用して実行ファイルをｓｍａｌｉコードに変換してよい。段階４２０で、ＡＰＫファイルの圧縮を解除するためのツールであるａｐｋｔｏｏｌでｂａｋｓｍａｌｉライブラリが内蔵されている場合には、ＡＰＫファイルの圧縮とｄｅｘファイルのｓｍａｌｉコードへの変換とが同時になされてもよい。
【００４２】
段階４４０で、コンピュータ装置２００は、予め設定されたコード形態に変換された実行ファイルからメソッド呼び出し情報を抽出してよい。このとき、抽出されるメソッド呼び出し情報は、実行ファイルが既に予め設定されたコード形態に変換されているため、図３の段階３３０で生成されたパターンと同一または類似の形態を有してよく、少なくともクラス経路名、クラス名、およびメソッド名を含んでよい。実施形態によって、メソッド因子の数および各因子のタイプのうちの少なくとも１つが、段階４４０で抽出されたメソッド呼び出し情報にさらに含まれてもよい。
【００４３】
段階４５０で、コンピュータ装置２００は、抽出されたメソッド呼び出し情報とデータベースに格納されたパターンとを比較してよい。このとき、抽出されたメソッド呼び出し情報と一致（あるいは、抽出されたメソッド呼び出し情報を含む）するパターンがデータベースに存在する場合、該当のパターンと対応してデータベースに格納されたオープンソースソフトウェアの識別子により、段階４１０で入力されたパッケージファイルが該当のオープンソースソフトウェアを使用していることが分かる。
【００４４】
この後、コンピュータ装置２００は、検索されたオープンソースソフトウェアの識別子と該当のオープンソースソフトウェアにマッチングされたライセンス情報を提供してよい。この場合、管理者は、検索の対象となるパッケージファイルがどのようなオープンソースソフトウェアを使用しており、どのようなライセンスが適用されているかを把握することができるようになる。
【００４５】
図５は、本発明の一実施形態における、オープンソースソフトウェアのソースコードからｓｍａｌｉコード形態のパターンを生成する例を示した図である。図５は、オープンソースソフトウェアの例として、該当のオープンソースソフトウェアのためのＪａｖａコードファイル「Ｓｑｕａｒｅ．ｊａｖａ」５１０と、「Ｓｑｕａｒｅ．ｊａｖａ」５１０に含まれたＪａｖａコード５２０の例を示している。このようなＪａｖａコード５２０によると、第１点線枠５２１に示された「ｃｏｍ．ｓａｍｐｌｅ．ｍａｔｈ」のパッケージ経路に第２点線枠５２２に示された「Ｓｑｕａｒｅ」クラスが定義されており、「Ｓｑｕａｒｅ」クラスには第３点線枠５２３に示された「ｇｅｔＷｉｄｔｈ（）」メソッドが含まれていることが分かる。
【００４６】
コンピュータ装置２００は、段階３２０で、このようなＪａｖａコード５２０からメソッド呼び出し情報として、パッケージ経路名「ｃｏｍ．ｓａｍｐｌｅ．ｍａｔｈ」、クラス名「Ｓｑｕａｒｅ」、メソッド名「ｇｅｔＷｉｄｔｈ（）」をそれぞれ抽出してよい。
【００４７】
この場合、コンピュータ装置２００は、段階３３０で、抽出された情報を利用し、図５に示すように、対応するｓｍａｌｉコード形態の情報５３０を生成してよい。ｓｍａｌｉコード形態の情報５３０で、「ｉｎｖｏｋｅ−ｖｉｒｔｕａｌ」命令語は、ｓｍａｌｉコード形態でｖｉｒｔｕａｌメソッドを呼び出す命令語であり、このとき、呼び出されるメソッドは、ｓｔａｔｉｃメソッド、ｐｒｉｖａｔｅメソッド、ｆｉｎａｌメソッド、ｃｏｎｓｔｒｕｃｔｏｒメソッドであってはならない。「ｖ０」はクラスのインスタンスを、クラス経路名「ｃｏｍ．ｓａｍｐｌｅ．ｍａｔｈ」の前の「Ｌ」はクラスがオブジェクト型であることを意味してよく、メソッド名「ｇｅｔＷｉｄｔｈ（）」の後ろの「Ｖ」はリターンタイプがｖｏｉｄであることを意味してよい。この他に、上位クラスのｖｉｒｔｕａｌメソッドを呼び出す「ｉｎｖｏｋｅ−ｓｕｐｅｒ」命令語、ｄｉｒｅｃｔメソッドＢを呼び出す「ｉｎｖｏｋｅ−ｄｉｒｅｃｔ」命令語、ｓｔａｔｉｃメソッドを呼び出す「ｉｎｖｏｋｅ−ｓｔａｔｉｃ」命令語、ｉｎｔｅｒｆａｃｅメソッドを呼び出す「ｉｎｖｏｋｅ−ｉｎｔｅｒｆａｃｅ」命令語などが使用されてよい。このとき、「ｉｎｖｏｋｅ−ｓｕｐｅｒ」命令語によって呼び出されるメソッドは、ｓｔａｔｉｃメソッド、ｐｒｉｖａｔｅメソッド、ｆｉｎａｌメソッド、ｃｏｎｓｔｒｕｃｔｏｒメソッドであってはならない。さらに、「ｉｎｖｏｋｅ−ｄｉｒｅｃｔ」命令語によって呼び出されるメソッドはｓｔａｔｉｃメソッドであってはならず、「ｉｎｖｏｋｅ−ｄｉｒｅｃｔ」命令語は、ｐｒｉｖａｔｅメソッド、ｃｏｎｓｔｒｕｃｔｏｒメソッドのようにオーバーライド（ｏｖｅｒｒｉｄｅ）することのできないメソッドを呼び出すときに使用されてよい。
【００４８】
この場合、特定のパッケージファイルの実行ファイルで「ｃｏｍ．ｓａｍｐｌｅ．ｍａｔｈ」クラス経路によって「Ｓｑｕａｒｅ」クラスの「ｇｅｔＷｉｄｔｈ（）」を呼び出す場合、Ｊａｖａコードファイル「Ｓｑｕａｒｅ．ｊａｖａ」５１０を含むオープンソースソフトウェアを使用することが分かるようになる。
【００４９】
一般的に、クラスの経路であるパッケージ名には会社名やソフトウェア名のような固有名称が含まれているため重複の危険が低く、２つの以上のクラスとメソッドに対してパターンを生成して検査する場合、誤検出の確率はゼロに近い。
【００５０】
このとき、コンピュータ装置２００は、一例として、第４点線枠５４０に示した「Ｌｃｏｍ／ｓａｍｐｌｅ／ｍａｔｈ／Ｓｑｕａｒｅ；−＞ｇｅｔＷｉｄｔｈ（）Ｖ」をパターンとしてデータベースに格納してよい。
【００５１】
図６および図７は、本発明の一実施形態における、ｄｅｘファイルをｓｍａｌｉコードに変換する例を示した図である。図６の第１枠６１０は、ｄｅｘファイル「ｃｌａｓｓｅｓ．ｄｅｘ」のコードの一部を示しており、図７の第２枠７１０は、ｄｅｘファイル「ｃｌａｓｓｅｓ．ｄｅｘ」を、ｂａｋｓｍａｌｉライブラリを利用して変換したｓｍａｌｉファイル「ｃｌａｓｓ．ｓｍａｌｉ」のコードの一部を示している。例えば、コンピュータ装置２００は、「＄  ｊａｖａ‐ｊａｒ  ｂａｋｓｍａｌｉ．ｊａｒ−ｏ＜ｏｕｔｐｕｔ  ｄｉｒｅｃｔｏｒｙ＞ｃｌａｓｓｅｓ．ｄｅｘ」のような命令により、ｄｅｘファイル「ｃｌａｓｓｅｓ．ｄｅｘ」をｓｍａｌｉファイル「ｃｌａｓｓ．ｓｍａｌｉ」に変換してよい。
【００５２】
このとき、コンピュータ装置２００は、変換されたｓｍａｌｉファイル「ｃｌａｓｓ．ｓｍａｌｉ」で「ｉｎｖｏｋｅ−ｖｉｒｔｕａｌ」命令語によってメソッドを呼び出すコードを識別してよく、このようなコードからメソッド呼び出し情報を抽出してよい。
【００５３】
図８は、本発明の一実施形態における、ＪａｖａコードとＪａｖａコードに対応するｓｍａｌｉコードの例を示した図である。図８において、第１枠８１０は、アンドロイドの「Ｔｏａｓｔ」を利用して「Ｔｏａｓｔ  Ｈｅｌｌｏ」という簡単なメッセージを画面に出力するＪａｖａコードの例を示しており、第２枠８２０は、第１枠８１０のＪａｖａコードをｓｍａｌｉコードの形態に変換した例を示している。実質的には、Ｊａｖａコードをｄｅｘファイルのコード形態に変換した後、図６のように、ｄｅｘファイルを再びｓｍａｌｉファイルの形態に変換する過程が要求される。
【００５４】
このとき、点線枠８３０に示すようなクラス「Ｔｏａｓｔ」のメソッド「ｓｈｏｗ（）」を呼び出すコードを詳察すると、「ｖ１」はクラス「Ｔｏａｓｔ」のインスタンスを、「ａｎｄｒｏｉｄ／ｗｉｄｇｅｔ／Ｔｏａｓｔ」はクラス経路とクラスを、「ｓｈｏｗ（）」はメソッドを、「Ｖ」はリターンタイプのボイド（ｖｏｉｄ）を、それぞれ示している。このように、コンピュータ装置２００は、ｓｍａｌｉコード形態に変換された実行コードからメソッド呼び出し情報を抽出することができるようになり、好ましくは、図３でデータベースに格納されるパターンとの比較のために、「Ｌａｎｄｒｏｉｄ／ｗｉｄｇｅｔ／Ｔｏａｓｔ；−＞ｓｈｏｗ（）Ｖ」のような形態でメソッド呼び出し情報を抽出してよい。
【００５５】
コンピュータ装置２００は、抽出されたメソッド呼び出し情報とデータベースから読み取ったパターンとを比較して一致又は不一致を判断してよく、一致する場合には、該当のパターンと連携されてデータベースに格納されたオープンソースソフトウェアの識別子により、検査の対象となるパッケージファイルが該当のオープンソースソフトウェアを使用していると判断することができるようになる。パッケージ名（クラス経路名）、クラス名、メソッド名はそれぞれ会社名、機能名を意味するため重複の危険は少ないが、重複の危険がある場合には、２つの以上のパターンを比較することで誤検出の確率を減らすことができる。
【００５６】
また、コンピュータ装置２００は、パッケージファイルが該当のオープンソースソフトウェアを使用していると決定される場合、該当するオープンソースソフトウェアの識別子（一例として、オープンソースソフトウェア名）に該当するオープンソースソフトウェアで使用するライセンスの識別子（一例として、ライセンス名）を提供してよい。
【００５７】
以下、パッケージファイルの構造による形態比較によってライセンスを検証する実施形態について説明する。
【００５８】
図９は、本発明の一実施形態における、パッケージファイルの構造をオープンソースソフトウェアのパターンとして収集する方法の例を示したフローチャートである。本実施形態に係る方法は、一実施形態に係るライセンス検証方法に含まれてよく、上述したコンピュータ装置２００によって実行されてよい。例えば、コンピュータ装置２００のプロセッサ２２０は、メモリ２１０が含むオペレーティングシステムのコードと、少なくとも１つのプログラムのコードとによる制御命令を実行するように実現されてよい。ここで、プロセッサ２２０は、コンピュータ装置２００に格納されたコードが提供する制御命令にしたがってコンピュータ装置２００が図９の方法に含まれる段階９１０〜９４０を実行するようにコンピュータ装置２００を制御してよい。
【００５９】
段階９１０で、コンピュータ装置２００は、オープンソースソフトウェアをダウンロードしてよい。例えば、コンピュータ装置２００は、オープンソースソフトウェアのソースコードを共有する多様なサイトから複数のオープンソースソフトウェアをダウンロードしてよく、ダウンロードされた複数のオープンソースソフトウェアそれぞれに対して次の段階９２０〜９４０を実行してよい。このような段階９１０は、図３を参照しながら説明した段階３１０に対応してよく、ライセンス検証方法が図３の方法と図９の方法との両方を含む場合には、段階３１０および段階９１０は同じ段階となってよい。
【００６０】
段階９２０で、コンピュータ装置２００は、ダウンロードされたオープンソースソフトウェアのディレクトリ構造に対応するツリー構造のデータを生成してよい。Ｊａｖａソースコードは、類似する性格のＪａｖａクラスを集めてディレクトリを生成して分類する。このようなディレクトリ構造の形態は、オープンソースソフトウェアの１つの特徴となってよく、ツリー構造で表現されてよい。例えば、ディレクトリはブランチノード（ｂｒａｎｃｈ  ｎｏｄｅ）となってよく、ディレクトリに格納されたＪａｖａコードファイルはリーフノード（ｌｅａｆ  ｎｏｄｅ）と表現されてよい。このようなディレクトリ構造とツリー構造については、以下でさらに詳しく説明する。
【００６１】
段階９３０で、コンピュータ装置２００は、生成されたツリー構造のノードを整列してよい。ツリー構造におけるノードの整列は、以後に他のツリー構造と一致するか否かを比較するために実行されてよく、実施形態によっては省略されてもよい。具体的な整列方法については、以下で詳しく説明する。
【００６２】
段階９４０で、コンピュータ装置２００は、整列されたツリー構造のデータを該当のオープンソースソフトウェアの識別子と連携させてデータベースに格納してよい。ツリー構造のデータは、ツリー構造がそのままデータベースに格納されてもよいが、ツリー構造のデータベース化の複雑性を考慮するとき、直列化（ｓｅｒｉａｌｉｚｅ）されて格納されてもよい。このようなツリー構造のデータの直列化については、以下でさらに詳しく説明する。
【００６３】
また、ダウンロードされる複数のオープンソースソフトウェアそれぞれに対してこのようなツリー構造のデータが生成されてよく、生成されたツリー構造のデータは、複数のオープンソースソフトウェアそれぞれの識別子と連携されてデータベースに格納されてよい。
【００６４】
図１０は、本発明の一実施形態における、パッケージファイルの構造による形態比較によってオープンソースソフトウェアの使用の可否を検査する方法の例を示したフローチャートである。本実施形態に係る方法も、一実施形態に係るライセンス検証方法に含まれてよい。例えば、図９の実施形態に係る方法により、多様なオープンソースソフトウェアそれぞれに対してツリー構造のデータが生成されてデータベース化された後、図１０の実施形態に係る方法により、特定のアプリケーションに対してオープンソースソフトウェアの検査が実行されてよい。本実施形態に係る方法も、上述したコンピュータ装置２００によって実行されてよい。例えば、コンピュータ装置２００のプロセッサ２２０は、メモリ２１０が含むオペレーティングシステムのコードと、少なくとも１つのプログラムのコードとによる制御命令を実行するように実現されてよい。ここで、プロセッサ２２０は、コンピュータ装置２００に記録されたコードが提供する制御命令にしたがってコンピュータ装置２００が図１０の方法に含まれる段階１０１０〜１０４０を実行するようにコンピュータ装置２００を制御してよい。
【００６５】
段階１０１０で、コンピュータ装置２００は、検査の対象となるパッケージファイルの入力を受けてよい。例えば、アンドロイドアプリケーションが検査の対象となる場合、コンピュータ装置２００は、該当のアンドロイドアプリケーションのインストールおよび実行のためのＡＰＫファイルの入力を受けてよい。
【００６６】
段階１０２０で、コンピュータ装置２００は、入力されたパッケージファイルのディレクトリ構造に対応するツリー構造のデータを生成してよい。このような段階１０２０は、段階９２０でツリー構造のデータを生成する過程と等しくてよい。
【００６７】
段階１０３０で、コンピュータ装置２００は、生成されたツリー構造のノードを整列してよい。このような段階１０３０は、段階９３０でツリー構造のデータを整列する過程と等しくてよい。
【００６８】
段階１０４０で、コンピュータ装置２００は、整列されたツリー構造のデータとデータベースに格納されたツリー構造のデータとを比較してよい。このとき、コンピュータ装置２００は、データベースから抽出されたツリー構造のデータと段階１０３０で整列されたツリー構造のデータとが一致する場合、データベースに格納されたオープンソースソフトウェアの識別子により、段階１０１０で入力されたパッケージファイルが該当のオープンソースソフトウェアを使用していることが分かるようになる。
【００６９】
この後、コンピュータ装置２００は、検索されたオープンソースソフトウェアの識別子と該当のオープンソースソフトウェアにマッチングされたライセンス情報を提供してよい。この場合、管理者は、検索の対象となるパッケージファイルが、どのようなオープンソースソフトウェアを使用しており、どのようなライセンスが適用されているかを把握することができるようになる。
【００７０】
パッケージファイルの文字列に難読化が適用された場合には、クラス経路名、クラス名、メソッド名などが変わることがある。しかし、本実施形態では、ソースコードの内容を比較するのではなく、ディレクトリとディレクトリに格納されたＪａｖａコードファイルのようなパッケージファイルの構造に基づいてオープンソースソフトウェアの使用の可否を検査するため、パッケージファイルに難読化が適用された場合であっても使用されることができる。
【００７１】
図１１は、本発明の一実施形態における、パッケージファイルのディレクトリ構造の例を示した図であり、図１２は、本発明の一実施形態における、ディレクトリ構造に対応するツリー構造の例を示した図である。
【００７２】
先ず、図１１は、パッケージファイルのディレクトリ構造の例として、９つのディレクトリと８つのＪａｖａコードファイルを示している。このとき、図１２は、ディレクトリを円形のブランチノードで表現しており、Ｊａｖａコードファイルを四角形のリーフノードで表現している。このとき、円内の１番目の数字は子ノードの数である次数を、２番目の数字は下位のすべてのノードの次数の和をそれぞれ意味してよい。例えば、図１１の１番目のディレクトリ「ｃｏｍ」は、図１２で、次数１と次数の和１６を有するルートノードで表現されている。図１１の２番目のディレクトリ「ｓａｍｐｌｅ」は、図１２で、次数１と次数の和１５を有するブランチノードで表現されている。さらに、図１１の１番目のＪａｖａコードファイルである「Ｉｎｔｅｒｎｅｔ．ｊａｖａ」は、図１２で、ルートノードの深さを０とするとき、深さ５の四角形の１番目のリーフノードで表現されている。
【００７３】
このように、コンピュータ装置２００は、図１１のパッケージファイルのディレクトリ構造を左側から右側に、さらに上から下に巡回しながら、ツリー構造のデータを生成してよい。上述したように、ブランチノードはディレクトリを意味してよく、下位ノード（子ノード）としてブランチノードまたはリーフノードを有してよい。各ノードは、次数と次数の和の情報を有してよい。また、リーフノードはＪａｖａコードファイルを意味してよく、下位ノードを有することはできない。クラスに関する情報を含んでよく、含まれたクラスに関する情報として、メンバー変数の数、メンバー関数の数、各メンバー関数のシグニチャ、メソッドリターンタイプ、因子の数、および各因子のタイプのうちの対応する情報を含んでよい。例えば、コード「ｐｕｂｌｉｃ  ｓｔａｔｉｃ  ｖｏｉｄ  ｍａｉｎ（Ｓｔｒｉｎｇ［］ａｒｇｓ）」で、リターンタイプは「ｖｏｉｄ」であり、因子の数は２であり、因子タイプは「Ｓｔｒｉｎｇ［］」と「ａｒｇｓ」であることが分かる。
【００７４】
上述したように、ツリー構造の整列は、以後に、他のツリー構造と一致するか否かを比較するために実行されてよい。整列の基準は、ブランチノードがリーフノードよりも高い優先順位を有してよく、同じ親を有するブランチノードは、次数を利用して降順あるいは昇順に整列されてよい。次数を利用して整列されたブランチノードのうち同じ次数を有するブランチノードは、次数の和を利用して降順あるいは昇順に整列されてよい。同じ親を有するリーフノードは、メソッドの数（メンバー関数の数）を基準として降順あるいは昇順に整列されてよい。整列方式は、オープンソースソフトウェアのディレクトリ構造に対して生成されたツリー構造とパッケージファイルのディレクトリ構造に対して生成されたツリー構造に対して同じ方式で適用されることのできる整列方式であれば、上述した実施形態に制限されることはない。
【００７５】
図１３、は本発明の一実施形態における、整列されたツリー構造の例を示した図である。図１２と図１３とを比較すると、第１ブランチノード１２１０の次数が１であり、第２ブランチノード１２２０の次数が２である関係により、第２ブランチノード１２２０が第１ブランチノード１２１０の左側に配置されるように整列された例を示している。このような第１ブランチノード１２１０と第２ブランチノード１２２０の配置変更により、上述した整列方式によってツリー構造のすべてのノードが配置されたことが分かる。
【００７６】
また、コンピュータ装置２００は、Ｊａｖａのオブジェクト直列化を利用してツリー構造のデータを直列化させた後、データベースに格納してよい。より具体的に、コンピュータ装置２００は、ディレクトリを巡回して各ディレクトリをＪａｖａオブジェクトとして生成し、次数に基づいて降順あるいは昇順に整列したオブジェクトを格納してよい。ツリー構造の非線形配列構造を関係型データベースに格納するためには、各ノード別に親と子の関係を確認してからデータベースに格納しなければならないため、実現が複雑となる。これを容易に格納するために、コンピュータ装置２００は、ルートノードを基準としてＪａｖａのオブジェクト直列化によってツリー構造のデータを直列化させた後、データベースに格納してよい。このとき、格納に必要となるオブジェクトは、「ｊａｖａ．ｉｏ．Ｓｅｒｉａｌｉｚａｂｌｅ」を実装（ｉｍｐｌｅｍｅｎｔｓ）しなければならず、メンバー変数として格納に必要な情報を入れなければならない。ブランチノードのオブジェクトの場合には、次数、次数の和、親ノード情報、子ノード情報がメンバー変数として定義されてよく、リーフノードの場合には、メンバー変数の数、メンバー関数の数、各メンバー関数のシグニチャ（メソッドリターンタイプ、因子の数、各因子のタイプ）、親ノードの情報がメンバー変数として定義されてよい。
【００７７】
以下の表１は親と子の関係を定義した情報の例を、表２はブランチノードを定義した情報の例を、表３はリーフノードを定義した情報の例を、それぞれ示している。
【００７８】
【表１】
2021516379.tif 000003
図１４は、本発明の一実施形態における、直列化されて格納されたデータの例を示した図である。Ｊａｖａ直列化過程は、クラスの形態で生成されたメモリのヒープ（Ｈｅａｐ）領域にオブジェクトを書き込む（ｗｒｉｔｅ）ために連続的なデータに変形する過程であってよく、例えば、ツリー構造のデータを連続的なＪａｖａオブジェクトのデータに変形する過程であってよい。直列化されて格納されたデータは、図１４に示すように、人間が確認し難い形態で格納されてよい。
【００７９】
検査の対象となるパッケージファイルにオープンソースソフトウェアが使用されたか否かを決定するために、コンピュータ装置２００は、先ず、パッケージファイルのルートディレクトリから下位ディレクトリを巡回してツリー構造のデータを生成および整列してよい。また、コンピュータ装置２００は、直列化されてデータベースに格納されたデータを逆直列化（ｄｅｓｅｒｉａｌｉｚｅ）してメモリ２１０から読み取ってよい。逆直列化過程は、直列化過程の反対であってよい。逆直列化過程が完了すると、直列化される前の形態でオブジェクトが生成され、メモリのヒープ（Ｈｅａｐ）領域にロードされてよい。コンピュータ装置２００は、このオブジェクトを使用して２つのツリー構造を比較してよい。
【００８０】
図１５および図１６は、本発明の一実施形態における、ツリー構造の比較例を示した図である。図１５の点線枠１５１０は、オープンソースソフトウェアのディレクトリ構造に対応するツリー構造（以下、「オープンソースツリー構造」とする）の例を示している。また、図１６の第１点線枠１６１０は、パッケージファイルのディレクトリ構造に対応するツリー構造（以下、「パッケージファイルツリー構造」とする）の例を示している。このとき、図１６の第２点線枠１６２０は、図１５の点線枠１５１０が示すツリー構造と一致するサブツリー構造を示している。
【００８１】
例えば、コンピュータ装置２００は、パッケージファイルツリー構造のノードを巡回してオープンソースツリー構造のルートノードの情報（次数、次数の和）と一致するノードを探索してよい。一致するノードを探索する場合、探索したノードを含むサブツリーとオープンソースツリー構造を巡回しながら比較してよい。ブランチノードの比較は、ノードの情報（次数、次数の和）が一致するか否かを判断してよく、リーフノードの比較は、メンバー変数の数、メンバー関数の数、各メンバー関数のシグニチャを比較して一致するか否かを判断してよい。ただし、関数のシグニチャの比較において、因子のタイプは、Ｊａｖａのプリミティブ（ｐｒｉｍｉｔｉｖｅ）型だけを比較し、ノンプリミティブ（ｎｏｎ−ｐｒｉｍｉｔｉｖｅ）型の場合は難読化される可能性があるため、比較対象に含まなくてもよい。
【００８２】
上述した２つの実施形態（図３〜８を参照しながら説明したパターンを利用する実施形態、および図９〜１６を参照しながら説明したツリー構造を利用する実施形態）はそれぞれ、個別に利用されてもよいし、結合されて利用されてもよい。例えば、検査の対象となるパッケージファイルに難読化が適用されていない場合にはパターンを利用する実施形態を適用し、パッケージファイルに難読化が適用されている場合にはツリー構造を利用する実施形態を適用してよい。
【００８３】
以上のように、本発明の実施形態によると、アンドロイド環境におけるｓｍａｌｉコードのような予め設定されたコード形態を活用することで、開発者のソースコードではなく、ビルドされた状態のバイナリーコードによってオープンソースソフトウェアのライセンスを検証することができる。また、パッケージファイルの構造による形態比較により、文字列が難読化されたコードに対してもオープンソースソフトウェアのライセンスを検証することができる。
【００８４】
上述したシステムまたは装置は、ハードウェア構成要素、ソフトウェア構成要素、またはハードウェア構成要素とソフトウェア構成要素との組み合わせによって実現されてよい。例えば、実施形態で説明された装置および構成要素は、例えば、プロセッサ、コントローラ、ＡＬＵ（ａｒｉｔｈｍｅｔｉｃ  ｌｏｇｉｃ  ｕｎｉｔ）、デジタル信号プロセッサ、マイクロコンピュータ、ＦＰＧＡ（ｆｉｅｌｄ  ｐｒｏｇｒａｍｍａｂｌｅ  ｇａｔｅ  ａｒｒａｙ）、ＰＬＵ（ｐｒｏｇｒａｍｍａｂｌｅ  ｌｏｇｉｃ  ｕｎｉｔ）、マイクロプロセッサ、または命令を実行して応答することができる様々な装置のように、１つ以上の汎用コンピュータまたは特殊目的コンピュータを利用して実現されてよい。処理装置は、オペレーティングシステム（ＯＳ）およびＯＳ上で実行される１つ以上のソフトウェアアプリケーションを実行してよい。また、処理装置は、ソフトウェアの実行に応答し、データにアクセスし、データを記録、操作、処理、および生成してもよい。理解の便宜のために、１つの処理装置が使用されるとして説明される場合もあるが、当業者は、処理装置が複数個の処理要素および／または複数種類の処理要素を含んでもよいことが理解できるであろう。例えば、処理装置は、複数個のプロセッサまたは１つのプロセッサおよび１つのコントローラを含んでよい。また、並列プロセッサのような、他の処理構成も可能である。
【００８５】
ソフトウェアは、コンピュータプログラム、コード、命令、またはこれらのうちの１つ以上の組み合わせを含んでもよく、所望の動作をするように処理装置を構成したり、独立的または集合的に処理装置に命令したりしてよい。ソフトウェアおよび／またはデータは、処理装置に基づいて解釈されたり、処理装置に命令またはデータを提供したりするために、いかなる種類の機械、コンポーネント、物理装置、仮想装置、コンピュータ記録媒体または装置に具現化されてよい。ソフトウェアは、ネットワークによって接続されたコンピュータシステム上に分散され、分散された状態で記録されても実行されてもよい。ソフトウェアおよびデータは、１つ以上のコンピュータ読み取り可能な記録媒体に記録されてよい。
【００８６】
実施形態に係る方法は、多様なコンピュータ手段によって実行可能なプログラム命令の形態で実現されてコンピュータ読み取り可能な媒体に記録されてよい。コンピュータ読み取り可能な媒体は、プログラム命令、データファイル、データ構造などを単独でまたは組み合わせて含んでよい。媒体に記録されるプログラム命令は、実施形態のために特別に設計されたものであっても、コンピュータソフウェアの当業者に公知の使用可能なものであってもよい。コンピュータ読み取り可能な記録媒体の例としては、ハードディスク、フロッピーディスク、および磁気テープのような磁気媒体、ＣＤ−ＲＯＭおよびＤＶＤのような光媒体、フロプティカルディスク（ｆｌｏｐｔｉｃａｌ  ｄｉｓｋ）のような光磁気媒体、およびＲＯＭ、ＲＡＭ、フラッシュメモリなどのようなプログラム命令を記録して実行するように特別に構成されたハードウェア装置が含まれる。このような記録媒体は、単一または複数のハードウェアが結合された形態の多様な記録手段または格納手段であってよく、あるコンピュータシステムに直接接続される媒体に限定されることなく、ネットワーク上に分散して存在するものであってもよい。プログラム命令の例は、コンパイラによって生成されるもののような機械語コードだけではなく、インタプリタなどを使用してコンピュータによって実行される高級言語コードを含む。
【００８７】
以上のように、実施形態を、限定された実施形態および図面に基づいて説明したが、当業者であれば、上述した記載から多様な修正および変形が可能であろう。例えば、説明された技術が、説明された方法とは異なる順序で実行されたり、および／または、説明されたシステム、構造、装置、回路などの構成要素が、説明された方法とは異なる形態で結合されたりまたは組み合わされたり、他の構成要素または均等物によって交換されたり置換されたとしても、適切な結果を達成することができる。
【００８８】
したがって、異なる実施形態であっても、特許請求の範囲と均等なものであれば、添付される特許請求の範囲に属する。
【図１】
2021516379.tif 000004
【図２】
2021516379.tif 000005
【図３】
2021516379.tif 000006
【図４】
2021516379.tif 000007
【図５】
2021516379.tif 000008
【図６】
2021516379.tif 000009
【図７】
2021516379.tif 000010
【図８】
2021516379.tif 000011
【図９】
2021516379.tif 000012
【図１０】
2021516379.tif 000013
【図１１】
2021516379.tif 000014
【図１２】
2021516379.tif 000015
【図１３】
2021516379.tif 000016
【図１４】
2021516379.tif 000017
【図１５】
2021516379.tif 000018
【図１６】
2021516379.tif 000019
【国際調査報告】
2021516379.tif 000020
2021516379.tif 000021
2021516379.tif 000022
2021516379.tif 000023