(57)【特許請求の範囲】
【請求項１】
コードベースについての関数コールグラフを生成するコンピュータベースの方法であって、
プロセッサにより、関数シグネチャを使用して前記コードベースにおける関数を識別すること（１００１）と、
前記関数コールグラフにおいて第１のノードとして特定の識別された関数を表わすこと（１０７０）と、
前記特定の関数について、当該特定の関数の関数シグネチャに基づいて、前記特定の関数に関連付けられる呼出先関数と、呼出元関数と、継承親と、継承子と、ベースクラスとを識別すること（１２００）と、
識別された前記呼出先関数および前記呼出元関数に基づいて、前記第１のノードに第１の子ノード（１０２０）を追加すること（１０９０）と、
前記特定の関数におけるベースクラスメソッドへのインターフェイスコール（１０１０）について、前記ベースクラスメソッドのオーバライドのインプリメンテーションに基づいて、前記第１のノードに第２の子ノードを追加することと、
前記第１のノードの各子ノード（１０２０）について、親子関係についてのバイナリファイルフィルタを生成すること（１０４０）とを含み、前記バイナリファイルフィルタは、前記特定の関数と子ノードによって表わされる関数とを含むバイナリファイルに基づく、方法。
【請求項２】
前記バイナリファイルフィルタは、前記特定の関数と、ブルームフィルタを通過するファイルとして前記子ノードによって表わされる前記関数とを含むバイナリファイルを示すように構成されるブルームフィルタである、請求項１に記載の方法。
【請求項３】
前記関数コールグラフのメモリフットプリントを低減すること（１０８０）をさらに含み、
前記メモリフットプリントを低減することは、関数シグネチャにハッシュ関数を適用することと、前記関数シグネチャを表すものとして前記ハッシュ関数の結果を格納することとを含む、請求項１または２に記載の方法。
【請求項４】
バイナリファイルが２つの関数を含むかどうか判定する方法であって、
関数コールグラフにおいて、開始関数に関連付けられる開始ノード（１１７０）を表わす情報を受け取ることと、
関数コールグラフにおいて、終了関数に関連付けられる終了ノード（１１８０）を表わす情報を受け取ることと、
前記開始ノードおよび前記終了ノードの少なくとも１つに関連付けられるバイナリファイルを第１のブルームフィルタ（１１１０，１１４０）でテストすることとを含み、前記テストすることは、前記バイナリファイルが前記開始関数および前記終了関数を含むかどうか判定する（１１３０，１１２０）ために、前記バイナリファイルに前記第１のブルームフィルタを適用することを含む、方法。
【請求項５】
前記特定の関数と、前記子ノードによって表わされる前記関数とを含むバイナリファイルの数に基づいて、前記ブルームフィルタのサイズを変更することをさらに含む、請求項２に記載の方法。
【請求項６】
バイナリフィルタを生成することは、前記コードベースのバイナリファイルに基づいてブルームフィルタを生成することを含み、前記方法はさらに、
生成された前記ブルームフィルタを前記第１のノードに追加することを含む、請求項１に記載の方法。
【請求項７】
少なくとも１つの追加された第２の子ノードについて、オーバライドの特定の追加されたインプリメンテーションを含む第１のソースコードファイルおよび前記特定の関数を含む第２のソースコードファイルが少なくとも１つの共通のバイナリファイルを共有するかどうかを、前記第１のソースコードファイルを使用してコンパイルされたバイナリファイルに前記第１のノードの前記ブルームフィルタを適用することにより判定することと、
前記第１および第２のソースコードファイルが共通のバイナリファイルを共有していないという判定に応答して、追加された前記第２の子ノードを前記第１のノードから除去することとをさらに含む、請求項６に記載の方法。
【請求項８】
前記ブルームフィルタのサイズは、頻繁に使用されるソースコードファイルがより大きなサイズのブルームフィルタに関連付けられるように、どれだけ多くの前記コードベースのバイナリファイルが前記第２のソースコードファイルを使用して、コンパイルまたは生成されるかによって決定される、請求項７に記載の方法。
【請求項９】
コードベースにおいて２つの関数の間の可能性の高いコールパスを判定する方法であって、
ソース関数およびデスティネーション関数を入力として受け取ることと、
関数コールグラフにおいて、前記ソース関数に関連付けられる開始ノード（３００１）と、前記デスティネーション関数に関連付けられる終了ノード（３０１０）とを識別することと、
前記関数コールグラフにおいて前記開始ノードと前記終了ノードとの間で可能なパスを探索すること（３０５０）とを含み、前記探索することは、前記グラフのあるレベルでの各ノードについて、
前記開始ノードおよび前記終了ノードによって共有される共通の従属性のリストに対して前記ノードを評価すること（３０８０）と、
前記共通の従属性のリストに含まれる従属性を有する評価されたノードについて、当該評価されたノードを可能なパスリストに含むこと（３０８０，３０９０）と、
前記共通の従属性のリストに含まれる従属性を有していない評価されたノードについて、当該評価されたノードを任意の可能なパスリストから除外すること（３０８０，３０７０）とを含み、前記方法はさらに、
前記可能なパスリストに含まれる前記ノードをランク付けすること（３１３０）と、
各ランク付けされたノードについて、ランク付けされた前記ノードが子ノードを含むかどうか判定するために、ランク付けされた前記ノードを拡張することと、
ランク付けされた前記ノードが子ノードを有するという判定に応答して、ランク付けされた前記ノードを開始ノードとして扱うとともに、ランク付けされた前記ノードの各子ノードについて、前記可能なパスを探索することを実行すること（３０６０）と、
ランク付けされた前記ノードが子ノードを有していないという判定に応答して、ランク付けされた前記ノードを含む関数コールパスを可能な関数コールパスであると識別すること（３０６０，３１４０）と、
前記開始ノードと前記終了ノードとの間で前記可能な関数コールパスをソートすること（３１５０）と、
ソートされた前記可能な関数コールパスの少なくとも１つを、可能性の高いコールパスとして返すこと（３１６０）とを含む、方法。
【請求項１０】
前記すべての可能な関数コールパスをソートすることは、
最も短いものから最も長いものへ、前記すべての可能な関数コールパスを順序付けすることと、
順序付けされた前記関数コールパスの中から、単一のコードベース内に完全に存在する関数コールパスを識別することと、
関数コールパス長さおよび重み係数に基づき、前記すべての可能な関数コールパスが最も可能性が高いものから最も可能性が低いものへと順序付けされるように、順序付けされた前記関数コールパスに重み係数を適用することとを含み、前記重み係数は、単一のコードベース内に完全に存在する関数コールパスをより可能性が高いものとして示すことを含み、前記方法はさらに、
前記重み係数を適用した後で、少なくとも最も可能性の高い関数コールパスを可能性の高いコールパスとして返すことを含む、請求項９に記載の方法。
【請求項１１】
前記重み係数を適用することは、以前の関数実行から生成される履歴トレースデータに基づいて、前記履歴トレースデータによって示される関数コールパスが、当該関数コールパスをより可能性の高いものとして示す重み係数に関連付けられるように重み係数を生成することを含む、請求項１０に記載の方法。
【請求項１２】
前記重み係数を適用することは、より可能性の高いものとして、共通して使用されるオブジェクトクラスを含むコールパスが示されるように、クラスベースの重み係数を適用することを含む、請求項１０に記載の方法。
【請求項１３】
前記可能なパスを探索することは、前記グラフ内のすべての可能なパスを探索することを含む、請求項９から１２のいずれか１項に記載の方法。
【請求項１４】
前記可能なパスを探索することは、前記開始ノードおよび終了ノードの両方から始まる双方向探索を実行することを含む、請求項９から１３のいずれか１項に記載の方法。
【請求項１５】
前記共通の従属性のリストに対して前記ノードを評価することは、前記ソース関数および前記デスティネーション関数の少なくとも１つを含むソースコードファイルからコンパイルされた少なくとも１つのバイナリファイルに、前記ノードに関連付けられるブルームフィルタを適用することを含み、
前記ノードは、前記少なくとも１つのバイナリファイルが、適用された前記ブルームフィルタを通過することに応答して、前記共通の従属性のリストに含まれる従属性を有すると評価される、請求項９から１４のいずれか１項に記載の方法。
【請求項１６】
前記ソース関数および前記デスティネーション関数の少なくとも１つがリモートプロシージャコールであるという判定に応答して、前記ブルームフィルタが、前記ソース関数および前記デスティネーション関数の少なくとも１つを含むバイナリファイルを通過させるように構成されることと、
前記ソース関数および前記デスティネーション関数の少なくとも１つがリモートプロシージャコールではないという判定に応答して、前記ブルームフィルタが、前記ソース関数および前記デスティネーション関数の両方を含むバイナリファイルを通過させるように構成されることとをさらに含む、請求項１５に記載の方法。
【請求項１７】
前記ブルームフィルタのサイズは、前記ブルームフィルタが通過するように構成されるバイナリファイルの数に基づく、請求項１５または１６に記載の方法。
【請求項１８】
各グラフエッジは関数コールパスの少なくとも一部を表しており、前記方法はさらに、過去のランタイムトレースに対して前記関数コールパスを評価することによりその後の前記ランク付けを実行することを含む、請求項９から１７のいずれか１項に記載の方法。
【請求項１９】
システムであって、
プロセッサと、
コードベースについての関数コールグラフを生成する方法を前記プロセッサに実行させるための命令が具現化されるプロセッサ読取可能メモリとを含み、前記方法は、
プロセッサにより、関数シグネチャを使用して前記コードベースにおける関数を識別すること（１００１）と、
前記関数コールグラフにおいて第１のノードとして特定の識別された関数を表わすこと（１０７０）と、
前記特定の関数について、当該特定の関数の関数シグネチャに基づいて、前記特定の関数に関連付けられる呼出先関数と、呼出元関数と、継承親と、継承子と、ベースクラスとを識別すること（１２００）と、
識別された前記呼出先関数および前記呼出元関数に基づいて、前記第１のノードに第１の子ノード（１０２０）を追加すること（１０９０）と、
前記特定の関数におけるベースクラスメソッドへのインターフェイスコール（１０１０）について、前記ベースクラスメソッドのオーバライドのインプリメンテーションに基づいて、前記第１のノードに第２の子ノードを追加することと、
前記第１のノードの各子ノード（１０２０）について、親子関係についてのバイナリファイルフィルタを生成すること（１０４０）とを含み、前記バイナリファイルフィルタは、前記特定の関数と子ノードによって表わされる関数とを含むバイナリファイルに基づく、システム。
【請求項２０】
システムであって、
プロセッサと、
コードベースにおいて２つの関数の間の可能性の高いコールパスを判定する方法を前記プロセッサに実行させるための命令が具現化されるプロセッサ読取可能メモリとを含み、前記方法は、
ソース関数およびデスティネーション関数を入力として受け取ることと、
関数コールグラフにおいて、前記ソース関数に関連付けられる開始ノード（３００１）と、前記デスティネーション関数に関連付けられる終了ノード（３０１０）とを識別することと、
前記関数コールグラフにおいて前記開始ノードと前記終了ノードとの間で可能なパスを探索すること（３０５０）とを含み、前記探索することは、前記グラフのあるレベルでの各ノードについて、
前記開始ノードおよび前記終了ノードによって共有される共通の従属性のリストに対して前記ノードを評価すること（３０８０）と、
前記共通の従属性のリストに含まれる従属性を有する評価されたノードについて、当該評価されたノードを可能なパスリストに含むこと（３０８０，３０９０）と、
前記共通の従属性のリストに含まれる従属性を有していない評価されたノードについて、当該評価されたノードを任意の可能なパスリストから除外すること（３０８０，３０７０）とを含み、前記方法はさらに、
前記可能なパスリストに含まれる前記ノードをランク付けすること（３１３０）と、
各ランク付けされたノードについて、ランク付けされた前記ノードが子ノードを含むかどうか判定するために、ランク付けされた前記ノードを拡張することと、
ランク付けされた前記ノードが子ノードを有するという判定に応答して、ランク付けされた前記ノードを開始ノードとして扱うとともに、ランク付けされた前記ノードの各子ノードについて、前記可能なパスを探索することを実行すること（３０６０）と、
ランク付けされた前記ノードが子ノードを有していないという判定に応答して、ランク付けされた前記ノードを含む関数コールパスを可能な関数コールパスであると識別すること（３０６０，３１４０）と、
前記開始ノードと前記終了ノードとの間で前記可能な関数コールパスをソートすること（３１５０）と、
ソートされた前記可能な関数コールパスの少なくとも１つを、可能性の高いコールパスとして返す（３１６０）こととを含む、システム。
【請求項２１】
コンピュータに請求項１〜請求項１８のいずれか１項に記載の方法を実行させるためのプログラム。
【発明の詳細な説明】
【背景技術】
【０００１】
背景
複雑な大規模ソフトウェアプロダクトまたはソフトウェア開発環境によって、開発またはメンテナンスを行うプログラマが未知のコードを読むことがますます必要となり得る。そのような状況において、ある関数から別の関数まで制御フローを辿ることは困難かつ時間を消費するものであり得る。
【発明の概要】
【課題を解決するための手段】
【０００２】
概要
コードベースについての関数コールグラフを生成する方法に関係する本願明細書において論じられるソリューションのいくつかの実施形態において、当該方法は、関数シグネチャによってコードベースにおいて関数を識別することと、関数コールグラフにおいて第１のノードとして特定の識別された関数を表わすことと、特定の関数について、当該特定の関数の関数シグネチャに基づいて、特定の関数に関連付けられる呼出先関数と、呼出元関数と、継承親と、継承子と、ベースクラスとを識別することと、識別された呼出先関数および呼出元関数に基づいて、第１のノードに第１の子ノードを追加することと、特定の関数におけるベースクラスメソッドへのインターフェイスコールについて、ベースクラスメソッドのオーバライドのインプリメンテーションに基づいて、第１のノードに第２の子ノードを追加することと、少なくとも１つの追加された第２の子ノードについて、オーバライドの特定の追加されたインプリメンテーションを含む第１のソースコードファイルと、特定の関数を含む第２のソースコードファイルとが少なくとも１つの共通のバイナリファイルを共有するかどうか判定することと、第１および第２のソースコードファイルが共通のバイナリファイルを共有しないという判定に応答して、追加された第２の子ノードを第１のノードから除去することとを含む。
【０００３】
いくつかの実施形態において、当該方法は、その後のランク付けのために、第１のノードと追加された第２の子ノードとの間のグラフエッジを識別することを含む。いくつかの実施形態において、上記方法は、関数コールグラフのメモリフットプリントを低減することを含む。
【０００４】
いくつかの実施形態において、メモリフットプリントを低減することは、各関数シグネチャにハッシュ関数を適用することと、関数シグネチャを表すものとしてハッシュ関数の結果を格納することとを含む。
【０００５】
いくつかの実施形態において、オーバライドの特定の追加されたインプリメンテーションを含む第１のソースコードファイルと、特定の関数を含む第２のソースコードファイルとが少なくとも１つの共通のバイナリファイルを共有するかどうか判定することは、特定の関数に関連付けられる従属性を識別することと、識別された従属性についてバイナリファイルをテストするよう第１のブルームフィルタを生成することとを含み、ブルームフィルタを生成することは、識別された従属性の数に基づいて第１の生成されたブルームフィルタのサイズを変更することを含み、上記方法はさらに、特定のバイナリファイルが特定の関数を含むかどうか判定するために、特定のバイナリファイルに第１の生成されたブルームフィルタを適用することを含む。
【０００６】
いくつかの実施形態において、オーバライドの特定の追加されたインプリメンテーションを含む第１のソースコードファイルと、特定の関数を含む第２のソースコードファイルとが少なくとも１つの共通のバイナリファイルを共有するかどうか判定することは、特定のバイナリファイルが特定の追加されたインプリメンテーションを含むかどうか判定するために、特定のバイナリファイルに第２の生成されたブルームフィルタを適用することと、特定のバイナリファイルが第１および第２の生成されたブルームフィルタの両方を通過することに応答して、第１および第２のソースコードファイルが共通のバイナリファイルとして特定のバイナリファイルを共有することを判定することとをさらに含む。
【０００７】
いくつかの実施形態において、上記方法はさらに、第２のソースコードファイルを使用してコンパイルまたは生成されるコードベースのバイナリファイルに基づいてブルームフィルタを生成することと、生成されたブルームフィルタを第１のノードに追加することとを含む。
【０００８】
いくつかの実施形態において、オーバライドの特定の追加されたインプリメンテーションを含む第１のソースコードファイルと、特定の関数を含む第２のソースコードファイルとが少なくとも１つの共通のバイナリファイルを共有するかどうか判定することは、第１のソースコードファイルに第１のノードのブルームフィルタを適用することを含む。
【０００９】
いくつかの実施形態において、ブルームフィルタのサイズは、頻繁に使用されるソースコードファイルがより大きなサイズのブルームフィルタに関連付けられるように、どれだけ多くのコードベースのバイナリファイルが第２のソースコードファイルを使用して、コンパイルまたは生成されるかによって決定される。
【００１０】
コードベースにおいて２つの関数の間の可能性の高いコールパスを判定する方法に関係する本願明細書において論じられるソリューションのいくつかの実施形態において、当該方法は、ソース関数およびデスティネーション関数を入力として受け取ることと、関数コールグラフにおいて、ソース関数に関連付けられる開始ノードと、デスティネーション関数に関連付けられる終了ノードとを識別することと、関数コールグラフにおいて開始ノードと終了ノードとの間で可能なパスを探索することとを含み、上記探索することは、探索パスに沿った各ノードについて、開始ノードおよび終了ノードによって共有される共通の従属性のリストに対してノードを評価することと、共通の従属性のリストに含まれる従属性を有する評価されたノードについて、評価されたノードを可能なパスに含むことと、関数コールグラフにおいて評価されたノードの任意の子ノードと開始ノードまたは終了ノードとの間ですべての可能なパスを探索することと、共通の従属性のリストに含まれる従属性を有していない評価されたノードについて、評価されたノードを任意の可能なパスから除外することとを含み、上記方法はさらに、上記探索および評価するステップの結果生成された、開始ノードと終了ノードとの間のすべての可能なパスをソートすることと、ソートされた可能なパスの少なくとも１つを、可能性の高いコールパスとして返すこととを含む。
【００１１】
いくつかの実施形態において、すべての可能なパスをソートすることは、最も短いものから最も長いものへ、すべての可能なパスを順序付けすることと、順序付けされたパスの中から、単一のコードベース内に完全に存在するパスを識別することと、パス長さおよび重み係数に基づき、すべての可能なパスが最も可能性が高いものから最も可能性が低いものへと順序付けされるように、順序付けされたパスに重み係数を適用することとを含み、重み係数は、単一のコードベース内に完全に存在するパスをより可能性が高いものとして示すことを含み、さらに、重み係数を適用した後で、少なくとも最も可能性の高いパスを可能性の高いコールパスとして返すことを含む。
【００１２】
いくつかの実施形態において、重み係数を適用することは、以前の関数実行から生成された履歴トレースデータに基づいて、履歴トレースデータによって示される関数コールパスが、当該パスがより可能性の高いことを示す重み係数に関連付けられるように、重み係数を生成することを含む。
【００１３】
いくつかの実施形態において、重み係数を適用することは、より可能性の高いものとして、共通して使用されるオブジェクトクラスを含むコールパスが示されるように、クラスベースの重み係数を適用することを含む。
【００１４】
いくつかの実施形態において、可能なパスを探索することはすべての可能なパスを探索することを含む。いくつかの実施形態において、可能なパスを探索することは、開始ノードおよび終了ノードの両方から始まる双方向探索を実行することを含む。
【００１５】
コードベースについて関数コールグラフを表わすデータ構造に関係する本願明細書において論じられるソリューションのいくつかの実施形態において、グラフは、各々がコードベース内におけるコール可能な関数を表わす複数のグラフノードを含み、当該複数のうちの第１のグラフノードは、コードベース内におけるコール可能な関数を一意に識別する関数シグネチャを含み、さらに、ファイルシステム内において、コール可能な関数を含むデータファイルの絶対位置を識別する第１のグラフノード絶対パスと、第１のグラフノードの子ノードを識別する情報とを含み、子ノードを識別する情報は、子ノードに関連付けられる子関数を識別する子関数シグネチャと子ノードに関連付けられる子ノード種類とを表したものを含み、子ノードに関連付けられる子関数シグネチャは、第１のグラフノードおよび子ノードを接続するグラフエッジを表わしており、子ノード種類は、ダイレクトコール種類およびインスタンスコール種類のうちの１つを含み、インスタンスコール種類は、子ノードが、コール可能な関数において呼び出されるベースクラスメソッドのオーバライドのインプリメンテーションを表わすということを示す。
【００１６】
いくつかの実施形態において、子ノードを識別する情報は、子ノードに関連付けられる子関数がリモートプロシージャコール関数であるかどうかを示すフラグをさらに含む。
【００１７】
いくつかの実施形態において、関数シグネチャは、ハッシュされた形態で、第１のグラフノードに含まれており、ハッシュされた形態は、媒体においてデータストレージ空間を占めることがより少ない。
【００１８】
いくつかの実施形態において、子ノードは、コードベース内において子関数を一意に識別する子関数シグネチャと、ファイルシステム内において、子関数を含むデータファイルの絶対位置を識別する子ノード絶対パスと、グラフノードの接続ノードを識別する情報とを含み、接続ノードを識別する情報は、子ノードによって表わされる子関数を呼び出す呼出元関数を識別する呼出元関数シグネチャを表すものを含み、接続ノードに関連付けられる呼出元関数シグネチャは、子ノードおよび接続ノードを接続するグラフエッジを表す。
【００１９】
いくつかの実施形態において、第１のグラフノードは子ノードの接続ノードである。
本願明細書において記載されるソリューション、技術、およびシステムの実施形態は、プロセッサと、命令が具現化されるプロセッサ読取可能メモリとを含むシステムを含み得、当該命令は、プロセッサに、上に記載されたステップもしくはオペレーションのうちのいくつかもしくはすべてを行わせるか、および／または、上に記載されたデータ構造のうち１つ以上を表すものを作成させるように構成される。
【００２０】
本願明細書において記載されるソリューション、技術、およびシステムの実施形態は、命令が具現化される一時的または一時的でないコンピュータ読取可能媒体を含み得、当該命令は、コンピュータに、上に記載されたステップのうちのいくつかもしくはすべてを行わせるか、および／または、上に記載されたデータ構造のうち１つ以上を表すものを作成させる。
【００２１】
論じられるシステムおよび方法の適用可能性のさらなる範囲は、以下に与えられる詳細な説明から明白になるであろう。しかしながら、本願明細書において開示される概念の精神および範囲内のさまざまな変更および修正がこの詳細な説明から当業者には明白であるので、詳細な説明および特定の例は、システムおよび方法の実施形態を示しているが、単に例示としてのみ与えられるということが理解されるべきである。
【００２２】
論じられるシステムおよび方法は、本願明細書において以下に与えられる詳細な説明と、単に例示として与えられるため限定的ではない添付の図面とからより完全に理解されるであろう。
【図面の簡単な説明】
【００２３】
【図１ａ】本願明細書に記載される、関数コールグラフ生成オペレーションの実施形態を表わすブロック図を示す図である。
【図１ｂ】本願明細書に記載される、共有されたバイナリ識別オペレーションの実施形態を表わすブロック図を示す図である。
【図１ｃ】本願明細書に記載される、関数コールグラフの部分の実施形態を表わすブロック図を示す図である。
【図２】本願明細書に記載される、グラフノードの実施形態を表わすブロック図を示す図である。
【図３】本願明細書に記載される、グラフ探索およびコールパス生成オペレーションの実施形態を表わすブロック図を示す図である。
【図４】本願明細書に記載される、コールパスソートまたはランク付けオペレーションの実施形態を表わすブロック図を示す図である。
【図５】本願明細書において記載される、グラフ生成およびコールパス識別オペレーションのいくつかまたはすべてを行なうように構成されるコンピューティングデバイスの実施形態を表わすブロック図を示す図である。
【発明を実施するための形態】
【００２４】
図面は、詳細な説明において、詳細に説明される。
詳細な説明
以下の詳細な説明は添付の図面を参照する。異なる図における同じ参照番号は同じまたは同様の要素を識別する。さらに、以下の詳細な説明は、論じられる概念を限定しない。その代わりに、本願明細書において論じられる概念の範囲は、添付の請求の範囲およびその均等物によって規定される。
【００２５】
複雑な大規模ソフトウェアプロダクトまたはソフトウェア開発環境によって、開発および／またはコードメンテナンスを行うプログラマは、未知のコードを読むことが必要になり得る。そのような状況において、ある関数から別の関数まで制御フローを辿ることは困難かつ時間を消費するものであり得る。コードベースにおける任意の２つの関数同士の間の１つ以上の可能性の高いパスを発見することができるコールパスファインダは、コードを理解するプロセスを簡素化するとともに、より速く容易なソフトウェア開発およびメンテナンスを可能にし得る。
【００２６】
特定のコードベースについてのコールパスファインダの実施形態は、グラフまたはツリーデータ構造を作成し、次いで、クエリ送信することにより実現され得る。いくつかの実施形態において、そのようなグラフは、グラフノードとしてコードベースの各関数を含み得、接続ノードは、当該関数から呼び出されるか、または、呼び出され得る他のすべての可能な関数および／または関数インスタンスを表す。さらに、接続ノードはさらに、特定のノードによって表わされる関数を実行または呼び出し得る関数および／または関数インスタンスである呼出元関数（call-from function）を表し得る。
【００２７】
モノリシックなコードベースでは、たとえば、１つ以上のデータベーステーブルにおいて、ソートされたキーマップとしてそのようなグラフが構築され得る。各グラフノードは、ノードによって表わされる特定の関数を識別する、関数シグネチャのような一意のシグネチャを含み得る。コードベースへの更新および変更に対応するために、そのようなグラフは、一定間隔（たとえば毎晩）で再構築および／または更新され得る。
【００２８】
オブジェクト指向技術を伴う実施形態において、入力および出力関数コールの静的解析は、関数オーバローディングまたはオーバライドといったものによって引き起こされる微妙な変更または変動を捉え得ない。いくつかの実施形態において、関数は、ベースクラスのメソッドまたは関数にインターフェイスコールを行い得る。いくつかの場合には、これがベースクラスのインスタンスへのコールであり得る。他の場合において、これは、ベースクラスメソッドのオーバロードされたインスタンスへのコールであり得る。オーバロードされた関数に対応することを意図するいくつかの実施形態において、所与のノードへの接続の数は、子ノードまたは接続ノードとしてベースクラスメソッドのオーバライドの各インプリメンテーションを含むよう拡張され得る。
【００２９】
モノリシックなコードベースについてのグラフ構築プロセスの実施形態が図１ａに示される。示される実施形態において、コードベースにおける各関数は、関数シグネチャを有し得る。これは、コードベース内において関数を一意に識別する数、ストリングまたは他の情報であり得る。いくつかの実施形態において、そのような関数シグネチャは、グラフ構築プロセスの一部として当該関数のために生成され得る。いくつかの実施形態において、コードベースまたは開発環境のためのソース管理ポリシーまたは業務は、各関数および／または各クラスが、関数シグネチャの一部またはすべてとして使用され得る一意識別子に関連付けられることを必要とし得る。
【００３０】
関数シグネチャの一例は、たとえばＪａｖａ（登録商標）のようなオブジェクト指向プログラミング言語におけるクラスシグネチャを含み得る。関数シグネチャの別の例は、特定のクラスについてソースコードファイルのディレクトリパスから作成される名称、クラスの名称、およびクラス内の関数の名称を含み得る。他の実施形態は、関数シグネチャとして使用するよう一意識別子を作成するために他の技術を利用し得る。
【００３１】
関数シグネチャは、１００１にて、生成または読み出され得、シグネチャによって識別された関数は、１０７０にてノードとしてグラフに追加され得る。いくつかの実施形態において、１０７０にてノードとしてグラフに関数を追加することは、１２００にて、呼出先（call-to）関数および呼出元関数を識別するよう、関数をパースまたはトラバースすることを含み得る。
【００３２】
呼出先関数は、追加された関数内から呼び出されるまたは呼び出され得る関数である。そのような呼出先関数は、当該追加された関数を表わすノードの子ノードまたは接続ノードとして含まれる関数シグネチャを有し得る。いくつかの実施形態において、上記追加された関数を呼び出すまたは呼び出し得る関数である呼出元関数はさらに、関数シグネチャに基づいて識別され得る。
【００３３】
いくつかの実施形態において、コードベースのすべての関数シグネチャは１つ以上のデータベーステーブルに格納され得る。いくつかの実施形態において、シグネチャは、データルックアップの容易さのためにソートされたストリングテーブルに格納され得る。いくつかの実施形態において、関数シグネチャは、特定の関数についての呼出先、呼出元、また任意の関連する継承情報にアクセスするキーを示すか、または、キーとして機能し得る。そのような実施形態において、そのようなデータベーステーブルをスキャンすることは、特定の関数について呼出先および呼出元データを提供し得る。
【００３４】
他の実施形態において、呼出元情報は、グラフ構築の間に再帰的に生成され得る。そのような実施形態では、特定のノードにおいて呼出元関数を識別することにより、当該特定のノードが呼出元関数を表わすノードについての呼出先ノードとして識別されることが可能になる。いくつかのそのような実施形態では、マスター呼出先または呼出元テーブルまたはデータ構造が、グラフ生成プロセスの一部として１つ以上のデータベーステーブルにおいて動的に作成され得る。いくつかの実施形態において、すべてのグラフノードは、幅優先探索を促進するよう呼出先値を含み得る。いくつかの実施形態において、すべてのグラフノードは、幅優先探索を促進するよう呼出元値を含み得る。
【００３５】
いくつかのオブジェクト指向の実施形態では、追加された関数は、ベースクラスメソッドへのインターフェイスコール１０１０を含み得る。ベースクラスのメソッドまたは関数へのそのようなインターフェイスコール１０１０は、いくつかの場合において、ベースクラスのインスタンスへのコールであり得る。他の場合において、そのようなインターフェイスコール１０１０は、ベースクラスメソッドのオーバロードされたインスタンスへのコールであり得る。静的解析セッティングでは、インターフェイスコール１０１０が、オーバロードされたインスタンスに対するものであるか否かを容易に判定することができないため、グラフ構築方法のいくつかの実施形態は、当該関数を表わすノードの呼出先子ノードまたは接続ノード１０２０として、ベースクラスメソッドのオーバライドの各インプリメンテーションを追加し得る。
【００３６】
いくつかの実施形態において、そのような継承拡張（inheritance expansion）によって、グラフにおけるノードおよび接続の数が管理不可能なほど大きくなる。いくつかの実施形態において、そのような継承拡張は、不可能またはそうでなければ起こりそうもない（たとえば偽陽性）グラフエッジを示唆する子ノードまたは接続ノードを追加し得る。
【００３７】
いくつかの実施形態において、関数は、任意の潜在的な子ノード１０２０と共に、コールグラフ１０９０に追加され得る。このようにして、さまざまなコールパスについて、１０５０にて、グラフが構築され得、各グラフノードはブルームフィルタのようなフィルタに関連付けられる。所与の呼出元／呼出先関数ペアについてのブルームフィルタは、１０４０にて、関数に共通のバイナリファイルに基づいて作成され得る。
【００３８】
いくつかの実施形態において、ブルームフィルタは、コードベース内においてコンパイルされるかまたはコンパイルのために示される各バイナリファイルに基づいて作成され得る。いくつかの実施形態において、そのようなブルームフィルタは、どのソースコードファイルおよびどのソースコードファイルバージョンがアプリケーションまたはプログラムの特定のバージョンになるようにコンパイルされるべきであるかを識別するバージョン管理ツールといったユーティリティに基づいて作成され得る。いくつかの実施形態において、特定のブルームフィルタの長さまたはデータサイズは、ソースコードファイルおよび／またはコンパイルされたアプリケーションもしくはプログラムを表わす特定のバイナリファイルに含まれる関数の数に基づき変動し得る。
【００３９】
いくつかの実施形態において、グラフ構築プロセスは、コードベース内の各関数を読み出し得る。いくつかのそのような実施形態では、グラフ構造プロセスは、１０６０にてすべての関数が読み出されてグラフ１０９０に追加されたことをひとたび示せば、１０８０にて、作成されたグラフのメモリフットプリントを低減するよう進み得る。メモリフットプリント低減の実施形態は、上で論じたようにハッシュされた関数シグネチャおよび可変長ブルームフィルタを使用することを含み得る。
【００４０】
いくつかの実施形態において、構築されたコールグラフは、グラフへのより速いアクセスおよびグラフのトラバースを可能にするために、フラッシュメモリのような揮発性メモリまたは高速アクセスメモリに格納され得る。いくつかのそのような実施形態では、ブルームフィルタの長さまたはデータサイズは、偽陽性結果についての所望の許容性に依存して変動され得る。いくつかの実施形態において、０．０１％の偽陽性結果を可能にするようブルームフィルタのサイズの変更することにより、データ品質とデータサイズとの間のバランスが良好になり得る。関数ベースのブルームフィルタを使用する実施形態では、そのファイルがより多くのバイナリファイルに存在する関数が、より大きなサイズブルームフィルタを取得し得る。
【００４１】
コールパスを発見する一般的なバイナリファイル識別プロセスの実施形態の一例が図１ｂに示される。ブルームフィルタのようなバイナリファイルフィルタ１１００と、グラフにおける開始ノード１１７０および終了ノード１１８０とから始めて、開始ノードおよび終了ノードに関連付けられる関数シグネチャは、フィルタ１１１０を使用して評価され得る。関数シグネチャによって識別される関数が、１１３０にて、フィルタによって表わされるバイナリファイルに含まれていると示されない場合、当該ブルームフィルタについてのフィルタリングプロセスは停止し、バイナリファイルのその後のセットについてのフィルタリングプロセスが開始され得る。
【００４２】
関数シグネチャによって識別される関数が、１１２０にて、ブルームフィルタに表わされるバイナリファイルに含まれると示される場合、子ノードまたは接続ノードとして追加されたベースクラスメソッドのオーバライドの各インプリメンテーションは、その同じフィルタ１１４０を使用して評価され得る。当該フィルタを通過したベースクラスメソッドのオーバライドの各インプリメンテーションは、１１５０において、バイナリファイルに含まれると判定され、関数コールパスにおいて可能性のあるノードとして残る。フィルタを通過しないベースクラスメソッドのオーバライドの各インプリメンテーションは、コーリング（呼出元）関数１１６０と共通してバイナリファイルを有さないと判定され、そのため、関数コールパスにおいて可能性のあるノードではない。
【００４３】
他の実施形態において、ブルームフィルタは、継承拡張に対応するために追加される子ノードまたは接続ノードを有する各グラフノード／関数シグネチャについて作成され得る。そのような実施形態において、ブルームフィルタは、どのソースコードファイルおよびどのソースコードファイルバージョンがアプリケーションまたはプログラムの特定のバージョンになるようにコンパイルされるべきであるかを識別するバージョン管理ツールといったユーティリティに基づいて作成され得る。グラフノードの関数シグネチャによって識別される関数に基づく特定のセットのバイナリファイルについてのブルームフィルタは、識別された関数が発生するバイナリファイルの各々におけるすべての関数に関する情報を含み得る。そのような実施形態では、ブルームフィルタは、１１４０にて、子ノードまたは接続ノードとして追加されたベースクラスメソッドのオーバライドの各インプリメンテーションの直接的な評価を可能にし得る。なぜならば、ブルームフィルタは、開始ノードおよび終了ノードにおいて表わされる関数を含むバイナリファイルに対して既に固有であるからである。
【００４４】
例示的な関数コールグラフまたはグラフ部分の実施形態が図１ｃに示される。示される実施形態において、更新要求関数１５００からの関数コールパスが示される。クラスクライアントにおいて呼び出される更新要求関数１５００は、クラスサーバにおいて更新要求ハンドラー関数１５１０を呼び出し得る。更新要求ハンドラー関数１５１０は、要求検証関数１５２０、要求処理関数１５３０および応答セッティング関数１５４０を呼び出し得る。クラスアクションからの要求処理関数１５３０は、それぞれクラスアクション１、クラスアクション２およびクラスアクション３における要求処理関数１５５０，１５６０，１５７０によってオーバライドされ得る。これらの接続は、いくつかの実施形態において、静的解析を通じてではなく、ランタイム分析の間に、グラフ内において解決されなければならないので破線によって示される。アクション２要求処理関数１５６０は、自身に対してコールバックする再帰的計算関数１５８０を呼び出し得る。示される実施形態において、関数の各々はグラフノードを表わす。
【００４５】
本願明細書において論じられるような関数コールグラフのノードを表わすデータ構造の実施形態が図２に示される。示される実施形態では、グラフノード２０１０は、ノードによって表わされる特定の関数を識別する関数シグネチャ２０２００を示す情報を含み得る。グラフノード２０１０はさらに、関数シグネチャ２０１９０によって識別される関数を含むソースファイルの絶対パスを示す情報を含み得る。そのような絶対パス２０１９０は、仮想または論理ファイルシステムにおけるディレクトリと、１つ以上の特定のストレージまたはストレージを備えたデバイスの特定のストレージ位置におけるデータの絶対的な物理的位置とのうちの一方または両方における特定のファイル位置に関する情報を含み得る。
【００４６】
グラフノード２０１０の実施形態はさらに、グラフノードによって識別される関数がコンパイルされるすべてのバイナリファイルに基づいたブルームフィルタ２０２１０を表わす情報を含み得る。上で論じたように、そのようなブルームフィルタは、所望または許容可能なレベルのフォールトトレランスに基づき、長さが可変であり得る。偽陽性（または偽陰性）の結果が許容されないまたは許容可能でないいくつかの実施形態では、異なるタイプのフィルタが使用され得る。
【００４７】
グラフノード２０１０の実施形態はさらに、子ノードまたは接続ノードのリストを含み得る。そのようなノードは、子ノードとしてリストされているが、グラフノードから他のノードへの接続を表わしており、親グラフノードと子グラフノードとの間での階層または特徴もしくはデータの伝達もしくは共通性を示しているわけではない。示される例示的なグラフノード２０１０は、潜在的に任意数の子ノード２０１００，２０１３０，２０１６０を含む。各子ノード２０１００，２０１３０，２０１６０は、それぞれの子ノード２０１００，２０１３０，２０１６０の関数シグネチャに従って、グラフノード２０１０において識別され得る。各関数が一意の関数シグネチャを具備しているかまたは当該一意の関数シグネチャによって識別される実施形態では、そのような関数シグネチャはさらに、各グラフノードが一意に識別されることを可能にする。
【００４８】
グラフノード２０１０において表わされる各子ノード２０１００，２０１３０，２０１６０はさらに、ノード種類２０１１０，２０１４０，２０１７０に関する情報を含み得る。いくつかの実施形態において、ノード種類は、ダイレクトコール種類およびインスタンスコール種類のうちの１つを含んでおり、インスタンスコール種類は、コール可能な関数において呼び出されるベースクラスメソッドのオーバライドのインプリメンテーションを子ノードが表わすことを示す。ダイレクト関数コールは、ブルームフィルタを通じてグラフをトラバースする必要なく、静的解析に対して可視（visible）または別の態様で利用可能であり得る。インスタンスコールはランタイム分析を必要とし得る。
【００４９】
いくつかの実施形態において、グラフノード２０１０において表わされる各子ノード２０１００，２０１３０，２０１６０はさらに、その子ノードがリモートプロシージャコール２０１２０，２０１５０，２０１８０を表わすかどうかを特定するフラグを含み得る。そのようなフラグは、コードベースの外部の関数を呼び出し得るまたはトリガし得るプロシージャまたはサブルーチンを参照する関数の識別を可能にし得る。さらに、いくつかの実施形態において、リモートプロシージャコールとしてフラグが立てられる関数は、コードベース内に呼出先関数を有し得ない。
【００５０】
関数コールグラフの実施形態がひとたび生成されると、当該グラフは、開始関数と終了関数との間の１つ以上の可能な関数コールパスを発見するよう探索され得る。コールパス探索オペレーションの実施形態は図３に示される。
【００５１】
示される実施形態では、コールグラフ探索ツールは、開始グラフノード３００１を識別する関数シグネチャと、終了グラフノード３０１０を識別する関数シグネチャとを入力として受け取り得る。いくつかの実施形態において、コールグラフ探索ツールはさらに、開始および終了ノードの共通の従属性を示すリストまたはデータベースを構築またはアクセスし得る。そのような従属性は、たとえば、従属性として特定のクラス、関数またはソースファイルを含むすべてのバイナリを含み得る。いくつかのそのような実施形態では、第１の関数から第２の関数へのコールグラフパスを判定する際に（両方の関数は特定の実行可能なものにのみ存在する）、すべての中間グラフノードも、その特定の実行可能なものにのみ存在するはずである。これは、異なる実行可能ファイルからの関数に関するグラフノードを考慮から除外することによりグラフ探索をスピードアップし得る。
【００５２】
開始ノード３００１もしくは終了ノード３０１０のいずれかにて開始するか、または、いくつかの実施形態においては、開始ノード３００１および終了ノード３０１０から双方向に開始して、すべての子ノードまたは接続ノードの幅優先パス探索が開始され得る。いくつかの実施形態において、これは、３０２０にて開始ノードまたは終了ノードのいずれかがリモートプロシージャコール（ＲＰＣ： remote procedure call）を含むかどうかまずチェックすることによって、実現され得る。モノリシックなコードベースにおいてさえ、リモートプロシージャコールは、開始ノードおよび終了ノードによって表わされる関数を含むものを超えて、バイナリファイルのセットにおける関数を参照し得るので、このチェックはいくつかの実施形態において実行され得る。
【００５３】
３０２０にて開始ノードおよび終了ノードのうちの１つがＲＰＣである実施形態では、使用されるバイナリのセットは、３０４０において、開始または終了ノードのいずれかを参照するすべてのバイナリを含み得る。開始ノードまたは終了ノードのいずれもＲＰＣではない実施形態では、使用されるバイナリのセットは、３０３０において、開始ノードおよび終了ノードの両方を参照するバイナリのみを含み得る。
【００５４】
各ノードについて、３０８０にて、そのブルームフィルタが抽出され得るとともに、３０８０にて共通の従属性の少なくとも１つがそのノードについてブルームフィルタを通過するかどうか判定するようバイナリファイルがブルームフィルタに対してテストされ得る。
【００５５】
共通の従属性を表すバイナリファイルがそのノードについてのブルームフィルタを通過しない場合、当該ノードは、３０７０にて、可能性のあるまたは可能性の高い関数コールパスの一部でないとして廃棄される。共通の従属性がそのノードについてのブルームフィルタを通過する場合、当該ノードは、３０９０にて、可能性のあるコールパスのリスティングまたはトレース（trace）に追加される。幅優先探索を使用する実施形態において、３１１０にて、そのような評価は、所与のレベルのグラフにおけるすべてのノードについて進み得るか、または、所与の時間期間内で分析され得るか、もしくは、コンピューティングリソースの特定の割り当てを有する所与のレベルのグラフにおけるすべてのノードについて進み得る。そのような実施形態において、その関連付けられるブルームフィルタにより当該グラフレベルにおける所与のノードが評価された後、３１１０にて当該レベルにおけるすべてのノードが評価されるまでか、または、いくつかの場合には、所定の量の時間が経過するか、もしくは、所定の量のコンピューティングリソースが消費されるまで、３１００にて当該レベルにおける次のノードが同様に評価され得る。
【００５６】
その後、３１３０にて、ランク付けスキームに従って、パスリストに含まれるノードは、最も可能性の高い次のノードおよび最も可能性の低い次のノードを判定するよう、ランク付けされ得る。いくつかの実施形態において、ランク付けは、ノードがダイレクト関数コールまたはオーバロード／継承された関数コールかどうかといったようなファクタに基づいて判定され得る。いくつかのそのような実施形態において、ダイレクト関数コールは、オーバロードまたは継承された関数コールより高くランク付けされ得る。いくつかの実施形態において、ある数のランク付けされたノードのみが対象であり得る。いくつかのそのような実施形態において、最も高くランク付けされた５つのノードのみが、ランク付けされたノードとして維持され得、残りのノードは、廃棄されるか、または、さらに評価されない。いくつかの実施形態において、３０１０にて終了ノードにマッチするノードは最も高くランク付けされたノードであり得る。
【００５７】
ノードが３１３０にてランク付けされた後、ランク付けされたノードは各々、最も高くランク付けされたノードから、３０５０での後の幅優先パス探索において含むべき子ノードを有しているかどうか３０６０にて判定するよう、３１２０にて拡張され得る。そのような拡張は、３０５０にてすべてのランク付けされたノードについて行なわれ得るか、または、それは所与の時間期間内に分析され得るか、もしくは、コンピューティングリソースの特定の割り当てを有するすべてのランク付けされたノードについて行なわれ得る。
【００５８】
いくつかの実施形態において、この探索および評価オペレーションは、探索パスが開始ノード３００１もしくは終了ノード３０１０で終了するまでか、または、双方向の実施形態では、探索パスが合致して３１４０にて拡張および探索されるべき子ノードもしくは接続ノードが残っていなくなるまで、継続する。可能性のある関数コールパスのリストがひとたび作成されると、最も可能性があるかもしくは最も可能性の高いと考えられる１つ以上の関数コールパスを識別するよう、３１５０にてパスのリストがソートまたはランク付けされ得る。その後、グラフ探索ツールは、３１６０にて、最も可能性のあるパスを含むコールパスのうちのいくつかまたはすべてを返し得る。
【００５９】
いくつかの実施形態において、グラフ探索ツールは、単一または分岐パスに沿って接続されるノードを表すものとして関数コールパスを示し得るグラフィカルインターフェイスを含むか、または、当該グラフィカルインターフェイスの一部であり得る。いくつかの実施形態において、継承拡張に基づいてノードを接続するグラフエッジは、識別されるか、またはそうでなければ、当該エッジを識別するよう異なって表示され得る。
【００６０】
いくつかの実施形態において、パスリストは、全体的なパス長さ（たとえばノードの数またはパスにおけるグラフエッジの数）、アプリケーションまたはプロダクトコードベース同士間でパスが交差するかどうか、パスが特定のオブジェクトまたはオブジェクトクラスから関数を呼び出すかどうか、および、頻繁な関数コール挙動を示す以前のランタイムトレースなどといったファクタを含むさまざまな基準によってソートされ得る。パスリストソーティングおよび確率判定オペレーションの実施形態が図４に示される。
【００６１】
４００１にて、図３に示されるようなグラフ探索オペレーションに基づいてコンパイルされたパスリストから開始して、ソートおよびパス確率プロセスは、４０１０にて、リストにおいて最も短いパスを識別し得る。いくつかの実施形態において、返すべきパスの数および／または最大の許可されるパス長さを管理する外部から定義または外部から制御されたセッティングによって、最も短いパスの数が判定され得る。パス長さは、パスにおけるノードの数、パスに含まれるグラフエッジの数、またはその組合せにより判定され得る。いくつかのパスにおいて、たとえば、あるノードは複数回通過され得、これにより、パスにおけるグラフエッジの数がパスにおけるノードの数より大きくなる。
【００６２】
いくつかの実施形態において、４０２０にて、パスは、当該パスが特定のプロダクトまたはアプリケーションについてのコードベース内に完全に存在しているかどうかに基づいて識別され得る。いくつかの実施形態において、パス長さと、さらに、パスが単一のプロダクトコードベース４０２０内に残っているかどうかとに基づき、プレファレンスがパスに与えられ得る。いくつかのそのような実施形態では、プロダクトまたはアプリケーションコードベース内に完全に存在するパスは、単一のプロダクトまたはアプリケーションコードベース内に完全に存在しない同じまたは同様の長さのパスよりも、より可能性があるまたはより可能性が高いものとしてソートされ得る。
【００６３】
いくつかの実施形態において、オブジェクトクラス重み係数がさらにパスに適用され得る。そのようなオブジェクトクラス重み係数は、いくつかの実施形態においては、特定のオブジェクトまたはオブジェクトクラスに関連付けられる使用頻度に基づき判定され得る。そのような実施形態では、重み係数に関連付けられる特定のオブジェクトまたはオブジェクトクラスからの関数を表すノードを含む関数コールパスには、当該ノードを含まない同じまたは同様の長さの関数コールパスよりも、より高い尤度または確率が与えられ得る。
【００６４】
いくつかの実施形態において、特定の関数コールパスの尤度または確率は、パス長さ、コードベースおよびクラス重み係数に基づいて計算される特定の確率パーセンテージに関連付けられ得る。他の実施形態では、特定の関数コールパスの尤度または確率は、特定のパーセンテージを提供することなく、他のコールパスと比較して相対的に表され得る。いくつかの実施形態において、特定の関数コールパスの尤度または確率は、コールパスリストにおける特定のコールパスのランク付け順によって示され得る。いくつかの実施形態において、４０４０にてコールパス確率を判定することは、４０１０でのパス長さ、４０２０でのコードベース内のパス長さ、および／または、４０３０でのクラス重み係数に基づき、関数コールパスを再順序付けまたは再ランク付けすることを含み得る。
【００６５】
いくつかの実施形態において、４０４０にてパス確率を判定するようパスリストにおける関数コールパスのそのような再順序付けまたは再ランク付けすることはさらに、４０５０にて、過去のランタイムトレースに対して関数コールパスを評価することを含み得る。そのようなランタイムトレースは、履歴アプリケーション挙動に基づいて頻繁および／または可能性の高いコールパスを示す履歴関数コールデータを含み得る。たとえば４０４０にて最も可能性の高いものから最も可能性の低いものまでコールパスをランク付けまたは順序付けすることにより絶対的または相対的なコールパス確率がひとたび判定されると、何らかの量の最も可能性の高いコールパス（たとえばトップランクのパス）が、パス探索ツールのユーザへの提示または（たとえばアプリケーション開発またはプロトタイピングプログラムまたはプログラムスイートのような）他の情報要求エンティティへの提示のために返されるかまたは選択され得る。
【００６６】
機能の点について上で論じたが、関数グラフ生成およびコールパス探索の特徴および特性は、１つ以上の特殊化されたプログラマブルな、および／または、特別にプログラムされたコンピューティングデバイスまたはその部分の使用により実現され得る。
【００６７】
図５は、本願明細書において記載されるようなコールグラフ生成およびコールパス探索技術を実行するように構成される例示的なコンピューティングデバイス５００を示すブロック図である。非常に基本的な構成５０１において、コンピューティングデバイス５００は典型的に、１つ以上のプロセッサ５１０およびシステムメモリ５２０を含む。プロセッサ５１０とシステムメモリ５２０との間で通信するためにメモリバス５３０が使用され得る。
【００６８】
所望の構成に依存して、プロセッサ５１０は、マイクロプロセッサ（μＰ）、マイクロコントローラ（μＣ）、デジタル信号プロセッサ（ＤＳＰ）またはその任意の組合せを含むがこれらに限定されない任意のタイプであり得る。プロセッサ５１０は、レベル１キャッシュ５１１およびレベル２キャッシュ５１２といった１つ以上のレベルのキャッシングと、プロセッサコア５１３と、レジスタ５１４とを含み得る。プロセッサコア５１３は、算術論理演算ユニット（ＡＬＵ：arithmetic logic unit）、浮動小数点ユニット（ＦＰＵ：floating point unit）、デジタル信号処理コア（ＤＳＰコア：digital signal processing core）またはその任意の組合せを含み得る。メモリコントローラ５１５がさらにプロセッサ５１０と共に使用され得、または、いくつかの実現例では、メモリコントローラ５１５はプロセッサ５１０の内部部分であり得る。
【００６９】
所望の構成に依存して、システムメモリ５２０は、（ＲＡＭのような）揮発性メモリ、（ＲＯＭ、フラッシュメモリなどのような）不揮発性メモリまたはその任意の組合せを含むがこれらに限定されない任意のタイプであり得る。システムメモリ５２０は典型的に、オペレーティングシステム５２１、１つ以上のアプリケーション５２２、およびプログラムデータ５２４を含む。アプリケーション５２２は、本願明細書において論じられるように、コールグラフ生成および／またはコールパス探索機能を含み得る。プログラムデータ５２４は、上述したように所望のオペレーションを実行するのに有用である１つ以上の依存性リストまたはオブジェクト名リスト５２５といった位置データを含む。いくつかの実施形態において、アプリケーション５２２は、全体のシステムが本願明細書において論じられるような技術の１つ以上の特定の変形例を実行するように、オペレーティングシステム５２１上でプログラムデータ５２４を用いて動作するよう構成され得る。この記載された基本構成は図５において、ライン５０１内のそれらのコンポーネントによって示される。
【００７０】
コンピューティングデバイス５００は、基本構成５０１と任意の必要とされるデバイスおよびインターフェイスとの間の通信を促進するよう、付加的な特徴または機能および付加的なインターフェイスを有し得る。たとえば、バス／インターフェイスコントローラ５４０は、ストレージインターフェイスバス５４１を介する基本構成５０１と１つ以上のデータストレージデバイス５５０との間の通信を促進するよう使用され得る。データストレージデバイス５５０は、リムーバブルストレージデバイス５５１、非リムーバブルストレージデバイス５５２、または、その組合せであり得る。リムーバブルストレージデバイスおよび非リムーバブルストレージデバイスの例は、たとえば、フレキシブルディスクドライブおよびハードディスクドライブ（ＨＤＤ）のような磁気ディスクデバイスと、コンパクトディスク（ＣＤ）ドライブまたはデジタルバーサタイルディスク（ＤＶＤ）ドライブといった光学ディスクドライブと、ソリッドステートドライブ（ＳＳＤ）と、テープドライブとを含む。例示的なコンピュータストレージ媒体は、コンピュータ読取可能命令、データ構造、プログラムモジュール、または他のデータといった情報の格納のために任意の方法または技術で実現される揮発性および不揮発性のリムーバブルおよび非リムーバブル媒体を含み得る。
【００７１】
システムメモリ５２０、リムーバブルストレージ５５１および非リムーバブルストレージ５５２は、コンピュータストレージ媒体のすべての例である。コンピュータストレージ媒体は、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、フラッシュメモリもしくは他のメモリ技術、ＣＤ−ＲＯＭ、デジタルバーサタイルディスク（ＤＶＤ）もしくは他の光学ストレージ、磁気カセット、磁気テープ、磁気ディスクストレージもしくは他の磁気ストレージデバイス、または、所望の情報を格納するために使用され得るとともにコンピューティングデバイス５００によってアクセスされ得る任意の他の媒体を含むが、これらに限定されない。任意のそのようなコンピュータストレージ媒体は、デバイス５００の一部であり得る。
【００７２】
コンピューティングデバイス５００はさらに、さまざまなインターフェイスデバイス（たとえば出力インターフェイス、周辺インターフェイスおよび通信インターフェイス）からバス／インターフェイスコントローラ５４０を介して基本構成５０１への通信を促進するためのインターフェイスバス５４２を含み得る。例示的な出力デバイス５６０は、１つ以上のＡ／Ｖポート５６３を介してディスプレイまたはスピーカのようなさまざまな外部デバイスと通信するように構成され得るグラフィック処理ユニット５６１および音声処理ユニット５６２を含む。例示的な周辺インターフェイス５７０は、入力デバイス（たとえばキーボード、マウス、ペン、音声入力デバイス、カメラ、タッチ入力デバイスなど）または他の周辺機器（たとえばプリンタ、スキャナなど）のような外部デバイスと１つ以上のＩ／Ｏポート５７３を介して通信するように構成され得るシリアルインターフェイスコントローラ５７１またはパラレルインターフェイスコントローラ５７２を含む。例示的な通信デバイス５８０は、ネットワーク通信により１つ以上の通信ポート５８２を介して１つ以上の他のコンピューティングデバイス５９０との通信を促進するように構成され得るネットワークコントローラ５８１を含む。
【００７３】
通信接続は通信媒体の一例である。通信媒体は典型的に、コンピュータ読取可能命令、データ構造、プログラムモジュール、または、搬送波もしくは他の伝送メカニズムといった変調データ信号における他のデータによって具現化され得、任意の情報送達媒体を含む。「変調データ信号」は、信号における情報をエンコードする態様でセットまたは変更されるその特性のうち１つ以上を有する信号であり得る。限定ではなく例示として、通信媒体は、有線ネットワークまたは直接的な有線接続といった有線媒体と、音波、無線周波数（ＲＦ）、赤外線（ＩＲ）および他の無線媒体のような無線媒体とを含み得る。本願明細書において使用されるコンピュータ読取可能媒体という用語は、ストレージ媒体および通信媒体の両方を含む。
【００７４】
コンピューティングデバイス５００は、携帯電話、個人用携帯情報端末（ＰＤＡ）、パーソナルメディアプレーヤーデバイス、ワイヤレスウェブウォッチデバイス、パーソナルヘッドセットデバイス、特定用途向けデバイス、または、上記の機能のいずれかを含むハイブリッドデバイスといったスモールフォームファクタポータブル（またはモバイル）電子デバイスの部分として実現され得る。コンピューティングデバイス５００はさらに、ラップトップコンピュータ構成および非ラップトップコンピュータ構成の両方を含むパーソナルコンピュータとして実現され得る。
【００７５】
いくつかの場合において、システムの局面のハードウェアインプリメンテーションとソフトウェアインプリメンテーションとの間には区別があまり存在せず、ハードウェアまたはソフトウェアの使用は、一般にコスト対効率のトレードオフを表わす設計選択である（しかし、ある文脈では、ハードウェアとソフトウェアとの間の選択は有意であり得るという点で常にではない）。本願明細書において記載されるプロセスおよび／またはシステムおよび／または他の技術が実行され得るさまざまな手段（vehicle）が存在し（たとえばハードウェア、ソフトウェアおよび／またはファームウェア）、好ましい手段は、プロセスおよび／またはシステムおよび／または他の技術が展開される文脈に応じて変化する。たとえば、実装者がスピードおよび正確さが最も重要であると決定した場合、実装者は、主としてハードウェアおよび／またはファームウェアの手段を選択し得、柔軟性が最も重要である場合、実装者は、主としてソフトウェアインプリメンテーションを選び得るか、または代替的には、実装者は、ハードウェア、ソフトウェアおよび／またはファームウェアの何らかの組合せを選択し得る。
【００７６】
上記の詳細な説明は、ブロック図、フローチャートおよび／または例の使用を介してデバイスおよび／またはプロセスのさまざまな実施形態を記載した。その限りにおいて、そのようなブロック図、フローチャートおよび／または例は１つ以上の機能および／またはオペレーションを含んでいるので、当業者であれば、そのようなブロック図、フローチャートまたは例における各機能および／またはオペレーションは、広範囲のハードウェア、ソフトウェア、ファームウェアまたはその実質的に任意の組合せによって個々におよび／または集合的に実現され得るということが理解されるであろう。一実施形態では、本願明細書において記載される主題のいくつかの部分は、特定用途向け集積回路（ＡＳＩＣ： Application Specific Integrated Circuit）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ： Field Programmable Gate Array）、デジタル信号プロセッサ（ＤＳＰ： digital signal processor）、または他の集積フォーマットを介して実現され得る。しかしながら、当業者は、本願明細書において開示される実施形態のいくつかの局面が、全体的または部分的に、１つ以上のコンピュータ上で動作する１つ以上のコンピュータプログラムとして（たとえば１つ以上のコンピュータシステム上で動作する１つ以上のプログラムとして）、１つ以上のプロセッサ上で動作する１つ以上のプログラムとして（たとえば１つ以上のマイクロプロセッサ上で動作する１つ以上のプログラムとして）、ファームウェアとして、または、その実質的に任意の組合せとして、集積回路において均等に実現され得るということと、回路を設計すること、ならびに／または、ソフトウェアおよび／もしくはファームウェアのためのコードを記述することがこの開示を考慮して当業者の技能内に存在するということとを認識するであろう。さらに、当業者は、本願明細書において記載される主題のメカニズムは、さまざまな形態のプログラムプロダクトとして配布可能であり、当該配布を実際に行なうために使用される特定タイプの信号担持媒体にかかわらず、本願明細書において記載される主題の例示的な実施形態が適用されるということを認識するであろう。信号担持媒体の例は、フロッピーディスク（登録商標）、ハードディスクドライブ、コンパクトディスク（ＣＤ）、デジタルビデオディスク（ＤＶＤ）、デジタルテープ、コンピュータメモリなどといった記録可能なタイプの媒体と、（たとえば光ファイバケーブル、導波路、有線通信リンク、無線通信リンクなどといった）デジタルおよび／またはアナログ通信媒体のような伝送タイプの媒体とを含むがこれらに限定されない。
【００７７】
当業者は、本願明細書において述べられる態様でデバイスおよび／またはプロセスを記載し、その後、そのような記載されたデバイスおよび／またはプロセスをデータ処理システムへ統合するようエンジニアリングプラクティスを使用することは当該技術において一般的であるということを認識するであろう。すなわち、本願明細書において記載されるデバイスおよび／またはプロセスの少なくとも一部は、妥当な量の実験を介してデータ処理システムへ統合され得る。当業者は、典型的なデータ処理システムは一般に、システムユニット筐体、ビデオ表示デバイス、揮発性および不揮発性メモリのようなメモリ、マイクロプロセッサおよびデジタル信号プロセッサのようなプロセッサ、オペレーティングシステム、ドライバ、グラフィカルユーザインターフェイスおよびアプリケーションプログラムのような計算エンティティ、タッチパッドもしくはスクリーンのような１つ以上のインタラクションデバイス、ならびに／または、フィードバックループおよび制御モータを含む制御システム（たとえば、フィードバックは位置および／もしくは速度を感知するためであり、制御モータはコンポーネントおよび／もしくは量を移動および／もしくは調節するためである）のうちの１つ以上を含むということを認識するであろう。典型的なデータ処理システムが、データコンピューティング／通信および／またはネットワークコンピューティング／通信システムにおいて典型的に発見されるようなコンポーネントのような任意の好適な商業的に利用可能なコンポーネントを利用して実現され得る。
【００７８】
本願明細書において実質的に任意の複数および／または単数の用語の使用に関して、当業者は、文脈および／または用途に適切であるように、複数から単数および／または単数から複数へ変更し得る。さまざまな単数／複数の順列は、明瞭さの目的のために、本願明細書において明らかに述べられ得る。
【００７９】
本開示において、本願明細書において論じられたシステムおよびソリューションの例示的な実施形態のみが示され記載される。本願明細書において論じられたシステムおよびソリューションがさまざまな他の組合せおよび環境における使用が可能であり、本願明細書において表されるような概念の範囲内での変更または修正が可能であるということが理解されるべきである。いくつかの変形例は、ハードウェア、ファームウェアおよび／またはソフトウェアの組合せで具体化され得る。いくつかの変形例が、メモリチップ、ハードドライブ、フラッシュメモリ、光学ストレージ媒体のようなコンピュータ読取可能ストレージ媒体上で少なくとも部分的に具現化され得るか、または、さまざまなハードウェアデバイスおよび／もしくはハードウェアデバイスの組合せ／集合への送信／さまざまなハードウェアデバイスおよび／もしくはハードウェアデバイスの組合せ／集合によるダウンロード／さまざまなハードウェアデバイスおよび／もしくはハードウェアデバイスの組合せ／集合上へのインストールに好適な完全または部分的にコンパイルされたプログラムとして具現化され得る。そのような変形例は、本願明細書において論じられたシステムおよびソリューションの精神および範囲からの逸脱と見なされるべきではなく、当業者にとって明白であるすべてのそのような修正例は添付の請求の範囲内に含まれるように意図される。
【図１ａ】
0006349395.tif 000002
【図１ｂ】
0006349395.tif 000003
【図１ｃ】
0006349395.tif 000004
【図２】
0006349395.tif 000005
【図３】
0006349395.tif 000006
【図４】
0006349395.tif 000007
【図５】
0006349395.tif 000008