(57)【要約】  本発明は、バイナリコードを解析するための方法、システムおよびコンピュータプログラム製品に及ぶ。バイナリコードを受け取る。バイナリコードの機能性に関するクエリを示すコード解析ルールを受け取る。クエリは、クエリの結果を決定するように構成された解析コードで実施される。クエリについて有効なキャッシュされた結果が結果ストアにキャッシュされているかどうか判断される。そうでない場合は、クエリの結果を決定するために解析コードが呼び出され、結果がキャッシュされる。したがって、クエリが将来受け取られるとき、結果は、結果決定のために解析コードを呼び出す必要なしに、結果ストアからアクセスすることができる。そうである場合は、解析コードのさらなる呼出しを回避するために、キャッシュされた結果が取り出される。結果が返される。
2009524875.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータシステム上でバイナリコードを解析するための方法であって、
バイナリコードを受け取る動作と、
コード解析ルールを受け取る動作であって、少なくとも１つのコード解析ルールは、前記バイナリコードの機能性に関するクエリを示し、前記クエリは、前記クエリの結果を決定するように構成された解析コードで実施される動作と、
前記クエリについての有効な結果が結果ストア内にキャッシュされていないことを決定する動作と、
前記クエリについての前記結果を決定するために前記解析コードを呼び出す動作と、
前記クエリが将来受け取られるとき、前記結果を決定するために前記解析コードを呼び出す必要なしに、前記結果を前記結果ストアからアクセスできるように、前記結果を前記結果ストア内にキャッシュする動作と、
前記クエリについての前記結果を返す動作と
を備えたことを特徴とする方法。
【請求項２】
バイナリコードを受け取る前記動作は、コンパイルされたソースコードおよび中間言語命令のうちの少なくとも１つを受け取る動作を備えたことを特徴とする請求項１に記載の方法。
【請求項３】
コード解析ルールを受け取る前記動作は、バイナリコードの特性を解析するためのコード解析ルールを受け取る動作を備えたことを特徴とする請求項１に記載の方法。
【請求項４】
バイナリコードの特性を解析するためのコード解析ルールを受け取る前記動作は、前記バイナリコードに関連するセキュリティ設定、前記バイナリコードの設計ガイドラインへの適合性、および前記バイナリコードの機能性のうちの１または複数を解析するためのコード解析ルールを受け取る動作を備えたことを特徴とする請求項１に記載の方法。
【請求項５】
前記クエリについての有効な結果が結果ストアにキャッシュされていないことを決定する前記動作は、前記結果ストア内にキャッシュされた前記クエリについての結果がないことを決定する動作を備えたことを特徴とする請求項１に記載の方法。
【請求項６】
前記クエリについての有効な結果が結果ストアにキャッシュされていないことを決定する前記動作は、前記クエリについての無効な結果が前記結果ストア内にキャッシュされていることを決定する動作を備えたことを特徴とする請求項１に記載の方法。
【請求項７】
前記クエリについての無効な結果が前記結果ストア内にキャッシュされていることを決定する前記動作は、前記受け取ったバイナリコードに対応するタイムスタンプおよびチェックサムのうちの少なくとも１つがそれぞれ、前記コードクエリの以前に生成された結果に対応するキャッシュされたタイムスタンプおよびチェックサムと異なることを決定する動作を備えたことを特徴とする請求項６に記載の方法。
【請求項８】
前記クエリについての前記結果を決定するために前記解析コードを呼び出す前記動作は、前記バイナリコードおよび前記コードクエリを受け取ったコード解析モジュール内に含まれる解析コードを呼び出す動作を備えたことを特徴とする請求項１に記載の方法。
【請求項９】
前記クエリについての前記結果を決定するために前記解析コードを呼び出す前記動作は、前記バイナリコードおよび前記コードクエリを受け取った解析モジュールの外部にあるプラグインから解析コードを呼び出す動作を備えたことを特徴とする請求項１に記載の方法。
【請求項１０】
前記クエリについての前記結果を決定するために前記解析コードを呼び出す前記動作は、関数によって返され得る結果コード、呼出し箇所がメモリ割当てを恐らく返し得るかどうか、関数の呼び出しグラフ、変数およびパラメータの制約、値がＮＵＬＬであり得るか、それともＮＵＬＬであり得ないか、および集約セキュリティ許可のうちの１または複数を計算するために前記バイナリコードを解析する動作を備えたことを特徴とする請求項１に記載の方法。
【請求項１１】
前記結果を前記結果ストアにキャッシュする前記動作は、前記バイナリコードを受け取った前記コンピュータシステムにネットワーク接続可能である結果ストアで前記結果をキャッシュする動作を備えたことを特徴とする請求項１に記載の方法。
【請求項１２】
コンピュータシステム上でバイナリコードを解析するための方法であって、
バイナリコードを受け取る動作と、
コード解析ルールを受け取る動作であって、少なくとも１つのコード解析ルールは、前記バイナリコードの機能性に関するクエリを示し、前記クエリは、前記クエリの結果を決定するように構成された解析コードで実施される動作と、
前記クエリについてのキャッシュされた結果が結果ストアにキャッシュされていることを決定する動作であって、前記キャッシュされた結果は、前記クエリについての前記結果を決定するために使用された前記解析コードの呼出しに続いて前記結果ストアに格納される動作と、
前記キャッシュされた結果が有効であることを決定する動作と、
前記解析コードのさらなる呼出しを回避するために、前記キャッシュされた結果を取り出す動作と、
前記キャッシュされた結果を返す動作と
を備えたことを特徴とする方法。
【請求項１３】
バイナリコードを受け取る前記動作は、コンパイルされたソースコードを受け取る動作を備えたことを特徴とする請求項１２に記載の方法。
【請求項１４】
コード解析ルールを受け取る前記動作は、バイナリコードの特性を解析のためのコード解析ルールを受け取る動作を含むことを特徴とする請求項１２に記載の方法。
【請求項１５】
バイナリコードの特性の解析のためのコード解析ルールを受け取る前記動作は、前記バイナリコードに関連するセキュリティ設定、前記バイナリコードの設計ガイドラインへの適合性、および前記バイナリコードの機能性のうちの１または複数を解析するためのコード解析ルールを受け取る動作を備えたことを特徴とする請求項１２に記載の方法。
【請求項１６】
前記クエリについての前記キャッシュされた結果が有効であることを決定する前記動作は、前記受け取ったバイナリコードに対応するタイムスタンプおよびチェックサムがそれぞれ、前記コードクエリの以前に生成された結果に対応するキャッシュされたタイムスタンプおよびチェックサムに対応することを決定する動作を備えたことを特徴とする請求項１２に記載の方法。
【請求項１７】
前記キャッシュされた結果を取り出す動作は、前記バイナリコードを受け取った前記コンピュータシステムにネットワーク接続可能である結果ストアからキャッシュされた結果を取り出す動作を備えたことを特徴とする請求項１２に記載の方法。
【請求項１８】
１または複数のプロセッサと、
システムメモリと、
コード解析モジュールのコンピュータ実行可能命令が格納された１または複数のコンピュータ読取り可能記憶媒体であって、前記コード解析モジュールは、
バイナリコードを受け取るステップと、
コード解析ルールを受け取るステップであって、少なくとも１つのコード解析ルールが、前記バイナリコードの機能性に関連するクエリを示し、前記クエリが、前記クエリの結果を決定するように構成された解析コードで実施されるステップと、
前記クエリについてキャッシュされた有効な結果が結果ストアにキャッシュされているかどうか判断するステップと、
有効な結果がキャッシュされていないとき、
前記クエリについての前記結果を決定するために前記解析コードを呼び出すステップと、
前記クエリが将来受け取られるとき、前記結果を決定するために前記クエリコードを呼び出す必要なしに前記結果が前記結果ストアからアクセスできるように、前記結果を前記結果ストア内にキャッシュするステップと、
有効な結果がキャッシュされている場合は、
前記解析コードのさらなる呼出しを回避するために、前記キャッシュされた結果を取り出すステップと、
前記クエリについての前記結果を返すステップと
を実施するように構成された、コンピュータ読取り可能記憶媒体と
を備えることを特徴とするコンピュータシステム。
【請求項１９】
前記クエリについて有効なキャッシュされた結果が結果ストア内にキャッシュされているかどうかを決定するように構成された前記コード解析モジュールは、前記受け取ったバイナリコードに対応するタイムスタンプおよびチェックサムがそれぞれ、前記コードクエリの以前に生成された結果に対応するキャッシュされたタイムスタンプおよびチェックサムに対応するかどうかを決定するように構成された前記解析モジュールを備えることを特徴とする請求項１８に記載のコンピュータシステム。
【請求項２０】
前記コード解析モジュールは、解析エンジンとキャッシュインターフェースモジュールとを含み、前記クエリについての前記結果を返すように構成された前記コード解析モジュールは、前記解析エンジンに結果を返すように構成された前記キャッシュインターフェースモジュールを備えることを特徴とする請求項１８に記載のコンピュータシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
１．背景および関連技術。
コンピュータシステムおよび関連技術は、社会の多くの側面に影響を及ぼす。確かに、コンピュータシステムの情報を処理する能力は、我々が生活し働く方式を変化させてきた。コンピュータシステムは現在、コンピュータシステムの出現前には手作業で実施されていた多数のタスク（たとえば文書処理、スケジューリングおよびデータベース管理）を一般に実施する。より最近では、コンピュータシステムは、有線と無線の両方のコンピュータネットワークを形成するように互いに、また他の電子装置に結合されており、このネットワークを介してコンピュータシステムおよび他の電子装置は、電子データを転送することができる。結果として、コンピュータシステムで実施される多くのタスク（たとえば音声通信、電子メールへのアクセス、家電の制御、ウェブブラウジングおよび文書印刷）は、有線および／または無線コンピュータネットワークを介して複数のコンピュータシステムおよび／または他の電子装置の間で通信（たとえば電子メッセージの交換）することを含む。
【０００２】
したがって、ソフトウェアアプリケーションの実行に応答して汎用コンピューティングシステムによって実施され得る非常に様々な機能およびアプリケーションがある。しかし、コンピューティングシステムの有用性および機能性は、プロセッサによって実際に実行されるバイナリ命令にコンパイルされまたは解釈されたソースコードの適切なコーディングに依存する。コーディングまたは設計の誤り（しばしば「バグ」と呼ばれる）がある場合、この結果として、予想されたふるまいからの偏差がしばしば生じることになる。
【０００３】
さらに、ソフトウェアプログラマおよび設計者の創造性によって、ますます複雑で強力なソフトウェアアプリケーションがもたらされてきた。ソフトウェアアプリケーションの複雑さが増すにつれて、予想されない性能の偏差を引き起こし得るコーディングおよび設計誤りの潜在性もしばしば増加する。したがって、予想外の性能偏差が生じることは、ほとんど不可避である。したがって、ほとんどの開発環境では、開発されたソフトウェアの予想外の性能偏差の数を減らす努力がなされる。
【０００４】
予想外の性能偏差を減らす努力は、予想外の性能偏差を識別し、コードが顧客に公開される前にそれを取り除こうとするためにコード解析を実施することを含み得る。一部のコード解析機構では、ローカル（たとえばクライアント側）解析が、プログラマによってコンパイルされた開発中のバイナリに対して行われる。このローカル手法は、開発プロセスに近いコード解析結果をもたらし、コード内で正当性の問題を常にチェックすることを防ぐのに有効である。これは、開発サイクルのできるだけ早期に問題を識別することによって、その問題を修正するのに消費されるリソースの量が減少するので有益である。
【０００５】
しかし、ローカル解析は、妥当な時間内に実行されなければならないので必ず制限される。すなわち、開発者は、コードに組み込み戻すための解析結果をタイムリーな方式で得なければならない。タイムリーな方式で結果を得ることができないと、開発者は、開発よりも解析結果を待つことにより多くの時間を費やすことになる。したがって、少なくともこれらの時間制約によって、行われ得るローカル解析の深さおよび複雑さが制限される。たとえば、ローカル解析機構はしばしば、データフローの能力をイントラプロシージャ（すなわちプロシージャ内）解析に制限し、インタープロシージャ（すなわちプロシージャ間）解析を可能にしない。その結果、ローカルコード解析はプロシージャ境界を横断する高級な解析を実施するためには、一般に使用できない。
【０００６】
他のコード解析機構では、リモート（たとえばサーバベース）解析が、ソース制御内でチェックされたコンパイル済みコードに対して行われる。一部の解析は、リソース集約的であり、完了するのに長期間（たとえば数時間）を要することがある。一部の環境では、このタイプの解析の負担を取り除いてリモート（かつ潜在的により強力な）コンピュータに向けることは有益である。リモートコンピュータシステムに解析を実施させると、開発者のコンピュータが、リソースを消費するリソース集約型解析を伴わずにコード開発に使用するために解放される。
【発明の開示】
【発明が解決しようとする課題】
【０００７】
しかし、リモート解析は、たとえば、しばしば夜通し行われるローカル解析よりもかなり長い時間を結果生成に要することがある。したがって、リモート解析は、ローカルコード解析と比較して、結果の生成により多くの待ち時間を有する。多くの開発環境では、開発者は、チェックイン（たとえば、それらの結果に基づいてさらなる修正を必要とし得る）に関する結果を受け取るために数時間待つことはできない。
【０００８】
さらに、リモートコード解析を実行するために、開発者は、調査および解決によって問題を管理するための基盤（たとえば結果のデータベースを管理するウェブアプリケーション）を開発するように求められ得る。またリモートコード解析では、開発者は、チェックインの前に１組の予期される変更を解析するためにコード解析（たとえばプロシージャ間解析）を実施することはできない。さらに、既存のリモートコード解析技術は一般に、開発プロセスの間に使用するにはあまりに高級である。したがって、一部の開発環境では、開発者は、時間およびコスト制約により、それほど強力でないローカルコード解析を使用することになる。
【課題を解決するための手段】
【０００９】
本発明は、バイナリコードを解析するための方法、システムおよびコンピュータプログラム製品に及ぶ。一部の実施形態では、バイナリコードおよびコード解析ルールを受け取る（受信する）。少なくとも１つのコード解析ルールは、バイナリコードの機能性に関するクエリを示すものである。クエリは、クエリの結果を決定するように構成された解析コードで実装される。クエリについての有効な結果が結果ストアにキャッシュされていないことを決定される。それに応答して、解析コードが、クエリの結果を決定するために呼び出される。結果は、クエリを将来受け取るとき、結果決定のために解析コードを呼び出す必要なしに結果が結果ストアからアクセスされ得るように、結果ストア内にキャッシュされる。クエリの結果が返される。
【００１０】
他の実施形態では、バイナリコードおよびコード解析ルールを受け取る。少なくとも１つのコード解析ルールは、バイナリコードの機能性に関連するクエリを示すものである。クエリは、クエリの結果を決定するように構成された解析コードで実装される。クエリのキャッシュされた結果が結果ストア内にキャッシュされていることを決定される。キャッシュされた結果は、クエリの結果を決定するために使用された解析コードの呼出しに続いて、結果ストア内にキャッシュされている。結果が有効であることを決定される。キャッシュされた結果が、解析コードのさらなる呼出しを回避するために取り出される。クエリのキャッシュされた結果が返される。
【００１１】
この要約は、以下の詳細な説明でさらに述べられる選択された概念を簡略化された形で述べるために提供されている。この要約は、特許請求された主題の主な特徴または本質的な特徴を識別するものではなく、また特許請求された主題の範囲を決定する助けとして使用されないことを意図する。
【００１２】
本発明の追加の特徴および利点は、以下の説明で述べられ、また一部は説明から明らかになり、あるいは本発明を実施することによって知ることができる。本発明の諸特徴および利点は、添付の特許請求の範囲中に具体的に指摘された手段および組合せによって実現し得ることができる。本発明のこれらおよび他の特徴は、以下の説明および添付の特許請求の範囲からより完全に明らかになり、または以下で述べられるように本発明を実施することによって知ることができる。
【００１３】
本発明の上記他の利点および特徴を得ることができる方式について述べるために、上記で簡潔に述べられた本発明のより具体的な説明が、添付の図面に示されたその具体的な実施形態に言及することによって示される。これらの図面が本発明の一般的な実施形態を示すものにすぎず、したがってその範囲を制限するものと見なすべきでないという理解のもと、本発明について、添付の図面を使用してさらに具体的にかつ詳細に述べ説明する。
【発明を実施するための最良の形態】
【００１４】
本発明は、バイナリコードを解析するための方法、システムおよびコンピュータプログラム製品に及ぶ。一部の実施形態では、バイナリコードおよびコード解析ルールを受け取る。少なくとも１つのコード解析ルールは、バイナリコードの機能性に関連するクエリを示す。クエリは、クエリの結果を決定するように構成された解析コードで実施される。クエリについての有効な結果が結果ストアにキャッシュされていないことを決定される。それに応答して、解析コードが、クエリの結果を決定するために呼び出される。結果は、クエリが将来受け取られるとき、結果決定のために解析コードを呼び出す必要なしに結果が結果ストアからアクセスされ得るように、結果ストア内にキャッシュされる。クエリの結果が返される。
【００１５】
他の実施形態では、バイナリコードおよびコード解析ルールを受け取る。少なくとも１つのコード解析ルールは、バイナリコードの機能性に関連するクエリを示す。クエリは、クエリの結果を決定するように構成された解析コードで実施される。クエリのキャッシュされた結果が結果ストア内にキャッシュされていることを決定される。キャッシュされた結果は、クエリの結果を決定するために使用された解析コードの呼出しに続いて結果ストア内にキャッシュされている。結果が有効であることを決定される。キャッシュされた結果が、解析コードのさらなる呼出しを回避するために取り出される。クエリのキャッシュされた結果が返される。
【００１６】
本発明の実施形態は、以下でより詳細に論じられるように、コンピュータハードウェアを含めて特別目的または汎用コンピュータを含んでもよい。本発明の範囲内の実施形態は、その上に格納されたコンピュータ実行可能命令またはデータ構造体を搬送または含むコンピュータ読取り可能媒体をも含む。こうしたコンピュータ読取り可能媒体は、汎用または特別目的コンピュータによってアクセスすることができる任意の使用可能な媒体であり得る。限定のためではなく、例を挙げると、コンピュータ読取り可能媒体は、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、ＣＤ−ＲＯＭまたは他の光ディスク記憶装置などのコンピュータ読取り可能記憶媒体、磁気ディスク記憶装置または他の磁気記憶装置、あるいは所望のプログラムコード手段をコンピュータ実行可能命令またはデータ構造体の形で格納するために使用することができ、また汎用または特別目的コンピュータによってアクセスすることができる他の任意の媒体を含むことができる。
【００１７】
この説明および添付の特許請求の範囲では、「ネットワーク」は、コンピュータシステムおよび／またはモジュール間の電子データの移送を可能にする１または複数のデータリンクとして定義される。情報がネットワークまたは別の通信接続（有線、無線、あるいは有線または無線の組合せ）を介してコンピュータに転送されまたは提供される場合、コンピュータは適切に、その接続をコンピュータ読取り可能媒体と見なす。したがって、限定のためではなく、例を挙げると、コンピュータ読取り可能媒体は、所望のプログラムコード手段をコンピュータ実行可能命令またはデータ構造体の形で搬送し又は格納するために使用することができ、汎用または特別目的コンピュータによってアクセスすることができるネットワークまたはデータリンクを含むことができる。
【００１８】
コンピュータ実行可能命令は、たとえば、汎用コンピュータ、特別目的コンピュータまたは特別目的の処理装置に特定の機能または機能群を実施させる命令およびデータを含む。コンピュータ実行可能命令は、たとえばバイナリ、アセンブリ言語などの中間形式の命令、さらにはソースコードであり得る。本主題は構造的特徴および／または方法論的動作に特有の言語で述べられているが、添付の請求項の範囲に定義された本主題は、述べられた特徴または上述の動作に必ずしも限定されないことを理解されたい。より正確に述べると、述べられた特徴および動作は、特許請求の範囲を実施する例示的な形として開示されている。
【００１９】
本発明は、パーソナルコンピュータ、ラップトップコンピュータ、ハンドヘルドデバイス、マルチプロセッサシステム、マイクロプロセッサベースまたはプログラマブル家電、ネットワークＰＣ、ミニコンピュータ、メインフレームコンピュータ、携帯電話、ＰＤＡ、ページャなどを含めて、多種のコンピュータシステム構成を備えたネットワークコンピューティング環境内で実施されてもよいことが当業者には理解されよう。本発明は、ネットワークを介して（有線データリンク、無線データリンク、または有線と無線データリンクの組合せによって）リンクされたローカルとリモートのコンピュータシステムの両方がタスクを実施する分散システム環境内で実施することもできる。分散システム環境では、プログラムモジュールは、ローカルとリモートの両方のメモリ記憶装置内に置かれてもよい。
【００２０】
図１は、バイナリコードの解析を容易にするコンピュータアーキテクチャ１００の一例を示している。コンピュータアーキテクチャ１００内には、コード解析モジュール１０７、解析エンジン１０９、キャッシュインターフェースモジュール１１１、結果キャッシュ１１２を含めて、様々なコンポーネントが示されている。様々なコンポーネントはそれぞれ、たとえばローカルエリアネットワーク（「ＬＡＮ：Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ」）、広域ネットワーク（「ＷＡＮ：Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ」）、さらにはインターネットなどのネットワークに接続され得る。したがって、様々なコンポーネントは、ネットワークに接続された他のコンポーネントからデータを受け取り、そこにデータを送信することができる。したがって、コンポーネントは、メッセージ関連のデータを作成し、メッセージ関連のデータ（たとえばインターネットプロトコル（「ＩＰ：Ｉｎｔｅｒｎｅｔ  Ｐｒｏｔｏｃｏｌ」）データグラム、ならびに転送制御プロトコル（「ＴＣＰ：Ｔｒａｎｓｍｉｓｓｉｏｎ  Ｃｏｎｔｒｏｌ  Ｐｒｏｔｏｃｏｌ」）、ハイパーテキスト転送プロトコル（「ＨＴＴＰ：Ｈｙｐｅｒｔｅｘｔ  Ｔｒａｎｓｆｅｒ  Ｐｒｏｔｏｃｏｌ」）、簡易メール転送プロトコル（「ＳＭＴＰ：Ｓｉｍｐｌｅ  Ｍａｉｌ  Ｔｒａｎｓｆｅｒ  Ｐｒｏｔｏｃｏｌ」）など、ＩＰデータグラムを使用する他の高位層プロトコル）をネットワークを介して交換することができる。示されたコンポーネントは、同じコンピュータシステム上にあっても、複数の異なるコンピュータシステム間で分散されてもよい。
【００２１】
一般に、コード解析モジュール１０７は、解析ルールに従ってバイナリコード（たとえばコンパイルされたソースコード）を解析するように構成される。たとえば、コード解析モジュール１０７は、例外のクロージャまたは関数によって返され得る結果コードを計算し、呼出し箇所（ｃａｌｌ  ｓｉｔｅ）がメモリ割当てを恐らく返すことができるかどうか計算し、関数の呼び出しグラフを計算し、変数およびパラメータの制約を計算し、値がＮＵＬＬであり得るか、それともＮＵＬＬであり得ないかどうか、（たとえばマネージドコードの）集約セキュリティ許可を判断するために、バイナリコードを解析することができる。
【００２２】
解析エンジン１０９は、たとえばバイナリコード解析を要求する別のモジュールから、バイナリコードおよび対応する解析ルールを受け取ることができる。解析ルールには、バイナリコードの機能性に関連する１または複数のコードクエリが含まれ得る。受け取ったコードクエリをバイナリコードに対して実施するために、解析エンジンは、受け取ったコードクエリの結果を生成するように設計された解析コードを実行することができる。
【００２３】
解析コードは、コード解析モジュール１０７に含まれる内部解析コードであり得る。あるいは、解析コードは、コード解析モジュール１０７からアクセス可能であり、またそれによってロードされ得る外部解析コードであり得る。たとえば、一部の実施形態では、プラグインシステムが、様々な解析および推論タスクを実施することに専用であるプラグインを編成し、記述し、管理する。解析コード（内部と外部の両方）は、特定のプログラムに対して実行するように構成され得る。
【００２４】
受け取ったコードクエリを実施する解析コードを実行する前に、解析エンジン１０９は、キャッシュインターフェースモジュール１１１にキャッシュクエリを提出することができる。キャッシュクエリは、受け取ったコードクエリコードについての有効な結果が結果キャッシュ１１２内にキャッシュされているかどうか判断するために、キャッシュインターフェースモジュール１１１が結果キャッシュ１１２をチェックすることを要求することができる。有効な結果が結果キャッシュ１１２内にキャッシュされている場合は、キャッシュインターフェースモジュール１１１は、キャッシュされた結果を、たとえばコード解析を要求した他のモジュールに返すことができる。したがって、（潜在的にリソース集約的な）解析コードの呼出しが回避される。
【００２５】
有効な結果が結果キャッシュ１１２内にキャッシュされていない場合は、解析エンジン１０９は、受け取ったコードクエリの結果を生成するために解析コードを実行することができる。生成された結果は、キャッシュインターフェースモジュール１１１に送信することができる。キャッシュインターフェースモジュール１１１は、（潜在的にリソース集約的な）解析コードを呼び出す必要なしに、生成された結果が同じコードクエリの後続のインスタンスに提供され得るように、生成された結果を結果キャッシュ１１２内にキャッシュすることができる。
【００２６】
キャッシュインターフェースモジュール１１１は、以前に解析されたバイナリコードへの後の修正に基づいてキャッシュ済みの結果を無効にするための機構を含むことができる。たとえば、キャッシュインターフェースモジュールは、バイト数およびバイナリコードの日付／タイムスタンプの検証のためのヒューリスティックを含むことができる。指定されたバイナリコードについての生成された結果がキャッシュされる場合は、キャッシュインターフェースモジュール１１１は、指定されたバイナリコードのバイト数および日付／タイムスタンプを計算し、バイト数および日付／タイムスタンプを結果と共に結果キャッシュ１１２内にキャッシュすることができる。キャッシュされた結果についての後のキャッシュクエリ（解析エンジン１０９上でコードクエリの受信によって引き起こされる）に応答して、キャッシュインターフェースモジュール１１１は、指定されたバイナリコードのバイト数および日付／タイムスタンプを再計算することができる。
【００２７】
キャッシュインターフェースモジュール１１１は、キャッシュされたバイト数およびキャッシュされた日付／タイムスタンプをそれぞれ、再計算されたバイト数および再計算された日付／タイム活動的にスタンプと比較することができる。キャッシュされたバイト数および再計算されたバイト数が一致し（たとえば同じであり）、キャッシュされた日付／タイムスタンプと再計算された日付／タイムスタンプが対応する（たとえば同じである）場合は、キャッシュされた結果は有効であることを決定され、キャッシュされた結果が、コードクエリの結果として返される。その一方で、キャッシュされたバイト数および再計算されたバイト数が一致せず（たとえば同じでなく）、かつ／またはキャッシュされた日付／タイムスタンプと再計算された日付／タイムスタンプが一致しない（たとえば同じでない）場合は、キャッシュされた結果は無効にされ、結果キャッシュ１１２からクリアされる。
【００２８】
キャッシュ結果は、依存関係の解析によって、（単一バイナリにまでも減少した）より小さい粒度で無効にすることもできる。
【００２９】
一部の実施形態では、無効の結果は、結果が無効にされた後のある時間量の間、結果キャッシュ１１２内に保持される。したがって、指定された時間間隔で、または何らかのイベントに応答して、無効にされた結果が、結果キャッシュ１１２から削除され得る。
【００３０】
図２は、バイナリコードを解析するための例示的な方法２００のフローチャートを示している。方法２００について、コンピュータアーキテクチャ１００内のコンポーネントおよびデータに関して述べる。
【００３１】
方法２００は、バイナリコードを受け取る動作（動作２０１）を含む。たとえば、解析エンジン１０９は、バイナリコード１０１を受け取ることができる。バイナリコード１０１は、バイナリコード１０１の意図された機能性を実施しようと試みるように共に動作する、たとえばプロシージャ１０１Ａ、１０１Ｂおよび１０１Ｃなど、複数のプロシージャを含むことができる。たとえば、プロシージャ１０１Ａは、プロシージャ１０１Ｂを呼び出すことができ、プロシージャ１０１Ｂは次に、プロシージャ１０１Ｃなどを呼び出すことができるなどである。したがって、それぞれの呼出しプロシージャの適切な動作は、そのコールツリーのリーフプロシージャへの一連の呼出し内の他の各プロシージャの適切な動作に依存する。たとえば、プロシージャ１０１Ｃ（被呼出しプロシージャ）の不適切な動作によって、プロシージャ１０１Ａ（呼出しプロシージャ）の対応する不適切な動作が引き起こされ得る。
【００３２】
バイナリコードは、コンピュータシステム上で実行することができる任意のコードを事実上含む。たとえば、バイナリコードは、コンピュータシステム上でプロセッサによって実行するためにコンパイルされたＣ＋＋、Ｃ＃、Ｖｉｓｕａｌ  Ｂａｓｉｃなど、コンピュータ言語のコンパイルされたソースコード命令を含む。バイナリコードは、ハードウェアプロセッサによって実行される前に仮想マシンによって実行するためにさらにコンパイルされる中間言語命令をも含む。
【００３３】
方法２００は、バイナリコードの機能性に関連するクエリを含むコード解析ルールを受け取る動作（動作２０２）を含む。たとえば、解析エンジン１０９は、解析ルール１０２を受け取ることができる。解析ルールは、たとえばセキュリティ設定、設計ガイドラインとの適合性など、バイナリコードの様々な異なる特性をチェックするためのルール、ならびにバイナリコードの機能性に関連するクエリを示すルールを含むことができる。
【００３４】
たとえば、解析ルール１０２は、バイナリコード１０１の機能性に関連するクエリを示すコードクエリ１０３を含む。コード質問は、プラグイン１０４Ａ、１０４Ｂおよび１０４Ｃにそれぞれ含まれる、たとえば解析コード１０６Ａ、１０６Ｂおよび１０６Ｃなど、コード解析モジュール１０７に外部的にアクセス可能な解析コードを実行することによって実施することができる。たとえば、コードクエリ１０３は、プラグインの１０４Ａからの解析コード１０６Ａを実行することによって実施することができる。あるいは、コードクエリは、コード解析モジュール１０７に含まれる解析コードを実行することによって実施することができる。たとえば、コードクエリ１０３は、解析コード１０８を実行することによって実施することができる。
【００３５】
方法２００は、クエリの結果が存在するかどうか判断するステップ（判断ブロック２０３）を含む。たとえば、バイナリコード１０１および解析ルール１０２の受信に応答して、解析エンジン１０９は、キャッシュインターフェースモジュール１１１にキャッシュクエリ１３１を提出することができる。キャッシュクエリ１３１に応答して、キャッシュインターフェースモジュール１１１は、バイナリコード１０１のコードクエリ１０３のキャッシュされた結果が結果キャッシュ１１２内にキャッシュされているかどうか、あるいはバイナリコード１０１のコードクエリ１０３のキャッシュされた結果が結果キャッシュ１１２内にキャッシュされていなかどうか判断することができる。
【００３６】
解析コード（たとえば解析コード１０６Ａまたは解析コード１０８）の前の呼出しの結果として、バイナリコード１０１のコードクエリ１０３について生成された結果は、結果キャッシュ１１２内にキャッシュされたかもしれない。したがって、方法２００は、クエリのキャッシュされた結果が結果ストア内にキャッシュされていることを決定する動作を含むことができる。たとえば、キャッシュインターフェースモジュール１１１は、結果１２３が、バイナリコード１０１のコードクエリ１０３のキャッシュされた結果であると判断することができる。クエリのキャッシュされた結果が存在する（判定ブロック２０３のＹＥＳ）場合は、方法２００は、判断ブロック２０４に進む。
【００３７】
もう一方で、解析コードの前の呼出しによって、バイナリコード１０１のコードクエリ１０３の結果が生成されていないかもしれない。たとえば、解析コード１０６Ａまたは解析コード１０８は、バイナリコード１１１のためにかつて呼び出されたことがないかもしれない。あるいは、何らかの理由により、解析コード１０６Ａまたは解析コード１０８の呼出しからの結果は、もはや結果キャッシュ１１２内にキャッシュされていないかもしれない。たとえば、以前に格納された結果は、結果キャッシュ１１２からフラッシュされているかもしれない。
【００３８】
したがって、方法２００は、クエリのキャッシュされた結果が結果ストア内にキャッシュされていないことを決定する動作を含むことができる。たとえば、キャッシュインターフェースモジュール１１１は、バイナリコード１１１に対して（コードクエリ１０３を実施するために）解析コード１０６Ａを呼び出すことからの結果が結果キャッシュ１１２内にキャッシュされていないと判断することができる。クエリのキャッシュされた結果が存在しない場合は（判断ブロック２０３のＮＯ）、方法２００は、動作２０５に進む。
【００３９】
方法２００は、クエリの結果が有効かどうかの判断（判断ブロック２０４）を含む。たとえば、（バイナリコード１０１のコードクエリ１０３の）結果１２３を検出することに応答して、キャッシュインターフェースモジュール１１１は、結果１２３が有効かどうかを決定することができる。キャッシュインターフェースモジュール１１１は、バイナリコード１０１を現在表しているデータ（たとえば現在のタイムスタンプおよび現在のチェックサム）を、結果１２３がキャッシュされたときのバイナリコード１０１を表すデータ（たとえばタイムスタンプ１２４およびチェックサム１２６）と比較することができる。
【００４０】
比較の結果、キャッシュインターフェースモジュール１１１は、現在のタイムスタンプおよび現在のチェックサムが、それぞれタイムスタンプ１２４およびチェックサム１２６に対応することを決定することがある。したがって、方法２００は、キャッシュされた結果が有効であることを決定する動作を含むことができる。たとえば、キャッシュインターフェースモジュール１１１は、結果１２３が有効であることを決定することができる。クエリのキャッシュされた結果が有効である場合は（判定ブロック２０４のＹＥＳ）、方法２００は、動作２０６に進む。
【００４１】
方法２００は、結果を取り出す動作（動作２０６）を含む。たとえば、キャッシュインターフェースモジュール１１１は、結果キャッシュ１１２から結果１２３を取り出すことができる。
【００４２】
もう一方では、比較の結果、キャッシュインターフェースモジュール１１１は、現在のタイムスタンプおよび／または現在のチェックサムが、それぞれタイムスタンプ１２４および／またはチェックサム１２６に一致しないことを決定するかもしれない。したがって、方法２００は、キャッシュされた結果が有効でないことを決定する動作を含むことができる。たとえば、キャッシュインターフェースモジュール１１１は、結果１２３が有効でないことを決定することができる。クエリのキャッシュされた結果が有効でない場合は（判断ブロック２０４のＮＯ）、方法２００は、動作２０５に進む。
【００４３】
方法２００は、クエリの結果を生成するために解析コードを呼び出す動作を含む（動作２０５）。たとえば、解析エンジン１０９は、コードクエリ１０３の結果１１３を生成するために、バイナリコード１０１に対する解析コード１０６Ａを呼び出すことができる。解析コード１０６Ａは、例外のクロージャ、または返され得る結果コードを計算し、プロシージャ１０１Ａ、１０１Ｂおよび１０１Ｃのいずれかがメモリ割当てを恐らく返し得るかどうか計算し、プロシージャ１０１Ａ、１０１Ｂおよび１０１Ｃのいずれかの呼び出しグラフを計算し、プロシージャ１０１Ａ、１０１Ｂおよび１０１Ｃのいずれかの変数およびパラメータプロシージャの制約を計算し、プロシージャ１０１Ａ、１０１Ｂおよび１０１Ｃのいずれかについて値がＮＵＬＬであり得るか、それともＮＵＬＬであり得ないか、バイナリコード１０１の集約セキュリティ許可を判断するなどのためのコードを含むことができる。
【００４４】
方法２００は、結果をキャッシュする動作を含む（動作２０７）。たとえば、解析エンジン１０９は、キャッシュインターフェースモジュール１１１に結果１１３を送信することができる。キャッシュインターフェースモジュール１１１は、結果キャッシュ１１２に結果１１３をキャッシュすることができる。一部の実施形態では、解析コード（たとえば解析コード１０６Ａ）は、解析エンジン１０９および／またはキャッシュインターフェースモジュール１１１に、その結果がキャッシュに適していると示すことができる。たとえば、解析コードが頻繁に繰り返される解析を実施するように構成される場合、解析コードは、その結果がキャッシュに適していることの表示を含むことができる。他の実施形態では、解析エンジン１０９および／またはキャッシュインターフェースモジュール１１１は、解析結果がキャッシュされるべきであることを決定するために実行される追加の論理を含む。
【００４５】
解析エンジン１０９またはキャッシュインターフェースモジュール１１１は、生成された結果についても、タイムスタンプおよびチェックサムを生成する。たとえば、解析エンジン１０９は、結果１１３のタイムスタンプおよびチェックサムを生成し、タイムスタンプおよびチェックサム（たとえばタイムスタンプ１１４およびチェックサム１１６）を結果１１３と共にキャッシュインターフェースモジュール１１１に送信することができる。あるいは、キャッシュインターフェースモジュール１１１は、結果１１３のタイムスタンプおよびチェックサム（たとえばタイムスタンプ１１４およびチェックサム１１６）を生成することができる。キャッシュインターフェースモジュール１１１は、（受け取ったか、それとも生成されたかに拘らず）タイムスタンプおよびチェックサムを、キャッシュされた結果と共にキャッシュすることができる。たとえば、キャッシュインターフェースモジュール１１１は、タイムスタンプ１１４およびチェックサム１１６を結果１１３と共にキャッシュすることができる。
【００４６】
方法２００は、結果を返す動作（動作２０８）をも含む。一部の実施形態では、キャッシュインターフェースモジュール１１１は、結果を返す。たとえば、キャッシュクエリ１３１に応答して、キャッシュインターフェースモジュール１１１は、応答１３２に結果１２３を含めることができ、解析エンジン１０９に応答１２３を返すことができる。あるいは、または応答１３２と同時に、キャッシュインターフェースモジュール１１１は、結果１２３（たとえば表示装置に）を出力することができる。
【００４７】
他の実施形態では、解析エンジン１０９は、結果を返す。たとえば、結果１１３生成の後に、解析エンジン１０９は、（たとえば表示装置に）結果１１３を出力することができる。あるいは、応答の受信１３２に応答して、解析エンジン１０９は、（たとえば表示装置に）結果１２３を出力することができる。
【００４８】
本発明の実施形態は、ターゲットのプロシージャに対して解析質問への回答を要求するためのシステムおよびアプリケーションプログラムインターフェース（「ＡＰＩ：Ａｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍ  Ｉｎｔｅｒｆａｃｅ」）を含むことができる。ＡＰＩは、解析結果が既に存在しており、有効であるかどうか判断するために、永続型の結果ストアにクエリすることができる。結果が存在せず、または既存の結果が有効でない場合は、このシステムは、オンザフライで関連の解析コードを呼び出し、生成された結果を記録し、呼出し側に返す。
【００４９】
一部の実施形態では、毎回実行される解析と、高級な解析質問に対する回答を計算しまたは推論することに関連する解析との間で区別がなされる。毎回実行される解析の結果は、反復解析の結果のアクセスがより効率的となるように、キャッシュすることができる。
【００５０】
したがって、本発明の実施形態は、解析と解析されたコードとの間の形式的な関係を確立する。形式的関係は、予想された１組のコード変更に対して、チェックイン前に開発者のコンピュータシステム上でより強力なコード解析を行うことを容易にし、解析時間コストを減少させる。本発明の実施形態は、コードの一部が静的なコードのより大きな本体に対して変化する環境において特に有用であり得る。たとえば、実施形態は、性能を損なわずに重要な解析値を提供するローカルシステムへの集中した結果キャッシュを構築するために使用することができる。
【００５１】
本発明は、その精神または本質的な特徴から逸脱せずに、他の特定の形で実施されてもよい。述べられた諸実施形態は、あらゆる点において、限定的ではなく、例示的なものにすぎないと見なすべきである。したがって、本発明の範囲は、上記説明ではなく、添付の特許請求の範囲で示される。特許請求の範囲の均等物の意味および範囲に含まれるすべての変更は、その範囲に包含されるものである。
【図面の簡単な説明】
【００５２】
【図１】バイナリコードの解析を容易にする例示的なコンピュータアーキテクチャを示す。
【図２】バイナリコードを解析するための例示的な方法のフローチャートを示す。
【図１】
2009524875.tif 000003
【図２】
2009524875.tif 000004
【国際調査報告】
2009524875.tif 000005
2009524875.tif 000006