JP7513116B2 - コールグラフ作成装置、コールグラフ作成方法及びプログラム - Google Patents
コールグラフ作成装置、コールグラフ作成方法及びプログラム Download PDFInfo
- Publication number
- JP7513116B2 JP7513116B2 JP2022568003A JP2022568003A JP7513116B2 JP 7513116 B2 JP7513116 B2 JP 7513116B2 JP 2022568003 A JP2022568003 A JP 2022568003A JP 2022568003 A JP2022568003 A JP 2022568003A JP 7513116 B2 JP7513116 B2 JP 7513116B2
- Authority
- JP
- Japan
- Prior art keywords
- function
- call graph
- class
- list
- definition
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims description 36
- 230000006870 function Effects 0.000 claims description 192
- 238000012545 processing Methods 0.000 description 18
- 238000010586 diagram Methods 0.000 description 9
- 239000008186 active pharmaceutical agent Substances 0.000 description 3
- 239000000284 extract Substances 0.000 description 3
- 238000002347 injection Methods 0.000 description 2
- 239000007924 injection Substances 0.000 description 2
- 238000013459 approach Methods 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
Images
Description
本発明は、コールグラフ作成装置、コールグラフ作成方法及びプログラムに関する。
プログラムのコールグラフとは、プログラム中の関数をノードとする有向グラフである。ある関数の処理中において別の関数が呼び出される場合、コールグラフではその呼び出し関係が、呼び出し元の関数のノードから呼び出し先の関数のノードへのエッジとして表現される。コールグラフを利用することで、プログラムの処理の流れを辿ることができるため、コールグラフはプログラムの解析手段として広く利用されている。
関数がクラスに紐付けて定義される、クラスベースのオブジェクト指向プログラミング言語は、クラスの継承と呼ばれる機能を持つ場合が多い。継承先のクラス(子クラス)は継承元のクラス(親クラス)と同じインタフェースの関数を持ち、その関数の処理を上書きすることができる。継承を機能として持つプログラミング言語によって記述されたプログラムにおいては、継承関係にあるクラスがそれぞれ同じインタフェースの関数を持つため、或る箇所における関数の呼び出しによってどのクラスで定義された関数が呼び出されるかがプログラム実行時まで決定されない場合がある。
プログラムを解析してコールグラフを作成する際に、関数間の呼び出し関係が一意に決定できない場合、クラスの継承関係を解析(CHA(Call Hierarchy Analysis))し、呼び出される可能性のある全ての関数のノードに対してエッジを作成することで、起こり得る全ての呼び出し関係を網羅したコールグラフを作成することができる。
CHAによるコールグラフの作成では、クラスの継承関係のみに従ってコールグラフが作成されるため、実際のプログラムの実行では起こり得ない呼び出し関係がグラフ中に現れる可能性がある。これはコールグラフを用いたソフトウェアの解析の精度を低下させる原因となる。
例えば、図1に示される通り、クラスAを継承したB、Cというクラスがあり、図2に示すクラスZの関数fからのコールグラフをCHAで作成する場合について考える。
図2の例では、架空のプログラミング言語が用いてられている。Z、A、Bはそれぞれクラスを定義し、f、gはそれぞれ関数を定義しており、関数の内部はJava(登録商標)と同じ構文及び意味を持つものとする。
関数fから呼び出される関数gに渡されるオブジェクトは、実際にはクラスBのインスタンスであるが、関数gはクラスA又はクラスAを継承したクラスのオブジェクトを受け取る関数であるため、CHAでは実際に渡されるオブジェクトのクラスを無視し、図3に示されるようなコールグラフが作成される。このコールグラフには実際のプログラムの実行時に起きることのないA.xやC.xの呼び出しが含まれる。
これを解決するため、RTA(Rapid Type Analysis)と呼ばれる従来技術(非特許文献1)がある。RTAでは、関数のソースコードを解析することによって関数内でインスタンス化されるクラスが記録され、或る箇所での関数呼び出しによって実際に呼び出される可能性のある関数が絞り込まれる。これによって、コールグラフを用いたソフトウェア分析の精度を向上させることができる。前述の例において、RTAによってコールグラフを作成する場合、関数f内でインスタンス化されているクラスがBであるという解析の結果を用いて図4に示されるようなコールグラフが作成される。
David F.Bacon and Peter F.Sweeney、"Fast static analysis of C++ virtual function calls"、SIGPLAN Not.31,10(Oct.1996),324-341、[online]、インターネット<URL:https://doi.org/10.1145/236338.236371>
しかしながら、RTAでは、関数呼び出しを行う関数自身や、関数呼び出しを行う関数の呼び出し元の関数においてインスタンス化されたクラスのリストを用いてコールグラフが作成されるため、クラスのインスタンス化の処理が関数の呼び出し関係の外部で行われた場合にはコールグラフを作成することができない。
或るクラスXのインスタンスを生成するために他のクラスYのインスタンスが必要となる場合、クラスXはクラスYに依存する関係にあり、これをクラス間の依存関係と呼ぶ。規模の大きなプログラムでは、クラス間の依存関係が複雑化するため、インスタンス化の処理をプログラムの処理の流れから独立して管理する、依存性の注入(DI(Dependency Injection))と呼ばれる設計パターンが利用される。DIを利用した実装では、DIで生成されたオブジェクトをDIコンテナと呼ばれるオブジェクトから取得することが一般的である。例として、前述の例をDIを利用して書き換えたソースコードを図5に示す。
図5において、DIコンテナのクラスContainerのオブジェクトcontainerは、DIによって生成されたインスタンスを保持しており、DIによるインスタンス生成は、DI機能を提供するライブラリによって関数呼び出しの流れから独立して行われる。そのため、RTAでは、関数f内でaに代入されるオブジェクトがどのクラスのインスタンスであるのかを知ることができず、コールグラフを作成することができない。
更に、DIによるインスタンス生成は、リフレクションなどのプログラミング言語の動的な機能を利用して行われる場合があり、ソースコード中でインスタンス化されているクラスを記録する従来の手法のみでこの問題を解決することはできない。
本発明は、上記の点に鑑みてなされたものであって、コールグラフの作成精度を向上させることを目的とする。
そこで上記課題を解決するため、コールグラフ作成装置は、或るプログラムが含む第1の関数の定義を解析して、前記第1の関数においてインスタンス化されるクラスの一覧と、前記第1の関数が呼び出す第2の関数の一覧とを特定する第1の特定部と、前記第2の関数ごとに、当該第2の関数の定義を含むクラスを、前記クラスの一覧から特定する第2の特定部と、前記第1の関数及び前記第2の関数のそれぞれをノードとし、前記第1の関数のノードから前記第2の関数へのノードへのエッジを含むコールグラフを作成する作成部と、を有する。
コールグラフの作成精度を向上させることができる。
本実施の形態において開示されるコールグラフ作成装置10は、Java(登録商標)等のクラスベースのオブジェクト指向プログラミング言語で実装された或るプログラム(以下、「対象プログラム」という。)を対象として解析を行い、対象プログラムのコールグラフを出力する。
DI(Dependency Injection)を利用して実装されたプログラムにおいて、クラスのインスタンス化は、プログラムの処理の流れから独立して行われる。DIを利用する場合には専用のライブラリを利用することが一般的であり、これらのライブラリにおけるクラスのインスタンス化の方法としては、プログラム中の関数の記述に従ってインスタンス化する方法、設定ファイルの記述に従ってインスタンス化する方法、クラスに付与された注釈に従ってインスタンス化する方法が用いられている。
そのために生じる、従来のコールグラフ作成技術では正確なコールグラフが作成できないという課題に対して、コールグラフ作成装置10は、コールグラフの作成前にインスタンス化されるクラスを静的に解析し、解析結果をコールグラフ作成時のクラス特定に利用することで、この課題を解決する。
以下、図面に基づいて本発明の実施の形態を説明する。図6は、本発明の実施の形態におけるコールグラフ作成装置10のハードウェア構成例を示す図である。図6のコールグラフ作成装置10は、それぞれバスBで相互に接続されているドライブ装置100、補助記憶装置102、メモリ装置103、CPU104、及びインタフェース装置105等を有する。
コールグラフ作成装置10での処理を実現するプログラムは、CD-ROM等の記録媒体101によって提供される。プログラムを記憶した記録媒体101がドライブ装置100にセットされると、プログラムが記録媒体101からドライブ装置100を介して補助記憶装置102にインストールされる。但し、プログラムのインストールは必ずしも記録媒体101より行う必要はなく、ネットワークを介して他のコンピュータよりダウンロードするようにしてもよい。補助記憶装置102は、インストールされたプログラムを格納すると共に、必要なファイルやデータ等を格納する。
メモリ装置103は、プログラムの起動指示があった場合に、補助記憶装置102からプログラムを読み出して格納する。CPU104は、メモリ装置103に格納されたプログラムに従ってコールグラフ作成装置10に係る機能を実行する。インタフェース装置105は、ネットワークに接続するためのインタフェースとして用いられる。
図7は、本発明の実施の形態におけるコールグラフ作成装置10の機能構成例を示す図である。図7において、コールグラフ作成装置10は、DI設定ファイル解析部11、DI注釈解析部12、DI定義関数解析部13及びコールグラフ作成部14を有する。これら各部は、コールグラフ作成装置10にインストールされた1以上のプログラムが、CPU104に実行させる処理により実現される。
DI設定ファイル解析部11は、DI設定ファイルを解析することで、対象プログラムの実行時にインスタンス化されるクラスの一覧を特定する。
DI注釈解析部12は、DI注釈の付与されたクラスを解析することで、対象プログラムの実行時にインスタンス化されるクラスの一覧を特定する。
DI定義関数解析部13は、DI定義関数を解析することで、対象プログラムの実行時にインスタンス化されるクラスの一覧を特定する。
コールグラフ作成部14は、DI設定ファイル解析部11、DI注釈解析部12及びDI定義関数解析部13から出力される解析結果(クラスの一覧)を用いて、コールグラフを作成する。コールグラフとは、プログラム中の関数をノードとし、関数の呼び出し関係をエッジとする有向グラフである。
以下に、各部の詳細と動作について詳細に説明する。
[DI設定ファイル解析部11]
DI設定ファイル解析部11は、対象プログラムに対するDI設定ファイルを読み込み、DI機能を持つライブラリによってインスタンス化されるクラスを解析する。DI設定ファイルは、DIに用いられるによって書式が異なるが、以下に記す情報で構成される。なお、以下の記法は、BNF記法に準拠している。
DI設定ファイル::=DI設定一覧 DI注釈探索対象クラス識別子*
DI設定一覧::=DI設定*
DI設定::=DI設定識別子 クラス識別子 プロパティ設定*
プロパティ設定::=プロパティ識別子 値|プロパティ識別子 DI設定識別子
なお、DI注釈探索対象クラス識別子は、DI機能を持つライブラリがDI注釈を用いてインスタンスを生成する際に、DI注釈の探索対象(探索範囲)とするクラス(以下、「注釈探索対象クラス」という。)を一意に識別可能な識別子(以下、「クラス識別子」という。)である。DI設定とは、DI機能を持つライブラリによってインスタンス化されるクラスのクラス識別子を含む設定である。プロパティ設定は、DI機能を持つライブラリがインスタンス生成を行う際に、インスタンスのプロパティに設定する値又はオブジェクト(DI設定識別子)を指定するための設定である。
DI設定ファイル解析部11は、対象プログラムに対するDI設定ファイルを読み込み、DI機能を持つライブラリによってインスタンス化されるクラスを解析する。DI設定ファイルは、DIに用いられるによって書式が異なるが、以下に記す情報で構成される。なお、以下の記法は、BNF記法に準拠している。
DI設定ファイル::=DI設定一覧 DI注釈探索対象クラス識別子*
DI設定一覧::=DI設定*
DI設定::=DI設定識別子 クラス識別子 プロパティ設定*
プロパティ設定::=プロパティ識別子 値|プロパティ識別子 DI設定識別子
なお、DI注釈探索対象クラス識別子は、DI機能を持つライブラリがDI注釈を用いてインスタンスを生成する際に、DI注釈の探索対象(探索範囲)とするクラス(以下、「注釈探索対象クラス」という。)を一意に識別可能な識別子(以下、「クラス識別子」という。)である。DI設定とは、DI機能を持つライブラリによってインスタンス化されるクラスのクラス識別子を含む設定である。プロパティ設定は、DI機能を持つライブラリがインスタンス生成を行う際に、インスタンスのプロパティに設定する値又はオブジェクト(DI設定識別子)を指定するための設定である。
図8は、DI設定ファイル解析部11が実行する処理手順の一例を説明するためのフローチャートである。
ステップS101において、DI設定ファイル解析部11は、対象プログラムに対するDI設定ファイルを読み込む。続いて、DI設定ファイル解析部11は、DI設定ファイルの構文解析を行うことで、DI設定ファイルからDI設定一覧を取得する(S102)。続いて、DI設定ファイル解析部11は、DI設定一覧に含まれるDI設定ごとに、当該DI設定に含まれる一組のDI設定識別子及びクラス識別子を抽出し(S103)、抽出したDI識別子及びクラス識別子を含むDI解析情報をDI解析情報一覧へ追加する(S104)。なお、DI解析情報及びDI解析情報一覧の構成は、以下の通りである。
DI解析情報::=DI設定識別子 クラス識別子
DI解析情報一覧::=DI解析情報*
続いて、DI設定ファイル解析部11は、DI解析情報一覧を出力する(S105)。
DI解析情報::=DI設定識別子 クラス識別子
DI解析情報一覧::=DI解析情報*
続いて、DI設定ファイル解析部11は、DI解析情報一覧を出力する(S105)。
[DI注釈解析部12]
DI注釈解析部12は、DI注釈の付与されたクラスを解析することで、DI機能を持つライブラリによってインスタンス化されるクラスを解析するモジュールである。DI注釈は、DIに用いられるによって書式が異なるが、一般的にはプログラミング言語の持つ注釈機能を利用して実装されており、DI注釈がクラスに付与されたクラスは、DIによるインスタンス化の対象であることを示す。DI注釈にはDI設定識別子が設定される。
DI注釈解析部12は、DI注釈の付与されたクラスを解析することで、DI機能を持つライブラリによってインスタンス化されるクラスを解析するモジュールである。DI注釈は、DIに用いられるによって書式が異なるが、一般的にはプログラミング言語の持つ注釈機能を利用して実装されており、DI注釈がクラスに付与されたクラスは、DIによるインスタンス化の対象であることを示す。DI注釈にはDI設定識別子が設定される。
図9は、DI注釈解析部12が実行する処理手順の一例を説明するためのフローチャートである。
ステップS201において、DI注釈解析部12は、DI設定ファイルを読み込む。続いて、DI注釈解析部12は、DI設定ファイルの構文解析を行うことで、DI注釈探索対象クラス識別子を取得することで、DI注釈探索対象クラス識別子に係るクラス(DI注釈探索対象クラス)を特定する(S202)。
続いて、DI注釈解析部12は、対象プログラムのソースコードを読み込み(S203)、当該ソースコードについて構文解析を行うことでクラス一覧を取得する(S204)。クラス一覧とは、対象プログラムが利用する各クラスのクラス識別子の一覧である。
続いて、DI注釈解析部12は、クラス一覧に含まれるクラス識別子に係るクラスごとに、当該クラスがいずれかのDI注釈探索対象クラスに該当するか否か(すなわち、当該クラスのクラス識別子がDI注釈探索対象クラスのクラス識別子に一致するか否か)を判定し(S205)、当該クラスがいずれかのDI注釈探索対象クラスに該当すれば(S205でYES)、当該クラスの定義からDI注釈を探索し、当該DI注釈に含まれるDI設定識別子を抽出する(S206)。DI注釈解析部12は、抽出したDI設定識別子及び当該クラスのクラス識別子を含むDI解析情報をDI解析情報一覧へ追加する(S207)。なお、当該DI解析情報一覧は、DI設定ファイル解析部11により抽出されるDI解析情報一覧とは別途生成される。
続いて、DI注釈解析部12は、DI解析情報一覧を出力する(S208)。
[DI定義関数解析部13]
DI定義関数解析部13は、DI定義関数を解析し、DI機能を持つライブラリによってインスタンス化されるクラスを解析するモジュールである。DI定義関数は、一般的にはプログラミング言語の関数定義機能を利用しており、DI定義関数であることを示す注釈を付与するか、DI機能を持つライブラリのAPIを使用することにより、関数内でインスタンス化されたオブジェクトをDIコンテナに保持させる。DI定義関数にはDI設定識別子が設定される。
DI定義関数解析部13は、DI定義関数を解析し、DI機能を持つライブラリによってインスタンス化されるクラスを解析するモジュールである。DI定義関数は、一般的にはプログラミング言語の関数定義機能を利用しており、DI定義関数であることを示す注釈を付与するか、DI機能を持つライブラリのAPIを使用することにより、関数内でインスタンス化されたオブジェクトをDIコンテナに保持させる。DI定義関数にはDI設定識別子が設定される。
図10は、DI定義関数解析部13が実行する処理手順の一例を説明するためのフローチャートである。
ステップS301において、DI定義関数解析部13は、対象プログラムのソースコードを読み込む。続いて、DI定義関数解析部13は、当該ソースコードの構文解析を行うことで、関数定義の一覧を取得する(S302)。関数定義の一覧とは、対象プログラムが利用する関数(クラスの関数(メソッド)の定義の一覧をいう。
続いて、DI定義関数解析部13は、関数定義の一覧に含まれる関数定義ごとに、DI定義関数であることを示す注釈が付与されているか、又はDI定義関数用のAPIを利用しているかを検査することで、当該関数定義に係る関数がDI定義関数であるか否かを判定し(S303)、当該関数がDI定義関数であれば(S303でYES)、当該関数定義を解析する(S304)。具体的には、DI定義関数解析部13は、当該関数定義に係る関数の戻り値を取得し、当該関数定義において戻り値のインスタンス化を行っている箇所を特定することで、戻り値のクラスのクラス識別子を当該関数定義から抽出する。すなわち、当該クラスが、DI機能を持つライブラリによってインスタンス化されるクラスとして特定される。また、DI定義関数解析部13は、当該関数定義における、DI定義関数であることを示す注釈又はDI定義関数用のAPIを解析することで、DI設定識別子を当該関数定義から抽出する。DI定義関数解析部13は、抽出したDI識別子と戻り値のクラス識別子とを含むDI解析情報をDI解析情報一覧へ追加する(S305)。
続いて、DI定義関数解析部13は、DI解析情報一覧を出力する(S306)。
[コールグラフ作成部14]
コールグラフ作成部14は、DI設定ファイル解析部11、DI注釈解析部12及びDI定義関数解析部13から出力されたDI解析情報と対象プログラムのソースコードとに基づいてコールグラフを作成するモジュールである。
コールグラフ作成部14は、DI設定ファイル解析部11、DI注釈解析部12及びDI定義関数解析部13から出力されたDI解析情報と対象プログラムのソースコードとに基づいてコールグラフを作成するモジュールである。
図11は、コールグラフ作成部14が実行する処理手順の一例を説明するためのフローチャートである。
ステップS401において、コールグラフ作成部14は、1以上のコールグラフエントリポイントの識別子(関数識別子)の入力をユーザから受け付ける。コールグラフエントリポイントは、作成するコールグラフの起点となる関数(対象プログラムのいずれかのクラスのいずれかの関数(メソッド))である。複数のコールグラフエントリポイントの関数識別子が入力されてもよい。
続いて、コールグラフ作成部14は、コールグラフエントリポイントとして入力された1以上の関数識別子を処理対象関数一覧の初期値とする(S402)。続いて、コールグラフ作成部14は、処理対象関数一覧に含まれる処理対象関数ごとに、ステップS403~405及びループ処理L2を含むループ処理L1を実行する。
ステップS403において、コールグラフ作成部14は、処理対象関数一覧から一つの処理対象関数を取り出す。以下、取り出された処理対象関数を「処理対象関数X」という。なお、取り出された処理対象関数Xは、処理対象関数一覧から削除される。
続いて、コールグラフ作成部14は、処理対象関数Xの定義(ソースコード)を解析することにより、処理対象関数X内でインスタンス化されるクラス(以下、「インスタンス化クラス」という。)のクラスの定義の一覧を抽出する(S404)。すなわち、コールグラフ作成部14は、インスタンス化クラスの一覧を特定する。
続いて、コールグラフ作成部14は、処理対象関数Xの定義を解析することにより、処理対象関数X内で呼び出される(処理対象関数Xが呼び出す)各関数(以下、「呼び出し関数」という。)の関数識別子の一覧(以下、「呼び出し関数一覧」という。)を抽出する(S405)。すなわち、コールグラフ作成部14は、呼び出し関数の一覧を特定する。
続いて、コールグラフ作成部14は、呼び出し関数一覧に含まれる関数識別子に係る関数(呼び出し関数)ごとに、ステップS406~S408を含むループ処理L2を実行する。ループ処理L2において処理対象とされている呼び出し関数を、「呼び出し関数Y」という。
ステップS406において、コールグラフ作成部14は、呼び出し関数Yの呼び出しによって実際に(対象プログラムの実行時に)呼び出されうる関数が定義されている1以上のクラスを特定する。すなわち、呼び出し関数Yと同一名の関数のうち、ステップS406において特定されたクラスで定義された関数が、処理対象関数Yから実際に呼び出される可能性が有る関数である。なお、ステップS406の詳細については後述される。
続いて、コールグラフ作成部14は、処理対象関数Xから、ステップS406において特定された各クラスの呼び出し関数Yへのエッジをコールグラフに追加する(S407)。この際、コールグラフ作成部14は、当該エッジの先側のノード(呼び出し関数Yに対応するノード)が存在しなければ、当該ノードも生成する。
続いて、コールグラフ作成部14は、呼び出し関数Yから更に呼び出される関数を再帰的に処理するため、呼び出し関数Yを処理対象関数一覧に追加する(S408)。
ループ処理L2が終了すると、コールグラフ作成部14は、新たに処理対象関数一覧に追加された呼び出し関数について、ループ処理L1を実行する。
ループ処理L1が終了すると(すなわち、処理対象関数一覧が空になると)、コールグラフ作成部14は、コールグラフを出力する(S409)。なお、複数のコールグラフエントリポイントが入力された場合、複数のコールグラフが出力される可能性が有る。
続いて、ステップS406の詳細について説明する。図12は、クラスの特定処理の処理手順の一例を説明するためのフローチャートである。
コールグラフ作成部14は、図11のステップS404において抽出した、インスタンス化クラスの一覧に含まれるクラスのそれぞれの定義から、呼び出し関数Yの定義を探索し(S501)、当該定義を含むクラスがあれば(S502でYES)、当該クラスのクラス識別子を、例えば、メモリ装置103又は補助記憶装置102に記録する(S503)。すなわち、当該クラスが、呼び出し関数Yの呼び出しによって実際に(対象プログラムの実行時に)呼び出されうる関数が定義されているクラスとして特定される。
続いて、コールグラフ作成部14は、DI解析情報一覧に含まれる各クラス識別子に係るクラスの定義の中から呼び出し関数Yの定義を探索し(S504)、当該定義を含むクラスがあれば(S505でYES)、当該クラスのクラス識別子を、例えば、メモリ装置103又は補助記憶装置102に記録する(S506)。すなわち、当該クラスが、呼び出し関数Yの呼び出しによって実際に(対象プログラムの実行時に)呼び出されうる関数が定義されているクラスとして特定される。なお、ステップS506において記録対象となるクラス識別子が、ステップS503において既に記録されている場合、当該クラス識別子はステップS506において記録されなくてよい。
上述したように、本実施の形態によれば、DI機能を有するライブラリによってリフレクションなどの動的機能を用いてインスタンス化されるクラスの情報を事前に静的に取得し、コールグラフ作成時に利用することができる。したがって、従来技術では対応不能なDIを利用して実装されたプログラムに対しても、高い精度のコールグラフを作成することが可能となる。すなわち、本実施の形態によれば、コールグラフの作成精度を向上させることができる。
なお、本実施の形態を利用して作成したコールグラフを、例えば、コールグラフを用いてライブラリの脆弱性のアプリケーションへの影響を判断する技術(例えば、「S. E. Ponta, H. Plate and A. Sabetta, "Beyond Metadata: Code-Centric and Usage-Based Analysis of Known Vulnerabilities in Open-Source Software," 2018 IEEE International Conference on Software Maintenance and Evolution (ICSME)」)に活用することで、より正確な判断を行うことが可能になる。
なお、本実施の形態において、処理対象関数Xは、第1の関数の一例である。呼び出し関数Yは、第2の関数の一例である。コールグラフ作成部14は、第1の特定部、第2の特定部及び作成部の一例である。DI設定ファイル解析部11は、第1の解析部の一例である。DI注釈解析部12は、第2の解析部の一例である。DI定義関数解析部13は、第3の解析部の一例である。
以上、本発明の実施の形態について詳述したが、本発明は斯かる特定の実施形態に限定されるものではなく、請求の範囲に記載された本発明の要旨の範囲内において、種々の変形・変更が可能である。
10 コールグラフ作成装置
11 DI設定ファイル解析部
12 DI注釈解析部
13 DI定義関数解析部
14 コールグラフ作成部
100 ドライブ装置
101 記録媒体
102 補助記憶装置
103 メモリ装置
104 CPU
105 インタフェース装置
B バス
11 DI設定ファイル解析部
12 DI注釈解析部
13 DI定義関数解析部
14 コールグラフ作成部
100 ドライブ装置
101 記録媒体
102 補助記憶装置
103 メモリ装置
104 CPU
105 インタフェース装置
B バス
Claims (6)
- 或るプログラムが含む第1の関数の定義を解析して、前記第1の関数においてインスタンス化されるクラスの一覧と、前記第1の関数が呼び出す第2の関数の一覧とを特定する第1の特定部と、
前記第2の関数ごとに、当該第2の関数の定義を含むクラスを、前記クラスの一覧から特定する第2の特定部と、
前記第1の関数及び前記第2の関数のそれぞれをノードとし、前記第1の関数のノードから前記第2の関数へのノードへのエッジを含むコールグラフを作成する作成部と、
を有することを特徴とするコールグラフ作成装置。 - DI設定ファイルを解析して、DI機能を持つライブラリによってインスタンス化されるクラスの一覧を特定する第1の解析部を有し、
前記第2の特定部は、更に、前記第2の関数ごとに、当該第2の関数の定義を含むクラスを、前記第1の解析部が特定したクラスの一覧から特定する、
ことを特徴とする請求項1記載のコールグラフ作成装置。 - 前記或るプログラムのソースコードを解析して、前記或るプログラムが含むクラスのうち、DI設定ファイルにおいてDI注釈が付与されたクラスの一覧を特定する第2の解析部を有し、
前記第2の特定部は、更に、前記第2の関数ごとに、当該第2の関数の定義を含むクラスを、前記第2の解析部が特定したクラスの一覧から特定する、
ことを特徴とする請求項1又は2記載のコールグラフ作成装置。 - 前記或るプログラムが含む関数の定義を解析して、DI機能を持つライブラリによってインスタンス化されるクラスを特定する第3の解析部を有し、
前記第2の特定部は、更に、前記第2の関数ごとに、当該第2の関数の定義を含むクラスを、前記第3の解析部が特定したクラスの一覧から特定する、
ことを特徴とする請求項1乃至3いずれか一項記載のコールグラフ作成装置。 - 或るプログラムが含む第1の関数の定義を解析して、前記第1の関数においてインスタンス化されるクラスの一覧と、前記第1の関数が呼び出す第2の関数の一覧とを特定する第1の特定手順と、
前記第2の関数ごとに、当該第2の関数の定義を含むクラスを、前記クラスの一覧から特定する第2の特定手順と、
前記第1の関数及び前記第2の関数のそれぞれをノードとし、前記第1の関数のノードから前記第2の関数へのノードへのエッジを含むコールグラフを作成する作成手順と、
をコンピュータが実行することを特徴とするコールグラフ作成方法。 - 請求項1乃至4いずれか一項記載のコールグラフ作成装置としてコンピュータを機能させることを特徴とするプログラム。
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
PCT/JP2020/046243 WO2022123763A1 (ja) | 2020-12-11 | 2020-12-11 | コールグラフ作成装置、コールグラフ作成方法及びプログラム |
Publications (2)
Publication Number | Publication Date |
---|---|
JPWO2022123763A1 JPWO2022123763A1 (ja) | 2022-06-16 |
JP7513116B2 true JP7513116B2 (ja) | 2024-07-09 |
Family
ID=
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2002046921A1 (fr) | 2000-12-08 | 2002-06-13 | Fujitsu Limited | Procede et dispositif pour l'analyse de sequences |
JP2004264914A (ja) | 2003-02-24 | 2004-09-24 | Intellaset:Kk | システム性能測定分析装置 |
US20170090889A1 (en) | 2015-09-30 | 2017-03-30 | Semmle Limited | Hierarchical dependency analysis of source code |
JP7105005B1 (ja) | 2021-03-15 | 2022-07-22 | 株式会社シゲル工業 | 下ろし器 |
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2002046921A1 (fr) | 2000-12-08 | 2002-06-13 | Fujitsu Limited | Procede et dispositif pour l'analyse de sequences |
JP2004264914A (ja) | 2003-02-24 | 2004-09-24 | Intellaset:Kk | システム性能測定分析装置 |
US20170090889A1 (en) | 2015-09-30 | 2017-03-30 | Semmle Limited | Hierarchical dependency analysis of source code |
JP7105005B1 (ja) | 2021-03-15 | 2022-07-22 | 株式会社シゲル工業 | 下ろし器 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Dig et al. | The role of refactorings in API evolution | |
CN112394942B (zh) | 基于云计算的分布式软件开发编译方法及软件开发平台 | |
US20130290937A1 (en) | Efficient extraction of software dependencies from program code | |
CN109117164B (zh) | 基于关键元素差异性分析的微服务更新方法及系统 | |
US20140109106A1 (en) | Code dependency calculation | |
US20110271258A1 (en) | Software Development Tool | |
CN110244942B (zh) | 一种页面生成方法、装置及系统 | |
US8141035B2 (en) | Method for accessing internal states of objects in object oriented programming | |
US20110271250A1 (en) | Software Development Tool | |
KR20090024229A (ko) | 마크업 내부에서 명시적으로 서브클래스를 정의하고 이용하는 시스템 및 방법 | |
US10083029B2 (en) | Detect application defects by correlating contracts in application dependencies | |
WO2018125363A1 (en) | Systems and/or methods for type inference from machine code | |
US9311111B2 (en) | Programming environment with support for handle and non-handle user-created classes | |
CN109032572B (zh) | 一种基于字节码的java程序方法内联的方法 | |
JP7513116B2 (ja) | コールグラフ作成装置、コールグラフ作成方法及びプログラム | |
CN111475150A (zh) | 一种跨语言绑定方法、装置、设备及存储介质 | |
CN116578282A (zh) | 代码生成方法、装置、电子设备及介质 | |
US9032372B2 (en) | Runtime environment and method for non-invasive monitoring of software applications | |
WO2022123763A1 (ja) | コールグラフ作成装置、コールグラフ作成方法及びプログラム | |
CN109299004B (zh) | 关键元素差异性分析方法及系统 | |
US10657476B2 (en) | Just in time compilation (JIT) for business process execution | |
CN111796832A (zh) | 热补丁文件生成方法、装置、设备及存储介质 | |
CN117235746B (zh) | 一种基于多维ast融合检测的源代码安全管控平台 | |
WO2008015110A2 (en) | Methods, apparatus and computer programs for modelling computer programs | |
JP3531728B2 (ja) | オブジェクト指向型プログラミング言語で記述されたプログラムの構成関係管理装置及び方法並びに記憶媒体 |