(57)【要約】      （修正有）【課題】演算環境においてソフトウェアアプリケーションの解析を実行するためのシステムおよび方法を提供する。【解決手段】受信モジュール２１０は、ソフトウェアアプリケーションのソースコードを入力データとして受け入れ、さらに、エントリーポイントのリストを取得する。入力データからの中間表現は、ソフトウェアアプリケーション用の参照構造を構築するために、生成される。ソフトウェアアプリケーション内の呼び出されない関数は、特定され、エントリーポイントと見なされる。エントリーポイントは、１つのエントリーポイント内にラップされ、エントリーポイントの全ての呼び出しコンテキストを保持して解析される。【選択図】図２
2014194756.tif 000002
【特許請求の範囲】
【請求項１】
演算環境においてソフトウェアアプリケーションの解析を実行するための方法であって、
前記ソフトウェアアプリケーションのコンパイル可能なソースコードを入力データとして受け入れる工程と、
エントリーポイントの包括リストを取得するため、前記入力データを処理する工程と、を含み、
前記処理する工程は、
前記ソフトウェアアプリケーション用の１つ以上の参照構造を構築するため、前記入力データから１つ以上の中間表現を生成する工程と、
構築された前記参照構造から、前記ソフトウェアアプリケーションに関連する前記エントリーポイントのグループに相当する関連関数を特定する工程と、
パラメーターリストを参照し、非決定論的シーケンスを保証し、１つのレベルのコール深度における前記特定されたエントリーポイントの全てを順に呼び出すラッパー関数を生成する工程と、を含み、
前記ラッパー関数は、シングルエントリーポイントとして扱われ、
前記ラッパー関数の解析は、前記シングルエントリーポイントの解析を可能とし、さらに、前記アプリケーションの完全な解析に繋がる前記特定されたエントリーポイントの解析を可能とし、
前記ラッパー関数の解析は、前記エントリーポイントそれぞれの独立した解析を実行することなく、前記エントリーポイントの前記グループの前記解析をもたらし、
前記１つ以上の中間表現を生成する工程、前記特定する工程、前記ラッパー関数を生成する工程、および前記解析は、プロセッサーによって実行されることを特徴とする方法。
【請求項２】
前記参照構造は、前記ソフトウェアアプリケーションに対するコール階層をさらに含む請求項１に記載の方法。
【請求項３】
前記特定されたエントリーポイントは、前記パラメーターリストを参照して、または前記パラメーターリストを参照せずに呼び出される請求項１に記載の方法。
【請求項４】
前記特定されたエントリーポイントは、前記ソフトウェアアプリケーション内においてユニークであると見なされる請求項１に記載の方法。
【請求項５】
前記エントリーポイントの全ての呼び出しコンテキストは、正確な解析を保証するため、前記ラッパー関数が生成されると同時に保持される請求項１に記載の方法。
【請求項６】
前記ソフトウェアアプリケーションは、前記ラッパー関数を生成せず、さらに、前記少なくとも１つのコール深度における前記特定されたエントリーポイントの全てから構成される入力を生成して解析される請求項１に記載の方法。
【請求項７】
前記ラッパー関数は、コール階層内の呼び出されない関数をさらに含む請求項１に記載の方法。
【請求項８】
前記エントリーポイントのグループは、エントリーポイントの上位セットをさらに含む請求項１に記載の方法。
【請求項９】
演算環境においてソフトウェアアプリケーションの解析を実行するためのシステムであって、
プロセッサーと、
前記プロセッサーに接続されたメモリーと、を含み、
前記プロセッサーは、前記メモリー内に記録されたプログラムされた指示のセットを実行するよう構成され、
前記メモリーは、
前記ソフトウェアアプリケーションの１つ以上のソースコードを入力データとして受け入れ、さらに、エントリーポイントの包括リストを取得する受信モジュールと、
前記ソフトウェアアプリケーション用の１つ以上の参照構造を構築するため、前記入力データから１つ以上の中間表現を生成するよう構成された生成モジュールと、
前記参照構造から、前記ソフトウェアアプリケーションに関連する前記エントリーポイントのグループに相当する１つ以上の関連関数を特定する特定モジュールと、
前記特定されたエントリーポイントの全てを順に呼び出すラッパー関数を生成するラッパー生成器と、を含み、
前記ラッパー関数は、シングルエントリーポイントとして扱われ、
前記解析モジュールは、前記ラッパー関数の解析を提供し、前記シングルエントリーポイントの解析を可能とし、さらに、前記アプリケーションの完全な解析に繋がる前記特定されたエントリーポイントの全ての解析を可能とし、
前記ラッパー関数の前記解析は、前記エントリーポイントのそれぞれの独立した解析を実行せずに、前記エントリーポイントの前記グループの前記解析をもたらすことを特徴とするシステム。
【請求項１０】
前記参照構造は、前記ソフトウェアアプリケーションに対するコール階層をさらに含む請求項９に記載のシステム。
【請求項１１】
前記特定されたエントリーポイントは、パラメーターリストを参照して、または前記パラメーターリストを参照せずに呼び出される請求項９に記載のシステム。
【請求項１２】
前記特定されたエントリーポイントは、前記ソフトウェアアプリケーション内においてユニークであると見なされる請求項９に記載のシステム。
【請求項１３】
前記ラッパー生成器は、正確な解析を保証するため、前記ラッパー関数が生成されると同時に、前記エントリーポイントの全ての呼び出しコンテキストを保持する請求項９に記載のシステム。
【請求項１４】
前記ラッパー関数は、外部から供給される請求項９に記載のシステム。
【請求項１５】
前記解析モジュールは、前記特定されたエントリーポイントの全てから構成される入力を用い、さらに前記ラッパー関数を生成せずに、前記ソフトウェアアプリケーションを解析する請求項９に記載のシステム。
【請求項１６】
前記関連関数は、コール階層内の呼び出されない関数をさらに含む請求項９に記載のシステム。
【請求項１７】
前記エントリーポイントのグループは、エントリーポイントの上位セットをさらに含む請求項９に記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピューターソフトウェアアプリケーション解析の分野に関する。より具体的に、本発明は、演算環境（computing environment）におけるエントリーポイントの解析実行に関する。
【背景技術】
【０００２】
静的解析（static analysis）技術は、ランタイムエラー（runtime errors）、リソースリーク（resource leaks）およびセキュリティー脆弱性（security vulnerabilities）を、ソフトウェアアプリケーションコードを実行することなく、静的に見つけ出すために用いられている。静的プログラム解析は、ソフトウェアプログラムを実行することなく、実行されるソフトウェアアプリケーションの解析を可能とする。場合によっては、静的プログラム解析は、特定のソースコードまたはオブジェクトコードに実行される。
【０００３】
エントリーポイント（Entry point: プログラミングにおける入口点）は、ソフトウェアアプリケーションの機能（functionality）を実行するのに有用なインターフェース関数またはエントリー関数である。ソフトウェアアプリケーションは、アプリケーションへの複数のエントリーポイントを有していてもよい。これらエントリーポイントは、順番に、または同時に呼び出されることができる。エントリーポイントは、ソフトウェアアプリケーションの特定の機能の解析、およびソフトウェアプリケーションの不正利用（application exposure）の確認のために必要とされる。
【０００４】
任意のソフトウェアアプリケーションは、静的解析ツーツに基づく標準セット（standard set）に対するランタイム欠陥（runtime defect）を特定するために、解析することができる。特定の状況において、複数のエントリーポイントがソフトウェアアプリケーション内に存在するとき、それぞれおよび全てのエントリーポイントは、複数のタスクが並列に実行される分離したタスクとして解析される。それぞれおよび全てのエントリーポイントを分離したタスクとして実行することによるアプリケーションの解析は、多大な時間を要する工程である。エントリーポイントのそれぞれをレビューする場合、全てのエントリーポイント用のレビューポイントまたは欠陥の数は膨大となり、それらエントリーポイントは１つ以上のエントリーポイントと同様の重複したレビューポイントを含む可能性がある。
【発明の概要】
【発明が解決しようとする課題】
【０００５】
したがって、エントリーポイントについての情報（知識）が無い場合に、ソフトウェアアプリケーションの解析を容易にするシステムおよび方法に対するニーズが存在する。このシステムおよび方法は、複数のエントリーポイントを考慮した完成したアプリケーションの解析を容易にし、全ての複数のエントリーポイントを同時に連続して実行することによって、解析時間を減少させ、同じ欠陥またはレビューポイントの重複する報告を減少させることができる。
【０００６】
この概要は、演算環境においてエントリーポイントの解析を実行するためのシステムおよび方法に関する発想（コンセプト）を説明するために提供されるものであり、この発想は以下の詳細な説明において詳述される。この概要は、請求項に記載された本発明の本質的特徴を特定する意図はなく、請求項に記載された本発明の範囲を決定または限定するために用いられるものでもない。
【課題を解決するための手段】
【０００７】
本発明の１つの実施形態において、演算環境においてソフトウェアアプリケーションの解析を実行するための方法が開示される。前記方法は、ソフトウェアアプリケーションのコンパイル可能なソースコードを入力データとして受け入れる工程と、エントリーポイントの包括リストを取得するため、入力データを処理する工程とを含む。この処理する工程は、ソフトウェアアプリケーション用の１つ以上の参照構造を構築するため、入力データから１つ以上の中間表現を生成する工程をさらに含む。処理する工程は、構築された参照構造から、関連関数を特定する工程をさらに含む。関連関数は、ソフトウェアアプリケーションに関連するエントリーポイントのグループに相当する。前記方法は、非決定論的シーケンスを保証し、１つのレベルのコール深度における特定されたエントリーポイントの全てを順に呼び出すラッパー関数を生成する工程をさらに含む。ラッパー関数は、シングルエントリーポイントとして扱われる。この解析は、ラッパー関数の解析がシングルエントリーポイントの解析を可能とし、さらに、アプリケーションの完全な解析をもたらす特定されたエントリーポイントの解析を可能とするよう実行される。ラッパー関数の解析は、エントリーポイントそれぞれの独立した解析を実行することなく、エントリーポイントのグループの解析をもたらす。これら１つ以上の中間表現を生成する工程、特定する工程、ラッパー関数を生成する工程、および解析は、プロセッサーによって実行される。
【０００８】
本発明の１つの実施形態において、演算環境においてソフトウェアアプリケーションの解析を実行するためのシステムが開示される。前記システムは、プロセッサーと、メモリーとを含む。メモリーは、プロセッサーに接続されている。プロセッサーは、メモリー内に記録されたプログラムされた指示のセットを実行するよう構成されている。メモリーは、ソフトウェアアプリケーションの１つ以上のソースコードを入力データとして受け入れ、さらに、エントリーポイントの包括リストを取得する受信モジュールを含む。メモリーは、ソフトウェアアプリケーション用の１つ以上の参照構造を構築するため、入力データから１つ以上の中間表示を生成するよう構成された生成モジュールをさらに含む。メモリーは、参照構造から１つ以上の関連関数を特定する特定モジュールをさらに含む。関連関数は、ソフトウェアプリケーションに関連するエントリーポイントのグループに相当する。メモリーは、少なくとも１つのコール深度値における特定されたエントリーポイントの全てを順に呼び出すラッパー関数を生成するラッパー生成器をさらに含む。ラッパー関数は、シングルエントリーポイントとして扱われる。このソフトウェアアプリケーションの解析は、解析モジュールがラッパー関数の解析を提供し、シングルエントリーポイントの解析を可能とし、さらに、アプリケーションの完全な解析に繋がる特定されたエントリーポイントの全ての解析を可能とするように実行される。ラッパー関数の解析は、エントリーポイントそれぞれの独立した解析を実行することなく、エントリーポイントのグループの解析をもたらす。
【図面の簡単な説明】
【０００９】
添付の図面を参照して、詳細な説明が記載される。図中において、参照番号の内、左端の数字は、その参照番号が最初に現れる図を特定する。各図において、同様の特徴およびコンポーネントを参照するために、同じ番号が用いられている。
【００１０】
【図１】図１は、本発明の実施形態に係る演算環境においてエントリーポイントの解析のためのシステムのネットワーク実装を示す。
【００１１】
【図２】図２は、本発明の実施形態に係る演算環境においてエントリーポイントの解析を実行するシステムを示す。
【００１２】
【図３】図３は、本発明の実施形態に係る演算環境においてエントリーポイントの解析を実行するための方法を示す。
【００１３】
【図４】図４は、本発明の実施形態に係る関連関数を特定するための方法を示す。
【００１４】
【図５】図５は、本発明の実施形態に係るラッパー関数を生成するための方法を示す。
【００１５】
【図６】図６は、本発明の実施形態に係るハードコードラッパー関数用の方法を示す。
【００１６】
【図７】図７は、本発明の実施形態に係る１つ以上のエントリーポイントを含むアプリケーションコードを示す。
【発明を実施するための形態】
【００１７】
演算環境においてエントリーポイントの解析を実行するためシステムおよび方法が開示される。ソフトウェアアプリケーション内のエントリーポイントは、解析され、同時に連続して実行される。ソフトウェアアプリケーションを解析するために、全てのエントリーポイントが、完成したアプリケーションを網羅（カバー）するシングルエントリーポイント（single entry point）として見なされる。
【００１８】
ソフトウェアアプリケーションへのエントリーポイントが特定される。それぞれおよび全てのエントリーポイントの呼び出しコンテキスト（context:プログラムの実行に必要な情報）は特定され、呼び出しコンテキストはソフトウェアアプリケーションの解析のために保持される。中間表現（intermediate representation:プログラム等において、入力から構築されるデータ構造）は、アプリケーションソースコードから生成される。生成された中間表現は、ソフトウェアアプリケーションのコール階層（call hierarchy）を組み立てる。ソフトウェアアプリケーション内の呼び出されない関数（uncalled functions）は特定され、呼び出されない関数はエントリーポイントの上位セット（super-set）として機能する。全ての呼び出されない関数は、ソフトウェアアプリケーションへのエントリーポイントとして見なされる。
【００１９】
ラッパー関数（wrapper function）は、呼び出しコンテキストを保持することによって特定されるエントリーポイントを呼び出すことによって生成される。ラッパー関数は、シングルエントリーポイントと見なされることによって、解析される。ラッパー関数は、全てのエントリーポイントを解析する。
【００２０】
記述される演算環境においてエントリーポイントの解析を実行するためのシステムおよび方法の目的は、任意の数の異なる演算システム、環境、および／または構成において実施することができるが、本実施形態は、以下の例示的なシステムの状況で説明される。
【００２１】
図１を参照すると、本発明の実施形態に係る、エントリーポイントの解析を実行するためのネットワーク実装１００が図示されている。１つの実施形態において、システム１０２は、ソフトウェアアプリケーション内の呼び出されない関数を特定する。特定された呼び出されない関数は、ソフトウェアアプリケーションへのエントリーポイントの上位セットとして機能する。全てのエントリーポイントは、シングルエントリーポイントとしてラップされ（包まれ）、解析される。
【００２２】
本発明は、システム１０２がサーバー上の解析ツールとして実装されているものとして説明されるものの、システム１０２は、ラップトップコンピューター、デスクトップコンピューター、ノートパソコン、ワークステーション、メインフレームコンピューター、サーバー、ネットワークサーバー等の様々な演算システムの形態で実装可能である。システム１０２は、以下まとめてユーザー１０４またはユーザーデバイス１０４上に存在するアプリケーションとして総称される１つ以上のユーザーデバイス１０４−１、１０４−２・・・１０４−Ｎを介して、複数のユーザーによってアクセスされてもよい。ユーザーデバイス１０４の例として、これに限定されるものではないが、携帯型コンピューター、携帯情報端末（ＰＤＡ）、携帯用デバイス（handheld device）、およびワークステーションが挙げられる。ユーザーデバイス１０４は、ネットワーク１０６を介して、システム１０２と通信可能に接続されている。
【００２３】
１つの実施形態では、ネットワーク１０６は、無線ネットワーク、有線ネットワークまたはこれらの組み合わせであってもよい。ネットワーク１０６は、イントラネット、ローカルエリアネットワーク（ＬＡＮ）、ワイドエリアネットワーク（ＷＡＮ）、インターネット等のような異なるタイプのネットワークのいずれか１つの様態で実装することができる。ネットワーク１０６は、専用ネットワーク（dedicated network）または共有ネットワーク(shared network)のいずれか一方であってもよい。共有ネットワークは、互いに通信を行うための様々なタイプのプロトコル（例えば、ハイパーテキストトランスファープロトコル（ＨＴＴＰ）、トランスミッションコントロールプロトコル／インターネットプロトコル（ＴＣＰ／ＩＰ）、無線アプリケーションプロトコル（ＷＡＰ）等）を用いる異なるタイプのネットワークの接続に相当する。さらに、ネットワーク１０６は、ルーター、ブリッジ、サーバー、演算デバイス、ストレージデバイス等を含む様々なネットワークデバイスを含んでいてもよい。
【００２４】
図２を参照すると、本発明の実施形態に係るシステム１０２が図示されている。１つの実施形態において、システム１０２は、少なくとも１つのプロセッサー２０２と、入出力（Ｉ／Ｏ）インターフェース２０４と、メモリー２０６とを有している。少なくとも１つのプロセッサー２０２は、１つ以上のマイクロプロセッサー、マイクロコンピューター、マイクロコントローラー、デジタル信号プロセッサー、中央演算ユニット（ＣＰＵ）、状態マシーン（state machine）、論理回路、および／または動作指示（operational instruction）に基づいて信号を操作する任意のデバイスの様態で実装することができる。その他の性能の内、少なくとも１つのプロセッサー２０２は、メモリー２０６内に記録されたコンピューター可読指示（computer-readable instruction）をフェッチ（fetch:メモリーから指示を取り出す動作）および実行するよう構成されている。
【００２５】
Ｉ／Ｏインターフェース２０４は、様々なソフトウエアおよびハードウェアインターフェース（例えば、ウェブインターフェース、グラフィカルユーザーインターフェース（ＧＵＩ）等）を備えていてもよい。Ｉ／Ｏインターフェース２０４は、システム１０２がユーザーと直接またはクライアントデバイス１０４を介して情報をやりとりすることを可能とする。さらに、Ｉ／Ｏインターフェース２０４は、システム１０２がウェブサーバーおよび外部データベース等の他の演算デバイス（図示せず）と通信可能としてもよい。Ｉ／Ｏインターフェース２０４は、有線ネットワーク（例えば、ＬＡＮ、ケーブル等）および無線ネットワーク（ＷＬＡＮ、セルラー、または衛星等）を含む幅広いタイプのネットワークおよびプロトコル内における複数の通信を容易にすることができる。Ｉ／Ｏインターフェース２０４は、多数のデバイスを互いにまたは別のサーバーに接続するための１つ以上のポートを含んでいてもよい。
【００２６】
メモリー２０６は、従来技術において既知のコンピューター可読媒体（例えば、ＳＲＡＭ（static random access memory）、ＤＲＡＭ（dynamic random access memory）のような揮発性メモリーおよび／またはＲＯＭ（read only memory）、消去型プログラム可能ＲＯＭ（erasable programmable ROM）、フラッシュメモリー、ハードディスク、光学ディスク、磁気テープのような不揮発性メモリー）を含んでいてもよい。メモリー２０６は、モジュール２０８と、データ２３０とを含んでいる。
【００２７】
モジュール２０８は、特定のタスクを実行または特定の抽象データ型（abstract date type）を実装（インプリメント）するルーティン（routine:ある限定された仕事を実行するプログラム）、プログラム、オブジェクト、コンポーネント、データ構造等を含む。１つの実施形態において、モジュール２０８は、受信モジュール２１０と、生成モジュール２１２と、特定モジュール２１４と、ラッパー生成器２１６と、解析モジュール２１８と、その他のモジュール２２０とを含む。その他のモジュール２２０は、システム１０２のアプリケーションおよび機能を補うプログラムまたはコードされた指示を含んでいてもよい。
【００２８】
これらの中で、データ２３０は、１つ以上のモジュール２０８によって処理、受信および生成されたデータを記録するための記録場所（repository）として機能する。また、データ２３０は、システムデータベース２３２と、その他のデータ２３４とを含む。その他のデータ２３４は、その他のモジュール２２０内の１つ以上のモジュールの実行結果として生成されたデータを含んでいてもよい。
【００２９】
１つの実施形態において、最初に、ユーザーは、Ｉ／Ｏインターフェース２０４を介してシステム１０２にアクセスするため、クライアントデバイス１０４を使用する。システム１０２の働きは、以下に説明される図２および図３を用いて詳述される。システム１０２は、ソフトウェアプリケーション内のエントリーポイントを特定する。システム１０２は、参照構造（informative structure）を構築するため、ソフトウェアアプリケーションから１つ以上の中間表現を生成する。参照構造は、ソフトウェアアプリケーションに対するコール階層をさらに含んでいてもよい。さらに、システム１０２は、ソフトウェアアプリケーションへのエントリーポイントと見なされる呼び出されない関数を特定する。エントリーポイントはラップされ、ラッパー関数は、（ある）コール深度における特定されたエントリーポイントの全てを呼び出すように生成される。ラッパー関数は、シングルエントリーポイントと見なされ、解析される。
【００３０】
図２および図３を参照し、システム１０２は、プロセッサー２０２と、プロセッサー２０２に接続されたメモリー２０６とを含んでいる。プロセッサー２０２は、メモリー２０６内に記録されているプログラムされた指示（programmed instruction）のセットを実行するよう構成されている。メモリー２０６は受信モジュール２１０を含み、受信モジュール２１０は、ソフトウェアアプリケーションに関連する１つ以上のエントリーポイントを、入力データとして受け付ける（ステップ３０２）よう構成されている。受信モジュール２１０は、エントリーポイントの包括リスト（comprehensive list）を取得するため、入力データを処理する（ステップ３０４）。１つの実施形態において、入力データは、ソースコードを含んでいてもよい。さらに、最小コール長値（minimum call length value）、すなわち、コール深度値は、取りうる全てのエントリーポイントを含むような１つの入力データとして見なされる。
【００３１】
メモリー２０６は、入力データ、すなわち、ソースコードから１つ以上の中間表現を生成（ステップ３０６）するよう構成された生成モジュール２１２を含む。さらに、生成モジュール２１２は、ソフトウェアプリケーション用の１つ以上の参照構造の構築を容易にする。
【００３２】
１つの実施形態において、参照構造は、ソフトウェアアプリケーションに対するコール階層をさらに含んでいる。生成モジュール２１２は、ソフトウェアアプリケーションのコール階層を組み立てる。別の実施形態において、中間表現を用いて、１つ以上のコールグラフ（call graph:コンピューターアプリケーションのサブルーチン同士の呼び出し関係を表現した有向グラフ）が構築され、コールグラフがコール階層の形式で表示される。
【００３３】
１つの実施形態において、メモリー２０６は、参照構造から１つ以上の関連関数（relevant function）を特定する（ステップ３０８）よう構成された特定モジュール２１４を含む。１つの実施形態において、特定された関連関数は、ソフトウェアプリケーションのコール階層内の呼び出されない関数を含んでいてもよい。コール階層を用いることにより、特定モジュール２１４は、ソフトウェアアプリケーション内の呼び出されない関数を特定する。さらに、関連関数は、ソフトウェアアプリケーションに関連するエントリーポイントのグループ（群）に相当してもよい。さらに、エントリーポイントのグループは、エントリーポイントの上位セットをさらに含んでいる。
【００３４】
最小コール深度値は、入力データの１つとして見なされるため、特定された呼び出されない関数の全ては、エントリーポイントとして扱われる。図３および図４を参照し、ステップ３０８は、ソフトウェアプリケーション内の呼び出されない関数を特定する工程（ステップ４０２）をさらに含む。ソフトウェアアプリケーション内の特定された呼び出されない関数は、エントリーポイントと見なされる（ステップ４０４）。
【００３５】
本発明の別の実施形態において、メモリー２０６は、関連関数のそれぞれに対するラッパー関数を生成する（ステップ３１０）よう構成されたラッパー生成器２１６を含む。図５を参照し、ラッパー生成器２１６は、エントリーポイントをラップするために、エントリーポイントを特定する（ステップ５０２）。ラッパー生成器２１６は、全てのエントリーポイントをシングルエントリーポイント内へとラップする（ステップ５０４）。シングルエントリーポイントは、ソフトウェアアプリケーション全体で検討されるエントリーポイントの全てに関連するパラメーターの全てを含んでいてもよい。
【００３６】
本発明の別の実施形態において、メモリー２０６は、解析モジュール２１８を含み、解析モジュールは、エントリーポイントに関連するパラメーターを収集することにより、ラッパー関数の解析を実行する。さらに、静的解析が、ソフトウェアアプリケーション全体を解析するために、全てのエントリーポイントを含むエントリーポイントに対して実行される。解析モジュール２１８は、エントリーポイント全体に関連するパラメーターの全てを含むシングルエントリーポイントを解析し、次に、エントリーポイントの全てを個別に解析することなく、エントリーポイントの全てを連続して解析する。
【００３７】
ラッパー関数の解析（ステップ３１２）は、エントリーポイントの全てをシングルエントリーポイントとして解析する工程と、関連関数の解析とを含む。さらに、解析モジュール２１８は、関連関数の解析を行い、その結果、エントリーポイントそれぞれの独立した解析を実行せずに、エントリーポイントの全てのグループの解析を行うことができる。これにより、複数のエントリーポイントを有するアプリケーション全体の解析に係る所要時間を減少させることができる。アプリケーションを解析するため、それぞれ及び全ての特定されたエントリーポイントの呼び出しコンテキストが正確な結果のために保持される。呼び出しコンテキストは、それぞれのエントリーポイントの解析に影響を与えずに複数のエントリーポイントを連続的に実行することによって保持される。ラッパー関数内に生成されたアプリケーションコードは、特定された全てのエントリーポイントを呼び出し、さらに、ｉｆ条件またはｅｌｓｅ条件内にエントリーポイントをラップすることにより、アプリケーションコードを解析する。
【００３８】
本発明の別の実施形態において、ラッパー生成器２１６によってラッパー関数を生成する工程は、非決定論的シーケンス（non-deterministic sequence）を保証し、最小レベルコール深度における全ての特定されたエントリーポイントを呼び出す。さらに、コール深度は、コール鎖（call chain）のサイズを含んでいてもよい。例えば、関数ｆ１が他の如何なる関数も呼び出さない場合、コール深度は“１”となる。さらに、関数ｆ２が関数ｆ１を呼び出す場合、ｆ２のコール深度は“２”となる。これは、コール鎖の長さを示す。さらに、ラッパー関数は、シングルエントリーポイントと見なすことができる。特定されたエントリーポイントは、アプリケーション内においてユニーク（一意的）であると見なすことができる。さらに、特定されたエントリーポイントは、パラメーターリストを参照することにより、またはパラメーターリストを参照せずに、呼び出される。例えば、関数ｆ１（ａ，ｂ，ｃ）用に、パラメーターを用いて関数を呼び出す工程が定義される。マングル（難号化）された関数（mangled function）は、リンク（linking）のために用いられる。さらに、関数ｆ１（）用に、パラメーターを参照せずに関数を呼び出す工程が定義される。ここで、関数名のみがリンク用に用いられる。全てのエントリーポイントの呼び出しコンテキストは、正確な解析を保証するために、ラッパー関数が生成されると同時に保持される。さらに、ラッパー関数は、エントリーポイントを解析するために、外部から供給されてもよい。
【００３９】
解析モジュール２１８によるラッパー関数の解析は、シングルエントリーポイントの解析を可能とし、さらに、アプリケーションの完全な解析に繋がる特定されたエントリーポイントの解析を可能とする。ラッパー関数の解析は、エントリーポイントそれぞれの独立した解析を実行することなく、エントリーポイントのグループの解析をもたらす。さらに、１つのエントリー関数の影響は、エントリー関数の全て用に、後続の別のエントリー関数によって呼び出される。
【００４０】
システムは、１つのエントリー関数の影響が、全ての可能な置換（all possible permutations）において次々と呼び出され、無限シーケンスとなることをさらに保証する。
【００４１】
本発明の別の実施形態において、ソフトウェアアプリケーションは、ラッパー関数を生成せず、さらに、特定されたエントリーポイントの全てから構成される入力を生成し、解析モジュール２１８によって、解析される。
【００４２】
解析機（analyzer）内のハードコード（hard code:特定の動作環境を前提として書かれたコード）された初期設定のラッパーを考慮すれば、ラッパーが生成または供給されることを要求されない場合に、内部のラッパーが用いられてもよい。ハードコードされたラッパー用に、開始時点において、エントリー関数の１つのみがランダムに呼び出されることを前提とすることができる。パラメーターは、全ての場合を想定するため、非決定論的値（non-deterministic value）で提供される。別の実施形態において、グローバル変数（global variable）は、アプリケーション実行開始時点における宣言（declaration）毎に値を有すると見なされる。
【００４３】
１つの例示的な実施形態において、ハードコードラッパー関数は、図６を参照して説明される。ハードコードラッパー関数を考慮し、ｅｎｔｒｙ１、ｅｎｔｒｙ２、ｅｎｔｒｙ３のような３つのエントリー関数が存在することを仮定する。このアプリケーションコード用では、ｅｎｔｒｙ１は１つの整数値パラメーターを有しており、ｅｎｔｒｙ２は２つの整数値パラメーターを有しており、さらに、ｅｎｔｒｙ３はパラメーターを有していない。ステップ６０４において、関数ｈａｒｄ  ｃｏｄｅｄ  ｗｒａｐｐｅｒ（）が呼び出される。次のステップ６０６において、整数変数「ｃｈｏｉｃｅ」が初期化される。ステップ６０８において、関数ｒａｎｄｏｍ（）のモジュール出力値が変数「ｃｈｏｉｃｅ」に割り当てられる。さらに、ケース分岐（switch case）が実行される。ケース“０”であれば、次のステップ６１０において、関数ｅｎｔｒｙ１（）が、関数ｒａｎｄｏｍ（）の出力の入力パラメーターを用いて実行される。ケース“１”であれば、関数ｅｎｔｒｙ２（）呼び出しの次のステップ６１２が、関数ｒａｎｄｏｍ（）の出力の入力パラメーターを用いて実行される。ケース“２”であれば、次のステップ６１４において、関数ｅｎｔｒｙ３（）が呼び出される。ここで「ｒａｎｄｏｍ」は、ランダムな整数値を生成するツールと共に提供されるライブラリ関数である。
【００４４】
別の実施形態において、最小コール深度“１”におけるエントリーポイントを取得するため、ソースコードとして以下の関数を有するソフトウェアアプリケーションを仮定する。
Ｔｅｓｔ１．ｃ
ｖｏｉｄ  ｆｏｏ（ｉｎｔ  ｉｎｐ１，  ｉｎｔ  ｉｎｐ２）
｛
ｂａｒ１（）；
ｂａｒ２（）；
｝
ｖｏｉｄ  ｂａｒ１（）
｛
ｂａｒ３（）；
｝
ｖｏｉｄ  ｂａｒ２（）
｛
ｂａｒ３（）；
｝
Ｔｅｓｔ２．ｃ
ｖｏｉｄ  ｆｕｎｃ（ｉｎｔ  ｉｎｐ１）
｛
ｂａｒ２（）；
｝
ｖｏｉｄ  ｂａｒ３（）
｛｝
ｖｏｉｄ  ｆｕｎｃ２（）
｛
ｂａｒ３（）；
｝
ｖｏｉｄ  ｂａｒ４（ｃｈａｒ  ｃ）
｛
｝
【００４５】
ソースコードの上記サンプル用に生成されたコール階層は、以下に示すようなものとなる。
2014194756.tif 000003
【００４６】
ここで、エントリーポイントの上位セット、すなわち、呼び出されない関数のセットは、｛ｆｏｏ（），  ｆｕｎｃ（），  ｆｕｎｃ２（），  ｂａｒ４（）｝となる。
ｆｏｏ（）のコール深度＝３
ｆｕｎｃ（）のコール深度＝３
ｆｕｎｃ２（）のコール深度＝２
ｂａｒ４（）のコール深度＝１
さらに、要求最小コール深度“１”用のエントリーポイントのセットは、｛ｆｏｏ（），  ｆｕｎｃ（），  ｆｕｎｃ２（），  ｂａｒ４（）｝である。
要求最小コール深度“２”用のエントリーポイントのセットは、｛ｆｏｏ（），  ｆｕｎｃ（），  ｆｕｎｃ２（）｝である。
要求最小コール深度“３”用のエントリーポイントのセットは、｛ｆｏｏ（），  ｆｕｎｃ（）｝である。
【００４７】
別の例示的な実施形態において、１つ以上のエントリーポイントを含むアプリケーションコードが、図７を参照して説明される。上述のテストケース用に、４つのエントリーポイントｆｏｏ、ｆｕｎｃ、ｆｕｎｃ２、ｂａｒ４が存在する。Ｃファイルは、ラッパー関数によって生成される。ステップ７０２において、整数変数ｄｕｍｍｙ、ｖａｒ１、ｖａｒ２、ｖａｒ３、および文字変数が初期化される。次のステップ７０４において、関数ａｌｌ  ｅｎｔｒｙ  ｐｏｉｎｔｓ（）が呼び出される。次のステップ７０６において、ループが初期化される。次のステップ７０８において、ｄｕｍｍｙが“０”ならば、入力パラメーターとしてｖａｒ１およびｖａｒ２を用いた関数ｆｏｏ（）が呼び出される。次のステップ７１０において、ｄｕｍｍｙが“１”ならば、入力パラメーターとしてｖａｒ３を用いた関数ｆｕｎｃ（）が呼び出される。次のステップ７１２において、ｄｕｍｍｙが“２”ならば、関数ｆｕｎｃ２（）が呼び出される。次のステップ７１４において、ｄｕｍｍｙが“３”ならば、パラメーターとしてｖａｒ４を用いた関数ｂａｒ４（）が呼び出される。
【００４８】
ラッパー生成器２１６は、全てのエントリーポイントを、ソフトウェアアプリケーションに関連するそれらのパラメーターと共に収集する。さらに、ラッパー生成器２１６は、パラメーターと共に全てのエントリーポイントを収集し、さらに、エントリーポイントに関連するパラメーター内に存在する変数を宣言する。
【図１】
2014194756.tif 000004
【図２】
2014194756.tif 000005
【図３】
2014194756.tif 000006
【図４】
2014194756.tif 000007
【図５】
2014194756.tif 000008
【図６】
2014194756.tif 000009
【図７】
2014194756.tif 000010
【外国語明細書】
2014194756.tif 000011
2014194756.tif 000012
2014194756.tif 000013
2014194756.tif 000014
2014194756.tif 000015
2014194756.tif 000016
2014194756.tif 000017
2014194756.tif 000018
2014194756.tif 000019
2014194756.tif 000020
2014194756.tif 000021
2014194756.tif 000022
2014194756.tif 000023
2014194756.tif 000024
2014194756.tif 000025
2014194756.tif 000026
2014194756.tif 000027
【図１】
2014194756.tif 000028
【図２】
2014194756.tif 000029
【図３】
2014194756.tif 000030
【図４】
2014194756.tif 000031
【図５】
2014194756.tif 000032
【図６】
2014194756.tif 000033
【図７】
2014194756.tif 000034