(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024142695
(43)【公開日】2024-10-11
(54)【発明の名称】情報処理装置、情報処理方法、及びプログラム
(51)【国際特許分類】
G06F 8/36 20180101AFI20241003BHJP
【FI】
G06F8/36
【審査請求】未請求
【請求項の数】7
【出願形態】OL
(21)【出願番号】P 2023054946
(22)【出願日】2023-03-30
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.JAVA
(71)【出願人】
【識別番号】000191076
【氏名又は名称】日鉄ソリューションズ株式会社
(74)【代理人】
【識別番号】100117857
【弁理士】
【氏名又は名称】南林 薫
(72)【発明者】
【氏名】津村 耕司
(72)【発明者】
【氏名】木村 博昭
【テーマコード(参考)】
5B376
【Fターム(参考)】
5B376BC08
5B376BC15
5B376BC23
5B376BC31
5B376BC38
5B376BC69
5B376BC80
(57)【要約】
【課題】静的解析により対象となるソースコードのコールグラフをより好適な態様で生成可能とする。
【解決手段】一連のソースコードのうち、ソースコード中のオブジェクトの生成を示唆するアノテーションと、当該一連のソースコードに関連付けられた設定ファイルにおけるオブジェクトの定義と、のうちの少なくともいずれかに基づき、当該オブジェクトの第1のフィールドが規定された第1のソースコードを抽出する抽出手段と、第1のフィールドに対応するオブジェクトの生成を直接的に示すコードが規定され、かつ第1のソースコードとは異なる第2のソースコードと、第2のソースコードに規定された処理を呼び出すことで、第1のソースコードに規定された第1のフィールドを参照する処理を呼び出す実行コードと、を生成する生成手段と、を備え、第1のソースコードと、第2のソースコードと、実行コードと、に基づきコールグラフが生成される、情報処理装置。
【選択図】
図7
【特許請求の範囲】
【請求項1】
解析対象となる一連のソースコードのうち、ソースコード中に付加されたオブジェクトの生成を示唆するアノテーションと、当該一連のソースコードに関連付けられた設定ファイルにおける生成対象のオブジェクトの定義と、のうちの少なくともいずれかに基づき、当該オブジェクトの第1のフィールドが規定された第1のソースコードを抽出する抽出手段と、
前記第1のフィールドに対応するオブジェクトの生成を直接的に示すコードが規定され、かつ前記第1のソースコードとは異なる第2のソースコードと、前記第2のソースコードに規定された処理を呼び出すことで、前記第1のソースコードに規定された前記第1のフィールドを参照する処理を呼び出す実行コードと、を生成する生成手段と、
を備え、
前記第1のソースコードと、前記第2のソースコードと、前記実行コードと、に基づきコールグラフが生成される、
情報処理装置。
【請求項2】
前記第1のソースコードに対して前記オブジェクトの生成を間接的に示すコードを追加することで、当該第1のソースコードを更新する更新手段を備え、
前記生成手段は、
前記オブジェクトの生成を間接的に示すコードに関連付けて、当該オブジェクトの生成を直接的に示すコードが規定された前記第2のソースコードを生成し、
当該第2のソースコードに規定された処理を呼び出すことで、前記更新後の第1のソースコードに規定された処理を呼び出すように、前記実行コードを生成する、
請求項1に記載の情報処理装置。
【請求項3】
前記オブジェクトの生成を間接的に示すコードは、前記第2のソースコードに規定されたクラスの抽象クラスに既定された処理を呼び出すコードであり、
前記クラスは、前記抽象クラスを継承するように、前記第2のソースコードに規定される、
請求項2に記載の情報処理装置。
【請求項4】
前記生成手段は、
前記オブジェクトに対応する第2のフィールドと、当該オブジェクトを生成して当該第2のフィールドに保持するコードと、呼び出しに応じて当該第2のフィールドに保持された当該オブジェクトを返却するコードと、が規定された前記第2のソースコードを生成し、
前記第2のソースコードに規定された処理により生成された前記オブジェクトを呼び出し、当該オブジェクトの処理として前記第1のソースコードに規定された処理を呼び出すように、前記実行コードを生成する、
請求項1に記載の情報処理装置。
【請求項5】
前記生成手段は、
第1のオブジェクトの前記第1のフィールドが規定された前記第1のソースコードと、当該第1のソースコードとは管理単位が異なり、かつ当該第1のソースコードに依存して規定される第2のオブジェクトの第2のフィールドが規定された第3のソースコードと、が抽出された場合に、
前記第2のオブジェクトに対応する第3のフィールドと、当該第2のオブジェクトを生成して当該第3のフィールドに保持するコードと、呼び出しに応じて当該第3のフィールドに保持された当該第2のオブジェクトを返却するコードと、が規定された第4のソースコードと、
前記第1のオブジェクトに対応する前記第2のフィールドと、前記第4のソースコードに規定された前記第3のフィールドに保持された前記第2のオブジェクトを返却するコードの呼び出しに基づき当該第2のフィールドに対して前記第2のオブジェクトを前記第1のオブジェクトとして保持するコードと、呼び出しに応じて当該第2のフィールドに保持された当該第1のオブジェクトを返却するコードと、が規定された前記第2のソースコードと、
前記第2のソースコードに規定された処理により生成されたオブジェクトを呼び出し、当該オブジェクトの処理として、前記第1のソースコードに規定された処理と、前記第3のソースコードに規定された処理と、を呼び出す、前記実行コードと、
を生成する、
請求項4に記載の情報処理装置。
【請求項6】
情報処理装置が実行する情報処理方法であって、
解析対象となる一連のソースコードのうち、ソースコード中に付加されたオブジェクトの生成を示唆するアノテーションと、当該一連のソースコードに関連付けられた設定ファイルにおける生成対象のオブジェクトの定義と、のうちの少なくともいずれかに基づき、当該オブジェクトの第1のフィールドが規定された第1のソースコードを抽出する抽出ステップと、
前記第1のフィールドに対応するオブジェクトの生成を直接的に示すコードが規定され、かつ前記第1のソースコードとは異なる第2のソースコードと、前記第2のソースコードに規定された処理を呼び出すことで、前記第1のソースコードに規定された前記第1のフィールドを参照する処理を呼び出す実行コードと、を生成する生成ステップと、
を含み、
前記第1のソースコードと、前記第2のソースコードと、前記実行コードと、に基づきコールグラフが生成される、
情報処理方法。
【請求項7】
コンピュータに、
解析対象となる一連のソースコードのうち、ソースコード中に付加されたオブジェクトの生成を示唆するアノテーションと、当該一連のソースコードに関連付けられた設定ファイルにおける生成対象のオブジェクトの定義と、のうちの少なくともいずれかに基づき、当該オブジェクトの第1のフィールドが規定された第1のソースコードを抽出する抽出ステップと、
前記第1のフィールドに対応するオブジェクトの生成を直接的に示すコードが規定され、かつ前記第1のソースコードとは異なる第2のソースコードと、前記第2のソースコードに規定された処理を呼び出すことで、前記第1のソースコードに規定された前記第1のフィールドを参照する処理を呼び出す実行コードと、を生成する生成ステップと、
を実行させ、
前記第1のソースコードと、前記第2のソースコードと、前記実行コードと、に基づきコールグラフが生成される、
プログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本開示は、情報処理装置、情報処理方法、及びプログラムに関する。
【背景技術】
【0002】
プログラムの開発や保守に際して、対象となるプログラムを理解するために、当該プログラムにソースコード解析を施したうえで、当該解析の結果を利用する場合がある。このようなソースコード解析の手法の1つとして、プログラム中で生成されたオブジェクトがどのように伝搬していくかを解析する、ポインタ解析と称される手法が知られている。ポインタ解析の結果として出力されるデータとしては、例えば、コールグラフと称されるオブジェクト間の呼び出し関係を示したデータが知られている。
【0003】
また、近年では、プログラム開発を効率よく行うために、アプリケーションフレームワークとも称される、数多くの再利用可能なプログラム部品を有するテンプレートを利用するケースが増えている。
【先行技術文献】
【特許文献】
【0004】
【発明の概要】
【発明が解決しようとする課題】
【0005】
一方で、アプリケーションフレームワークを利用して作成されたプログラムでは、プログラムの実行時にアプリケーションフレームワークによってオブジェクト間の依存関係が構成される。そのため、アプリケーションフレームワークを利用してプログラムが作成される場合に、オブジェクトの生成を示したコードがソースコード上に明示的に規定されない場合がある。このような場合には、ポインタ解析のような所謂静的な解析手法では、正確な解析が困難な場合がある。
【0006】
上記のような課題に対して、特許文献1には、依存性の注入(DI:Dependency Injection)に係る情報を利用して、コールグラフを生成する技術の一例が開示されている。しかしながら、特許文献1に開示された技術ではポインタ解析を行っているわけではないため、必ずしも正確なコールグラフ(より実態に即したコールグラフ)が作成されるとは限らない。
【0007】
本発明は上記の問題を鑑み、静的解析により対象となるソースコードのコールグラフをより好適な態様で生成可能とすることを目的とする。
【課題を解決するための手段】
【0008】
本発明に係る情報処理装置は、解析対象となる一連のソースコードのうち、ソースコード中に付加されたオブジェクトの生成を示唆するアノテーションと、当該一連のソースコードに関連付けられた設定ファイルにおけるオブジェクトの定義と、のうちの少なくともいずれかに基づき、当該オブジェクトの第1のフィールドが規定された第1のソースコードを抽出する抽出手段と、前記第1のフィールドに対応するオブジェクトの生成を直接的に示すコードが規定され、かつ前記第1のソースコードとは異なる第2のソースコードと、前記第2のソースコードに規定された処理を呼び出すことで、前記第1のソースコードに規定された前記第1のフィールドを参照する処理を呼び出す実行コードと、を生成する生成手段と、を備え、前記第1のソースコードと、前記第2のソースコードと、前記実行コードと、に基づきコールグラフが生成される。
【発明の効果】
【0009】
本発明によれば、静的解析により対象となるソースコードのコールグラフをより好適な態様で生成することが可能となる。
【図面の簡単な説明】
【0010】
【
図1】情報処理装置の機能の概要について説明するための図である。
【
図2】ソースコードの更新方法の一例について説明するための図である。
【
図3】情報処理装置のハードウェア構成の一例を示した図である。
【
図4】情報処理装置の機能構成の一例を示した機能ブロック図である。
【
図5】情報処理装置の処理の一例を示したフローチャートである。
【
図6】解析対象のソースコードとそのコールグラフとの一例を示した図である。
【
図7】更新対象となるソースコード及びコードの特定方法の一例を示した図である。
【
図8】更新後のソースコードの一例を示した図である。
【
図9】生成されるコールグラフの一例を示した図である。
【
図10】解析対象のソースコードの一例を示した図である。
【
図11】追加されるソースコードの一例を示した図である。
【
図12】生成される実行コードの一例を示した図である。
【
図13】生成されるコールグラフの一例を示した図である。
【
図14A】シングルトンが適用されていない場合の一例を示した図である。
【
図14B】シングルトンが適用されている場合の一例を示した図である。
【
図15】シングルトンの考慮について説明するための図である。
【
図16】シングルトンの適用の可否を判別する仕組みの一例を示した図である。
【
図17】シングルトンの適用の可否を判別する仕組みの一例を示した図である。
【
図18】ソースコードの更新方法の一例について説明するための図である。
【
図19】実行コードの生成方法の一例について説明するための図である。
【発明を実施するための形態】
【0011】
以下に添付図面を参照しながら、本開示の好適な実施の形態について詳細に説明する。なお、本明細書及び図面において、実質的に同一の機能構成を有する構成要素については、同一の符号を付することにより重複説明を省略する。
【0012】
<第1の実施形態>
本開示の第1の実施形態に係る情報処理装置について以下に説明する。まず、
図1及び
図2を参照して、本実施形態に係る情報処理装置の機能の概要について説明する。
前述したように、アプリケーションフレームワークを利用して作成されたプログラム等のように、プログラムの実行時にアプリケーションフレームワークによってオブジェクト間の依存関係が構成されるものがある。このようなプログラムにおいては、オブジェクトの生成を示したコードがソースコード上に明示的に規定されない場合がある。例えば、
図1は、オブジェクトの生成を示したコードがソースコード上に明示的に規定されない場合の一例を示している。
【0013】
具体的には、
図1(a)に示すソースコードC111は、クラスXのコード内において、クラスBのオブジェクトのフィールドC112と、フィールドC112に保持されるオブジェクトの処理(メソッド)を呼び出すコードC113とが規定されている。
図1(b)は、このような前提のもとで、
図1(a)に例示したようなソースコードのプログラムが実行された場合における、オブジェクト間の呼び出し関係を示すコールグラフの一例を示している。
一方で、プログラムを実行せずにソースコードに基づきオブジェクト間の呼び出し関係を解析するポインタ解析においては、フィールドC112に対するオブジェクトの生成が明示的に規定されていないため、同フィールドC112がNullとして扱われる。そのため、ポインタ解析(静的解析)によりソースコードC111のコールグラフの生成を試みた場合には、
図1(c)に示すような、クラスBのオブジェクトが生成されていないことを前提とした、実態に即していないコールグラフが生成される場合がある。
【0014】
以上のような状況を鑑み、本実施形態に係る情報処理装置は、解析対象となるソースコードに対して一部修正を施すことで、当該ソースコードをポインタ解析(静的解析)用のソースコードに更新することで、より実態に即したコールグラフの生成を可能とする。例えば、
図2は、本実施形態に係る情報処理装置の機能の概要を説明するための説明図である。
【0015】
図2(a)は、本実施形態に係る情報処理装置100による、解析対象となるソースコードの更新結果の一例を示している。具体的には、プロジェクトC331は、解析対象となる一連のソースコードを管理するためのプロジェクト(管理単位)を模式的に示している。
図2(a)に示す例では、プロジェクトC331に含まれる一部のソースコードに対して情報処理装置100により修正が施された後の状態を示している。なお、
図2(a)に示す例では、便宜上、プロジェクトC331に含まれる一連のソースコードのうち、特にポイントとなる一部のソースコードを抜粋して図示している。また、プロジェクトC332は、解析対象となるプロジェクトC331とは別に情報処理装置100により生成されるプロジェクトを模式的に示している。プロジェクトC332には、プロジェクトC331に含まれる更新後のソースコードに規定された処理を呼び出す実行コード(所謂Mainクラスが規定されたコード)等が含まれる。
【0016】
フレームワークの中には、実行時にオブジェクト間の依存関係が構成される部分に対してアノテーションが付加されるものがある。本実施形態に係る情報処理装置100は、当該アノテーションに基づき、解析対象として指定された一連のソースコードの中から、更新対象となるソースコードと、当該ソースコード中における更新対象となるコード(例えば、フィールド)とを特定する。そのうえで、情報処理装置100は、更新対象となるコードに関する定義に基づき、当該コードに修正を施す。
【0017】
例えば、
図2(a)に示す例では、プロジェクトC331に含まれる一部のソースコードのフィールドC335に対して、実行時にオブジェクト間の依存関係が構成されることを意味するキーワード「@Autowired」で示されたアノテーションC333が付加されている。情報処理装置100は、所定のアノテーションC333が付加されたソースコードを更新の対象とするソースコードとして抽出し、当該ソースコードにおいて当該アノテーションC333が示されたコードC335(フィールド)を更新の対象とするコード(換言すると、更新箇所)として特定する。そのうえで、情報処理装置100の更新部112は、更新対象のコードC335の特定結果に基づき、当該コードC335が示すオブジェクトの生成を間接的に示すコードを追加する。
具体的には、情報処理装置100は、更新対象のコードに対応する抽象クラスC334をプロジェクトC331に追加したうえで、当該抽象クラスC334に対して対象となるオブジェクトの生成処理を呼び出すコードを追加する。また、情報処理装置100は、更新対象のコードC335に対して、生成した抽象クラスC334の上記処理を呼び出すコードを追加する。
この際に、情報処理装置100は、例えば、生成対象とするオブジェクトを、フレームワークが管理対象となるコンポーネントとして扱うクラスに対して付加したアノテーションに基づき特定する。例えば、フィールドC335に設定されるオブジェクトは、クラスAまたはクラスBのオブジェクトとなる。また、
図2(a)に示す例では、クラスBに対して、管理対象となるコンポーネントであることを意味するキーワード「@Component」で示されたアノテーションC339が付加されている。一方で、クラスAに対しては、管理対象となるコンポーネントであることを意味するアノテーションが付加されていない。そのため、情報処理装置100は、フィールドC335に設定されるオブジェクトが、クラスBのオブジェクトであるものと認識し、クラスBのオブジェクトの生成を間接的に示すコードを追加している。
【0018】
また、情報処理装置100は、解析対象のプロジェクトC331とは別のプロジェクトC332を生成し、当該プロジェクトC332に対して、抽象クラスC334を継承するクラスC336と、コールグラフを生成するための起点となる実行コードC337とを追加する。具体的には、情報処理装置100は、クラスC336に対して、抽象クラスC334にて定義されたコードにより呼び出される処理のコードを追加し、当該コード内に対象となるオブジェクトの生成を直接的に示すコード(例えば、オブジェクトをnewするコード)を追加する。また、情報処理装置100は、実行コードC337において、クラスC336のオブジェクトを生成し、当該オブジェクトの処理として、更新対象のソースコード中のコードC335が示すオブジェクトに対応付けて追加した、抽象クラスC334の処理を呼び出すコードを規定する。
なお、本開示における「継承」とは、オブジェクト指向を構成する概念の一つとして規定される継承に相当し、あるオブジェクトに他のオブジェクトの特性を引き継がせることを意味する。すなわち、本開示において継承とは、クラスの定義に係る共通部分を、別クラスにまとめることを意味する。
また、上述した要件を満たす実行コード(ソースコードC337相当のコード)を生成することが可能であれば、その方法は特に限定はされない。例えば、以下に示す参考文献に開示された手法を利用することで、上述した要件を満たす実行コードを生成することも可能である。
・参考文献:Jens Dietrich, Francois Gauthier, and Padmanabhan Krishnan. 2018. Driver Generation for Java EE Web Applications. In Australasian Software Engineering Conference (ASWEC). IEEE, 121-25.
また、他の一例として、フレームワークが解析対象のソースコードに付加したアノテーションを利用して、上述した要件を満たす実行コードを生成することも可能である。このアノテーションを利用した実行コードの生成方法については、本実施形態の変形例として詳細を別途後述する。
なお、
図2(a)において、実行時にオブジェクト間の依存関係が構成されることを意味するキーワード「@Autowired」で示しされたアノテーションC333が、オブジェクトの生成を示唆する「第1のアノテーション」の一例に相当する。すなわち、同アノテーションC333が付加されたソースコード、すなわち更新対象となるソースコードが、「第1のソースコード」の一例に相当する。アノテーションC333により生成が示唆されたオブジェクトが、「第1のオブジェクト」の一例に相当し、第1のソースコード内における第1のオブジェクトに対応するフィールド(コードC335に対応するフィールド)が、「第1のフィールド」の一例に相当する。
【0019】
なお、アノテーションC333として付加されるキーワードについては、適用されるフレームワークに応じて異なる場合がある。そのため、情報処理装置100は、適用されるフレームワークに応じて、アノテーションC333として抽出するキーワードを適宜変更してもよい。また、情報処理装置100が、適用されるフレームワークを識別することが可能であれば、その方法についても特に限定はされない。具体的な一例として、情報処理装置100は、ユーザからの指示に応じて適用されるフレームワークを認識し、当該フレームワークに応じてアノテーションC333として抽出するキーワードを変更してもよい。また、他の一例として、情報処理装置100は、解析対象として指定されたソースコードに含まれる情報や、当該ソースコードに紐付けられた設定ファイル等を解析することで、適用されるフレームワークを認識してもよい。
【0020】
図2(b)は、更新前のソースコードのプログラムが実行された場合における、オブジェクト間の呼び出し関係を示すコールグラフの一例を示している。また、
図2(c)は、
図2(a)に示した更新後のソースコードを対象としたポインタ解析(静的解析)により生成されるコールグラフの一例を示している。
図2(b)と
図2(c)とを比較するとわかるように、コールグラフ全体としては異なるものの、
図2(c)に示すコールグラフには、部分的なコールグラフC338として、
図2(b)に示すコールグラフと実質的に同様のコールグラフが含まれる。すなわち、
図2(c)に示すコールグラフには、本来想定されるコールグラフと実質的に同様のコールグラフC338と、分析のために追加されたコードに基づき生成されるコールグラフとが含まれることとなる。このような前提のもとで、例えば、
図2(c)に示す一連のコールグラフから、パッケージ名等を抽出条件として、解析対象のソースコードのコールグラフを抽出することで、ポインタ解析を利用する状況下においても、実態に即したコールグラフ(すなわち、コールグラフC338)を生成することが可能となる。なお、以降では、本実施形態に係る情報処理装置100について、より詳しく説明をする。
【0021】
(ハードウェア構成)
図3を参照して、本実施形態に係る情報処理装置のハードウェア構成の一例について説明する。
図1に示すように、本実施形態に係る情報処理装置100は、CPU(Central Processing Unit)910と、ROM(Read Only Memory)920と、RAM(Random Access Memory)930とを含む。また、情報処理装置100は、補助記憶装置940と、ネットワークI/F970とを含む。また、情報処理装置100は、出力装置950と、入力装置960とのうち少なくともいずれかを含んでもよい。CPU910と、ROM920と、RAM930と、補助記憶装置940と、出力装置950と、入力装置960と、ネットワークI/F970とは、バス980を介して相互に接続されている。
【0022】
CPU910は、情報処理装置100の各種動作を制御する中央演算装置である。例えば、CPU910は、情報処理装置100全体の動作を制御してもよい。ROM920は、CPU910で実行可能な制御プログラムやブートプログラム等を記憶する。RAM930は、CPU910の主記憶メモリであり、ワークエリア又は各種プログラムを展開するための一時記憶領域として用いられる。
【0023】
補助記憶装置940は、各種データや各種プログラムを記憶する。補助記憶装置940は、HDD(Hard Disk Drive)や、SSD(Solid State Drive)に代表される不揮発性メモリ等のような、各種データを一時的または持続的に記憶可能な記憶デバイスにより実現される。
【0024】
出力装置950は、各種情報を出力する装置であり、ユーザに対する各種情報の提示に利用される。例えば、出力装置950は、ディスプレイ等の表示デバイスにより実現され得る。この場合には、出力装置950は、各種表示情報を表示させることで、ユーザに対して情報を提示する。また、他の一例として、出力装置950は、音声や電子音等の音を出力する音響出力デバイスにより実現されてもよい。この場合には、出力装置950は、音声や電信等の音を出力することで、ユーザに対して情報を提示する。また、出力装置950として適用されるデバイスは、ユーザに対して情報を提示するために利用する媒体に応じて適宜変更されてもよい。
【0025】
入力装置960は、ユーザからの各種指示の受け付けに利用される。本実施形態では、入力装置960は、マウス、キーボード、タッチパネル等の入力デバイスを含む。また、他の一例として、入力装置960は、マイクロフォン等の集音デバイスを含み、ユーザが発話した音声を集音してもよい。この場合には、集音された音声に対して音響解析や自然言語処理等の各種解析処理が施されることで、この音声が示す内容がユーザからの指示として認識される。また、入力装置960として適用されるデバイスは、ユーザからの指示を認識する方法に応じて適宜変更されてもよい。また、入力装置960として複数種類のデバイスが適用されてもよい。
【0026】
ネットワークI/F970は、外部の装置とのネットワークを介した通信に利用される。なお、ネットワークI/F970として適用されるデバイスは、通信経路の種別や適用される通信方式に応じて適宜変更されてもよい。
【0027】
CPU910が、ROM220または補助記憶装置940に記憶されたプログラムをRAM930に展開し、このプログラムを実行することで、
図4を参照して後述する情報処理装置の機能構成や、
図5を参照して後述する情報処理装置の処理等が実現される。
【0028】
(機能構成)
図4を参照して、本実施形態に係る情報処理装置100の機能構成の一例について説明する。
図4に示すように、本実施形態に係る情報処理装置100は、制御部110と、コールグラフ生成部120とを含む。
【0029】
制御部110は、解析対象となる一連のソースコードD210の入力を受け付け、当該ソースコードD210に対して
図2を参照して説明した更新を施したうえで、更新後のソースコードD220を所定の出力先に出力する。具体的には、制御部110は、解析部111と、更新部112とを含む。
【0030】
解析部111は、解析対象となる一連のソースコードD210に対して所定の解析を施すことで、一連のソースコードD210の中から、コールグラフを生成するための処理の対象となるソースコードと、当該ソースコード中の当該処理の対象となるコードとを特定する。例えば、本実施形態の場合には、解析部111は、解析対象となる一連のソースコードD210に対して所定の解析を施すことで、更新の対象となるソースコードや、当該ソースコード中の更新の対象となるコードを特定する。
具体的な一例として、解析部111は、
図2(a)を参照して説明したように、所定のアノテーションが付加されたソースコードを更新の対象とするソースコードとして抽出し、当該ソースコードにおいて当該アノテーションが示されたコードを更新の対象とするコードとして特定してもよい。
また、他の一例として、解析部111は、解析対象となる一連のソースコードD210に関連付けられた、ソースコードごとに生成対象となるオブジェクトや、当該オブジェクトが保持されるフィールドについて規定された設定ファイルに基づき、更新の対象とするソースコードを抽出してもよい。この場合には、解析部111は、当該設定ファイルにおける、生成対象となるオブジェクトや、当該オブジェクトが保持されるフィールドの規定に基づき、抽出したソースコードにおける更新の対象とするコードを特定してもよい。なお、当該設定ファイルに基づき、更新の対象とするソースコードの抽出や、当該ソースコードにおける更新の対象とするコードの特定方法の一例については、
図7を参照して詳細を別途後述する。
また、解析部111は、解析対象となる一連のソースコードD210と依存関係のある、当該一連のソースコードD210に含まれてない他のソースコードが存在する場合には、当該他のソースコードについても解析対象に含めてもよい。具体的な一例として、解析部111は、プロジェクト等のようなソースコードの管理に利用される管理単位により解析対象となる一連のソースコードが指定された場合に、設定ファイル等を利用して当該管理単位間の依存関係を特定してもよい。そのうえで、解析部111は、解析対象として指定された管理単位と依存関係のある他の管理単位が解析対象に含まれていない場合に、当該他の管理単位についても解析対象に含めてもよい。
【0031】
更新部112は、解析部111による対象となるソースコード及び当該ソースコード中のコードの特定結果に基づき、一連のソースコードD210を対象としてコールグラフを生成するためのソースコードの生成や更新に係る処理を実行する。
例えば、更新部112は、解析部111による更新対象となる第1のソースコード及び当該第1のソースコード中のコードの特定結果に基づき、当該第1のソースコードに対して
図2(a)を参照して説明したように、オブジェクトの生成を間接的に示すコードを追加する更新を行う。また、更新部112は、更新対象となる第1のソースコードとは異なる他のソースコードとして、上記オブジェクトの生成を間接的に示すコードに関連付けて、当該オブジェクトの生成を直接的に示すコードが規定された第2のソースコードを生成する。そのうえで、更新部112は、解析対象の第1のソースコードの更新結果と、上記第2のソースコードの生成結果とを踏まえ、少なくとも当該第1のソースコードを対象としてコールグラフを生成するための起点となる実行コード(所謂Mainクラスが規定されたコード)を生成する。具体的には、更新部112は、
図2(a)を参照して説明したように、第2のソースコードに規定された処理を呼び出すことで、更新後の第1のソースコードに規定された処理が呼び出されるように、上記実行コードを生成する。なお、この際に、更新部112は、上記第2のソースコードと上記実行コードとを、更新対象の第1のソースコードを管理するためのプロジェクト(管理単位)とは異なるプロジェクトに関連付けて管理してもよい。
そして、更新部112は、更新後の第1のソースコードを含む解析対象となる一連のソースコードと、生成した第2のソースコード及び実行コードとを、コールグラフを生成するための一連のソースコードD220として所定の出力先に出力する。例えば、
図4に示す例では、更新部112は、コールグラフを生成するための一連のソースコードD220を、後述するコールグラフ生成部120に出力している。
【0032】
コールグラフ生成部120は、制御部110から出力される、コールグラフを生成するための一連のソースコードD220を対象として、所謂ポインタ解析のような静的解析によりコールグラフを生成する。なお、ソースコードを解析することで所謂コールグラフを生成することが可能であれば、その方法(例えば、ソースコードの解析方法)については特に限定はされない。すなわち、コールグラフの生成に公知のロジックが適用されてもよい。そのため、例えば、入力された一連のソースコードを分析してコールグラフを生成する公知のツールが、コールグラフ生成部120として適用されてもよい。以上のようにして、コールグラフ生成部120は、一連のソースコードD220を入力としてコールグラフD230を生成し、生成した当該コールグラフD230を所定の出力先に出力する。
【0033】
なお、
図4に示す構成はあくまで一例であり、必ずしも本実施形態に係る情報処理装置100の機能構成を限定するものではない。
例えば、
図4に示した一連の構成要素が、複数の装置が協働することで実現されてもよい。具体的な一例として、コールグラフ生成部120に相当する構成要素が、情報処理装置100以外の他の装置により実現されてもよい。この場合には、制御部110を含む情報処理装置100は、コールグラフを生成するための一連のソースコードD220を、ネットワークを介して接続された当該他の装置に送信してもよい。また、他の一例として、制御部110は、コールグラフを生成するための一連のソースコードD220を、所定の記憶装置(例えば、データ管理のためのサーバ等)に出力してもよい。この場合には、コールグラフ生成部120を含む他の装置は、当該記憶装置からコールグラフの生成対象となる一連のソースコードを取得してもよい。
また、他の一例として、
図4に示した一連の構成要素のうち、少なくとも一部の構成要素の処理負荷が複数の装置に分散されてもよい。
また、
図4に示した一連の構成要素のうち、少なくとも一部の構成要素が、クラウドサービスのような所謂ネットワークサービスにより実現されてもよい。
【0034】
(処理)
図5を参照して、本実施形態に係る情報処理装置100の処理の一例について説明する。
S110において、制御部110は、解析対象となる一連のソースコードD210の入力を受け付ける。また、このとき制御部110は、解析対象となる一連のソースコードD210と依存関係を有する他のソースコードが存在するか否かを確認し、当該他のソースコードを解析対象に含めてもよい。
【0035】
S120において、解析部111は、S110に解析対象として入力を受け付けた一連のソースコードD210に対して所定の解析処理を施すことで、更新対象となるソースコードと、当該ソースコード中の更新箇所(すなわち、更新対象となるコード)とを特定する。具体的な一例として、解析部111は、所定のアノテーションC333が付加されたソースコードを更新対象の第1のソースコードとして抽出し、当該第1のソースコード中の当該アノテーションC333が示されたコードを更新箇所として特定してもよい。
【0036】
S130において、更新部112は、S120における更新対象となる第1のソースコード及び更新箇所の特定結果に基づき、当該第1のソースコードに対して更新箇所に示されたコードに対応するオブジェクトの生成を間接的に示すコードを追加することで、当該第1のソースコードを更新する。また、更新部112は、更新対象となる第1のソースコードとは異なる他のソースコードとして、上記オブジェクトの生成を間接的に示すコードに関連付けて、当該オブジェクトの生成を直接的に示すコードが規定された第2のソースコードを生成する。そのうえで、更新部112は、解析対象の第1のソースコードの更新結果と、上記第2のソースコードの生成結果とを踏まえ、少なくとも当該第1のソースコードを対象としてコールグラフを生成するための起点となる実行コードを生成する。そして、更新部112は、更新後の第1のソースコードを含む解析対象となる一連のソースコードと、生成した第2のソースコード及び実行コードとを、コールグラフを生成するための一連のソースコードとして所定の出力先に出力する。
以上のようにして、更新部112から出力された一連のソースコードは、例えば、コールグラフ生成部120によるコールグラフの生成に利用される。
【0037】
(変形例)
本実施形態の変形例として、情報処理装置100が実行コードの生成に際して、フレームワークが解析対象のソースコードに付加したアノテーションを利用して、当該実行コード内で呼び出す処理を特定する方法の一例について説明する。例えば、
図19は、本変形例に係る情報処理装置の機能の概要について説明するための説明図である。なお、
図19に示す例では、説明に使用する一部のソースコードを対象として図示しており、他のソースコードについては図示を省略している。
【0038】
図19(a)に示すソースコードC351は、解析対象となるソースコードの一例を示している。ソースコードC351では、
図1(a)に例示したソースコードC111と同様に、クラスXのコード内において、クラスBのオブジェクトのフィールドC354と、フィールドC354に保持されるオブジェクトの処理(メソッド)を呼び出すコードC358とが規定されている。
また、上記クラスXには、「@Controller」で示されたアノテーションC355が付加されている。このアノテーションC355は、アプリケーションの実行の起点となるクラスに付与されるアノテーションであり、例えば、HTTPリクエストに対して最初に呼び出されるクラスに付与され得る。
また、上記コードC358には、キーワード「@RequestMapping」で示されたアノテーションC356が付加されている。このアノテーションC356は、アノテーションC355に関連付けて規定されており、HTTPリクエストを受け取って処理するメソッドに対して付加され、どのHTTPメソッドのリクエストを処理するかが「method」属性により指定される。また、アノテーションC356と同様に、どのHTTPメソッドのリクエストを処理するかを指定可能な他のアノテーションとして、キーワード「@GetMapping」、「@PostMapping」、「@PutMapping」、「@DeleteMapping」、及び「@PatchMapping」等で示されるアノテーションが挙げられる。本変形例では、これらのアノテーションについても、アノテーションC356と同様に扱うものとする。
なお、@Controllerアノテーションは、@Componentアノテーションを内包するアノテーションである。すなわち、@Controllerアノテーションが付与されたクラスXも、コンポーネントとして管理対象となる。
【0039】
図19(b)は、本変形例に係る情報処理装置100による、解析対象となるソースコードの更新結果の一例を示している。具体的には、ソースコードC352は、解析対象のソースコードに対して情報処理装置100により修正が施されることで更新された後の、当該ソースコードの一例を示している。また、ソースコードC353は、更新後のソースコードC352に規定された処理を呼び出す実行コードである。
【0040】
ソースコードC352では、
図1及び
図2を参照して説明した例と同様に、フィールドC354に対して、クラスBのオブジェクトの生成を間接的に示すコードが追加されることで更新がなされている。なお、ソースコードC351をソースコードC352に更新する方法については、
図1及び
図2を参照して説明した例と同様のため、詳細な説明は省略する。
【0041】
また、本変形例に係る情報処理装置100は、実行コードC353の生成に際して、アノテーションC355及びC356に基づき、当該実行コードC353にて呼び出す処理を特定する。
具体的には、情報処理装置100は、解析対象となるソースコードC351に付加されたアノテーションC355に基づき、処理の呼び出し対象となるクラスを特定する。
図19に示す例の場合には、情報処理装置100は、クラスXを対象として特定することとなる。
次いで、情報処理装置100は、解析対象となるソースコードC351に付加されたアノテーションC356に基づき、対象として特定したクラスの一連の処理のうち、実行コードにて呼び出す処理を特定する。例えば、
図19に示す例では、クラスXにおいてコードC358により示された処理に対してアノテーションC356が付加されている。そのため、情報処理装置100は、クラスXのオブジェクトの処理として、コードC358により示された処理が呼び出されるように、実行コードC353を生成する。
【0042】
以上、本実施形態の変形例として、情報処理装置100が実行コードの生成に際して、フレームワークが解析対象のソースコードに付加したアノテーションを利用して、当該実行コード内で呼び出す処理を特定する方法の一例について説明した。
【0043】
(作用効果)
以上説明したように、本実施形態に係る情報処理装置100は、解析対象となる一連のソースコードから、更新対象となる第1のソースコードと、当該第1のソースコード中の更新対象となるコードとを特定する。例えば、情報処理装置100は、所定のアノテーションが付加されたソースコードを更新対象となる第1のソースコードとして抽出し、当該アノテーションが付加されたコードを更新箇所として特定してもよい。そのうえで、情報処理装置100は、更新対象となる第1のソースコード中の特定した更新箇所に対して、当該更新箇所に示されたコード(例えば、フィールド)に、当該コードに対応するオブジェクトの生成を間接的に示すコードを追加することで当該第1のソースコードを更新する。また、情報処理装置100は、更新対象となる第1のソースコードとは異なる他のソースコードとして、上記オブジェクトの生成を間接的に示すコードに関連付けて、当該オブジェクトの生成を直接的に示すコードが規定された第2のソースコードを生成する。そのうえで、情報処理装置100は、解析対象の第1のソースコードの更新結果と、上記第2のソースコードの生成結果とを踏まえ、少なくとも当該第1のソースコードを対象としてコールグラフを生成するための起点となる実行コードを生成する。そして、情報処理装置100は、更新後の第1のソースコードを含む解析対象となる一連のソースコードと、生成した第2のソースコード及び実行コードとを、コールグラフを生成するための一連のソースコードとして所定の出力先に出力する。以上のようにして生成された一連のソースコードを利用することで、
図2を参照して説明したように、コールグラフの生成にポインタ解析のような静的解析が利用される場合においても、より実態に即したコールグラフを生成することが可能となる。
【0044】
<第2の実施形態>
本開示の第2の実施形態について説明する。前述した実施形態では、解析対象となるソースコードのうちの一部のソースコードに対して、オブジェクトの生成に係るコードを追加する更新を施すことで、コールグラフの生成にポインタ解析のような静的解析が利用される場合においても、より実態に即したコールグラフを生成可能とする仕組みの一例について説明した。これに対して、本実施形態では、解析対象となるソースコードの更新を伴わずに、当該ソースコードの処理を呼び出す他のソースコードを追加することで、コールグラフの生成にポインタ解析のような静的解析が利用される場合においても、より実態に即したコールグラフを生成可能とする仕組みの一例について説明する。なお、本実施形態では、前述した第1の実施形態と特に異なる部分に着目して説明を行い、当該第1の実施形態と実質的に同様の部分については詳細な説明は省略する。
【0045】
まず、
図6を参照して、本実施形態において解析対象となるソースコードの一例と、当該ソースコードを対象とした、オブジェクト間の呼び出し関係を示すコールグラフの一例について説明する。具体的には、
図6(a)に示すソースコードC611は、クラスXのコード内において、クラスBのオブジェクトのフィールドC612と、当該フィールドC612に保持されるオブジェクトの処理(メソッド)を呼び出すコードC613とが規定されている。また、ソースコードC611では、フィールドC612を参照するコードとして、呼び出し元から指定されたオブジェクトを当該フィールドC612に設定するためのコードC614が規定されている。
図6(b)は、このような前提のもとで、
図6(a)に例示したようなソースコードのプログラムが実行された場合における、オブジェクト間の呼び出し関係を示すコールグラフの一例を示している。また、
図1を参照して説明した例と同様に、ポインタ解析においては、フィールドC612に対するオブジェクトの生成が明示的に規定されていないため、同フィールドC612がNullとして扱われる。そのため、ポインタ解析(静的解析)によりソースコードC611のコールグラフの生成を試みた場合には、
図6(c)に示すような、クラスBのオブジェクトが生成されていないことを前提とした、実態に即していないコールグラフが生成される場合がある。
【0046】
以上のような状況を鑑み、本実施形態に係る情報処理装置100は、解析対象となるソースコードの更新を伴わずに、当該ソースコードの処理を呼び出す他のソースコードを追加することで、より実態に即したコールグラフの生成を可能とする。例えば、
図7及び
図8は、本実施形態に係る情報処理装置100の機能の概要を説明するための説明図である。
【0047】
まず、
図7を参照して、本実施形態に係る情報処理装置100が、解析対象として指定された一連のソースコードの中から、更新対象となるソースコードと、当該ソースコード中における更新対象となるコードとを特定する方法の一例について説明する。更新対象となるソースコード及びコードを特定する方法としては、ソースコード中に付加されたアノテーションを利用する方法と、解析対象として指定された一連のソースコードに関連付けられた設定ファイルを利用する方法とが挙げられる。
【0048】
例えば、
図7(a)は、ソースコード中に付されたアノテーションを利用して、コールグラフを生成するためのソースコードの追加に係る処理の対象となるソースコード及びコードを特定する方法の一例について示した図である。フレームワークに依っては、ソースコードに規定されたコードの実行に伴い生成されるインスタンス(オブジェクト)を管理下におくために、対象となるクラスのコードにアノテーションを付す場合がある。
例えば、
図7(a)に示す例において、キーワード「@Component」で示されたアノテーションC615は、クラスBの規定に係るコードに付加されており、当該コードの実行に伴い生成される当該クラスBのオブジェクト(インスタンス)がフレームワークの管理下にあることを示している。また、キーワード「@Component」で示されたアノテーションC615を内包する他のアノテーションが付される場合があり、当該アノテーションは、例えば、キーワード「@Controller」、「@Service」等で示され得る。例えば、
図7(a)に示すアノテーションC616は、クラスXの規定に係るコードに付加されており、当該コードの実行に伴い生成される当該クラスXのオブジェクトがフレームワークの管理下にあることを示している。
【0049】
本実施形態に係る情報処理装置100は、
図7(a)に示す例の場合には、上記に例示したアノテーションを利用して、当該アノテーションが付されたコードを含むソースコードを、コールグラフを生成するためのソースコードの追加に係る処理の対象として特定する。
また、本実施形態に係る情報処理装置100は、第1の実施形態で説明した例と同様に、実行時にオブジェクト間の依存関係が構成されることを意味するアノテーションに基づき、コールグラフを生成するためのソースコードの追加に係る処理の対象とするコードを特定する。例えば、
図7(a)に示す例の場合には、情報処理装置100は、キーワード「@Autowired」で示されたアノテーションが付加されたコードC614を、コールグラフを生成するためのソースコードの追加に係る処理の対象とするコードとして特定する。
【0050】
また、
図7(b)は、解析対象として指定された一連のソースコードに関連付けられた設定ファイルを利用して、コールグラフを生成するためのソースコードの追加に係る処理の対象となるソースコード及びコードを特定する方法の一例について示した図である。
図7(b)に示す設定ファイルは、フレームワークが、ソースコードに規定されたコードの実行に伴い生成されるオブジェクト(インスタンス)を管理下におくために利用する設定ファイルの一例を示している。当該設定ファイルには、管理対象となるオブジェクトが生成されるクラスの規定や、当該オブジェクトが設定されるフィールドの規定が含まれる。
具体的な一例として、
図7(b)に例示した設定ファイルC621では、キーワード「bean」で示されたタグにより、管理対象となるオブジェクトが生成されるクラスが指定されている。より具体的な一例として、タグC622に対して、キーワード「class」で示された属性情報として、オブジェクトの生成対象となるクラスBが規定されている。また、他の一例として、タグC623に対して、キーワード「class」で示された属性情報として、オブジェクトの生成対象となるクラスXが規定されている。すなわち、
図7(b)に示す例では、クラスB及びクラスXのオブジェクトがフレームワークの管理下にあることを示している。
本実施形態に係る情報処理装置100は、上記に例示したような設定ファイルの規定を利用して、フレームワークが管理下におくオブジェクトに対応するクラスのソースコードを、コールグラフを生成するためのソースコードの追加に係る処理の対象として特定する。
【0051】
また、キーワード「bean」で示された上記クラスの規定に係るタグ内には、キーワード「property」で示されたタグにより、対象となるフィールドにオブジェクト(インスタンス)を設定するためのsetterメソッドが指定されている。例えば、クラスXの規定に係るタグC623内には、キーワード「property」で示されたタグC624のname属性「b」にsetterメソッド(setB)の指定がなされている。
加えて、上記フィールドの規定に係るタグ内には、キーワード「ref」で示しされたタグにより、対象となるフィールドに対してどのクラスのオブジェクトが設定されるかが指定されている。例えば、フィールドbの規定に係るタグC624内には、キーワード「ref」で示された設定されるオブジェクトに対応するクラスを示すタグC625が規定されている。また、当該タグC625には、キーワード「bean」で示された属性情報として、対象となるクラスを特定するための識別情報が指定される。例えば、
図7(b)に示す例では、当該属性情報として、タグC622で示されたクラスBに割り当てられた識別情報が指定されている。すなわち、
図7(b)に示す設定ファイルC621では、クラスXに規定されたフィールドbに対して、クラスBのオブジェクトが設定されることが示されている。
本実施形態に係る情報処理装置100は、上記に例示した設定ファイルにおけるフィールドの規定を利用して、同規定により指定されたコードを、コールグラフを生成するためのソースコードの追加に係る処理の対象とするコードとして特定する。
【0052】
次いで、
図8を参照して、本実施形態に係る情報処理装置100により、解析対象となる一連のソースコードのコールグラフを生成するために追加される他のソースコード(コールグラフを生成するためのソースコード)の一例について説明する。なお、
図8に示す例では、便宜上、解析対象として指定されたプロジェクト(以下、プロジェクトprj1とも称する)に含まれる一連のソースコードのうち、特にポイントとなる一部のソースコードを抜粋して図示している。また、
図8に示す例では、解析対象として指定されたプロジェクトprj1の状態として、当該プロジェクトprj1に対して、対象となるソースコードC611のコールグラフを生成するための他のソースコードとして、抽象クラスC631のソースコードが追加された後の状態を示している。抽象クラスC631には、
図7を参照して説明した例に基づき対象として特定されるフィールドに対応するオブジェクト(インスタンス)を、呼び出しに応じて返却するコードが規定されている。例えば、コードC632は、呼び出しに応じて、フィールドxに設定されたクラスXのオブジェクトを返却するコードとして、抽象クラスC631を継承するクラスC641の処理を呼び出すコードが規定されている。すなわち、コードC632の実体的な処理については、クラスC641の処理として規定されることとなる。当該クラスC641の処理については、詳細を別途後述する。
【0053】
また、本実施形態に係る情報処理装置100は、解析対象となるプロジェクトprj1とは別に、解析対象となるソースコードのコールグラフを生成するための他のソースコードの管理に利用する他のプロジェクト(以下、プロジェクトmainとも称する)を別途生成する。そのうえで、情報処理装置100は、プロジェクトmainに対して、抽象クラスC631を継承するクラスC641と、コールグラフを生成するための起点となる実行コードC651とを追加する。
【0054】
具体的には、情報処理装置100は、クラスC641に対して、抽象クラスC631に規定されたコードにより返却されるオブジェクトを保持するためのフィールドを、インスタンスを生成せずとも利用可能な所謂静的フィールドとして規定する。例えば、フィールドC643は、抽象クラスC631に規定されたコードC632が呼び出されることで返却される、クラスXのオブジェクトを保持するためのフィールドである。なお、このクラスC641に規定されたフィールドが、「第2のフィールド」の一例に相当する。また、情報処理装置100は、上記フィールドに対応するオブジェクトの生成が直接的に規定されたコードを追加する。上記フィールドには、当該コードとして規定された処理により生成されたオブジェクトが設定される。例えば、コードC642は、クラスXのオブジェクトを生成する処理が規定されている。また、フィールドC643には、コードC642として規定された処理により生成されたオブジェクトが設定されている。また、情報処理装置100は、抽象クラスC631に規定されたコードから呼び出されるコードとして、上記フィールドに保持されたオブジェクトを返却する実体的な処理が規定されたコードを追加する。例えば、コードC644は、抽象クラスC631に規定されたコードC632から呼び出され、フィールドC643に保持されたクラスXのオブジェクトを返却する処理が規定されている。なお、このクラスC641のソースコードが、本実施形態における「第2のソースコード」の一例に相当する。
【0055】
また、情報処理装置100は、実行コードC651に対して、クラスC641の初期化処理を呼び出したうえで、抽象クラスC631のコードC632を呼び出すことで、当該クラスC641のフィールドC643に保持されたオブジェクトを取得するコードを規定する。例えば、
図8に示す例の場合には、当該コードが示す処理により、クラスXのオブジェクトが取得されることとなる。そのうえで、情報処理装置100は、実行コードC651に対して、上記コードにより取得されたオブジェクトの処理、すなわち、コールグラフの生成対象となる処理を呼び出すコードC652を規定している。なお、コールグラフの生成対象となる処理の特定方法については、
図1を参照して説明した例と同様のため、詳細な説明は省略する。
【0056】
そして、情報処理装置100は、解析対象となる第1のソースコードと、生成した第2のソースコード及び実行コードとを含む一連のソースコード(例えば、
図8に例示した一連のソースコード)に基づきコールグラフを生成する。
【0057】
例えば、
図9は、
図6及び
図8に例示した一連のソースコードに基づき生成されたコールグラフの一例について説明するための図である。具体的には、
図9(a)は、解析対象となるソースコードのプログラムが実行された場合における、オブジェクト間の呼び出し関係を示すコールグラフの一例を示している。また、
図9(b)は、
図6及び
図8に例示した一連のソースコードに基づき生成されたコールグラフの一例を示している。
図9(a)と
図9(b)とを比較するとわかるように、コールグラフ全体としては異なるものの、
図9(b)に示すコールグラフには、部分的なコールグラフC661として、
図9(a)に示すコールグラフと実質的に同様のコールグラフが含まれる。すなわち、
図9(b)に示すコールグラフには、本来想定されるコールグラフと実質的に同様のコールグラフC661と、分析のために追加されたコードに基づき生成されるコールグラフとが含まれることとなる。このような前提のもとで、余分な部分を省いて本来のコールグラフと実質的に同等のコールグラフを得るためには、例えば、
図9(b)に示す一連のコールグラフから、パッケージ名等を抽出条件として、解析対象のソースコードのコールグラフを抽出すればよい。このように、本実施形態においても、ポインタ解析を利用する状況下であったとしても、実態に即したコールグラフ(すなわち、コールグラフC661)を生成することが可能となる。
【0058】
以上説明したように、本実施形態に係る情報処理装置100に依れば、解析対象となるソースコードの更新を伴わずとも、コールグラフの生成にポインタ解析のような静的解析が利用される場合においても、より実態に即したコールグラフを生成することが可能となる。
【0059】
(変形例)
続いて、本開示の第2の実施形態の変形例について以下に説明する。本変形例では、解析対象となる一連のソースコードに、他のプロジェクトに属するソースコードと依存関係を有するソースコードが含まれる場合の一例について説明する。
【0060】
例えば、
図10は、本変形例における解析対象となるソースコードの一例を示した図である。なお、
図10に示す例では、便宜上、解析対象として指定されたプロジェクトに含まれる一連のソースコードのうち、特にポイントとなる一部のソースコードを抜粋して図示している。
具体的には、
図10に示す例では、クラスA及びXについて規定したソースコードC711がプロジェクトprj1に含まれており、クラスAを継承するクラスBについて規定したソースコードC712がプロジェクトprj2に含まれている。そのうえで、クラスXのオブジェクトの処理として、クラスAを継承するクラスBのオブジェクトの処理が呼び出されている。換言すると、
図10に示す例では、クラスX内の処理では、クラスAのオブジェクトとして、クラスAを継承するクラスBのオブジェクトが適用されている。すなわち、
図10に示す例では、プロジェクトprj2に属するソースコード(例えば、クラスBのソースコード)は、プロジェクトprj1に属するソースコード(例えば、クラスAのソースコード)に依存していることとなる。このような場合には、解析対象となるソースコードを管理する管理単位(例えば、プロジェクト)ごとに、コールグラフを生成するためのソースコードの追加がなされるとよい。
なお、本変形例では、ソースコードC711が「第1のソースコード」の一例に相当し、ソースコードC712が「第3のソースコード」の一例に相当する。
【0061】
図11は、本変形例に係る情報処理装置100が、解析対象となる一連のソースコードのコールグラフを生成するために追加する他のソースコード(コールグラフを生成するためのソースコード)の一例を示した図である。
図11では、
図10に例示した解析対象となる一連のソースコードを対象として情報処理装置100により追加される、当該一連のソースコードのコールグラフを生成するための他のソースコードの一例を示している。
【0062】
具体的には、情報処理装置100は、ソースコードC711が属するプロジェクトprj1に対して、当該ソースコードC711のコールグラフを生成するための他のソースコードとして、抽象クラスC721のソースコードを追加する。抽象クラスC721は、ソースコードC711を対象とした、
図8に示す例における抽象クラスC631に相当する。抽象クラスC721には、
図7を参照して説明した例に基づき対象として特定されるフィールドに対応するオブジェクト(この場合には、クラスAを継承したクラスBに対応するオブジェクト)を、呼び出しに応じて返却するコードC722が規定されている。
同様に、情報処理装置100は、ソースコードC712が属するプロジェクトprj2に対して、当該ソースコードC712のコールグラフを生成するための他のソースコードとして、抽象クラスC731のソースコードを追加する。抽象クラスC731は、ソースコードC712を対象とした、
図8に示す例における抽象クラスC631に相当する。抽象クラスC731には、
図7を参照して説明した例に基づき対象として特定されるフィールドに対応するオブジェクト(クラスBに対応するオブジェクト)を、呼び出しに応じて返却するコードC732が規定されている。
【0063】
また、本変形例に係る情報処理装置100は、解析対象となるプロジェクトprj1及びprj2とは別に、解析対象となるソースコードのコールグラフを生成するための他のソースコードの管理に利用する他のプロジェクト(プロジェクトmain)を別途生成する。そのうえで、情報処理装置100は、プロジェクトmainに対して、抽象クラスC721を継承するクラスC741と、抽象クラスC731を継承するC751と、コールグラフを生成するための起点となる実行コードC761(
図12を参照して別途後述する)とを追加する。
【0064】
情報処理装置100は、クラスC741に対して、抽象クラスC721に規定されたコードにより返却されるオブジェクトを保持するためのフィールドを、インスタンスを生成せずとも利用可能な所謂静的フィールドとして規定する。例えば、フィールドC743は、抽象クラスC721に規定されたコードC722が呼び出されることで返却される、クラスAを継承するクラスBのオブジェクトを保持するためのフィールドである。
また、
図10に示す例では、ソースコードC711におけるクラスXの処理において、クラスAのオブジェクトとして、当該クラスAを継承するクラスBのオブジェクトが適用されている。そのため、フィールドC743に保持されるオブジェクトの生成が、後述するクラスC751の処理として実行されるように、当該フィールドC743にオブジェクトを設定するコードが規定されている。具体的には、フィールドC743にオブジェクトを設定するコードとして、抽象クラスC731に規定されたコードC732を呼び出すコードが規定されている。これにより、コードC732を介して後述するコードC754が呼び出され、結果として返却されるクラスBのオブジェクトがフィールドC743に設定されることとなる。
また、情報処理装置100は、抽象クラスC721に規定されたコードC722から呼び出されるコードとして、フィールドC743に保持されたオブジェクトを返却する実体的な処理が規定されたコードC744を追加する。
なお、本変形例では、クラスC741のソースコードが「第2のソースコード」の一例に相当する。また、クラスC741に規定されたフィールドC743が、本変形例における「第2のフィールド」の一例に相当し、当該フィールドC743に保持されるオブジェクトが本変形例における「第1のオブジェクト」の一例に相当する。
【0065】
また、情報処理装置100は、クラスC751に対して、抽象クラスC731に規定されたコードにより返却されるオブジェクトを保持するためのフィールドを、インスタンスを生成せずとも利用可能な所謂静的フィールドとして規定する。例えば、フィールドC753は、抽象クラスC731に規定されたコードC732が呼び出されることで返却される、クラスBのオブジェクトを保持するためのフィールドである。
また、
図10に示す例の場合には、クラスBに依存する他のクラスが存在しない。そのため、情報処理装置100は、フィールドC753に対応するオブジェクト(クラスBのオブジェクト)の生成が直接的に規定されコードC752を追加している。フィールドC753には、コードC752として規定された処理により生成されたオブジェクトが設定される。
また、情報処理装置100は、抽象クラスC731に規定されたコードC732から呼び出されるコードとして、フィールドに保持されたオブジェクトを返却する実体的な処理が規定されたコードC754を追加する。
なお、本変形例では、クラスC751のソースコードが「第4のソースコード」の一例に相当する。また、クラスC741に規定されたフィールドC753が、本変形例における「第3のフィールド」の一例に相当し、当該フィールドC753に保持されるオブジェクトが本変形例における「第2のオブジェクト」の一例に相当する。
【0066】
また、情報処理装置100は、プロジェクトmainに対して、コールグラフを生成するための起点となる実行コードC761を追加する。例えば、
図12は、本変形例に係る実行コードの一例を示した図である。
図12に示す例では、情報処理装置100は、実行コードC761に対して、クラスC741及びC751それぞれの初期化処理を呼び出したうえで、当該クラスC741のコードを呼び出すことで、当該クラスC741のフィールドに保持されたクラスXのオブジェクトを取得するコードを規定している。そのうえで、情報処理装置100は、実行コードC761に対して、上記コードにより取得されたクラスXのオブジェクトの処理、すなわち、コールグラフの生成対象となる処理を呼び出すコードを規定している。なお、コールグラフの生成対象となる処理の特定方法については、
図1を参照して説明した例と同様のため、詳細な説明は省略する。
【0067】
そして、更新部112は、解析対象となる第1のソースコードと、生成した第2のソースコード及び実行コードとを含む一連のソースコード(例えば、
図8に例示した一連のソースコード)を、コールグラフを生成するための一連のソースコードとして所定の出力先に出力する。
【0068】
そして、情報処理装置100は、解析対象となる第1のソースコード及び第3のソースコードと、生成した第2のソースコード、第4のソースコード、及び実行コードとを含む一連のソースコード(例えば、
図11及び
図12に例示した一連のソースコード)に基づきコールグラフを生成する。
【0069】
例えば、
図13は、
図10、
図11、及び
図12に例示した一連のソースコードに基づき生成されたコールグラフの一例について説明するための図である。具体的には、
図13(a)は、解析対象となるソースコードのプログラムが実行された場合における、オブジェクト間の呼び出し関係を示すコールグラフの一例を示している。また、
図13(b)は、
図10、
図11、及び
図12に例示した一連のソースコードに基づき生成されたコールグラフの一例を示している。
図13(a)と
図13(b)とを比較するとわかるように、コールグラフ全体としては異なるものの、
図13(b)に示すコールグラフには、部分的なコールグラフC771として、
図13(a)に示すコールグラフと実質的に同様のコールグラフが含まれる。すなわち、
図13(b)に示すコールグラフには、本来想定されるコールグラフと実質的に同様のコールグラフC771と、分析のために追加されたコードに基づき生成されるコールグラフとが含まれることとなる。このような前提のもとで、余分な部分を省いて本来のコールグラフと実質的に同等のコールグラフを得るためには、例えば、
図13(b)に示す一連のコールグラフから、パッケージ名等を抽出条件として、解析対象のソースコードのコールグラフを抽出すればよい。このように、本実施形態においても、ポインタ解析を利用する状況下であったとしても、実態に即したコールグラフ(すなわち、コールグラフC771)を生成することが可能となる。
【0070】
以上説明したように、本変形例に係る情報処理装置100に依れば、解析対象となる一連のソースコードに、他のプロジェクトに属するソースコードと依存関係を有するソースコードが含まれる場合においても、より実態に即したコールグラフを生成することが可能となる。
【0071】
<第3の実施形態>
本開示の第3の実施形態について以下に説明する。本実施形態では、前述した各実施形態をさらに拡張した実施形態として、所謂シングルトン(Singleton)と称される設計思想(デザインパターン)に基づきソースコードが規定されている場合を考慮して、解析対象となるソースコードのコールグラフを生成可能とするための仕組みの一例について説明する。なお、本実施形態では、前述した第1の実施形態や第2の実施形態と特に異なる部分に着目して説明を行い、当該第1の実施形態や当該第2の実施形態と実質的に同様の部分については詳細な説明は省略する。
【0072】
まず、本実施形態の特徴をよりわかりやすくするために、
図14A及び
図14Bを参照して、シングルトンが適用されない場合と、シングルトンが適用される場合との違いについて概要を説明する。
【0073】
例えば、
図14Aは、シングルトンが適用されていない場合の一例を示した図である。
具体的には、
図14A(a)は、解析対象となるソースコードの一例を示した図である。
図14A(a)に示す例では、前提として、オブジェクトx及びyそれぞれに対して、Houseクラスのオブジェクト(以下、houseオブジェクトとも称する)のpetフィールドにDogクラスのオブジェクトが設定されている。このような状況下で、オブジェクトxを対象として、houseオブジェクトのpetフィールドに設定されているオブジェクトを、Catクラスのオブジェクトに置き換えている(すなわち、Catクラスのオブジェクトをnewして代入している)。なお、参考として、
図15に、
図14Aと後述する
図14Bとのそれぞれに示すソースコードにて定義される一連のオブジェクトのソースコードの一例を示す。
図14A(b)は、シングルトンが適用されていない状況下で、
図14A(a)に示すソースコードに対してポインタ解析を適用した結果の一例を示している。シングルトンが適用されていない場合には、オブジェクトx及びyそれぞれに対して個別にhouseオブジェクトが生成されるため、
図14A(b)に示すように、オブジェクトx及びyそれぞれからは、互いに異なるhouseオブジェクトが呼び出されることとなる。すなわち、オブジェクトxについては、houseオブジェクトからCatクラスのオブジェクトの生成処理が呼び出され、オブジェクトyについては、houseオブジェクトからDogクラスのオブジェクトの生成処理が呼び出されることとなる。
図14A(c)は、
図14A(b)を参照して説明したポインタ解析の結果として出力されるコールグラフの一例を示している。すなわち、Mainクラスのmainメソッドからは、オブジェクトxの処理として呼び出されるCatクラスのcryメソッドと、オブジェクトyの処理として呼び出されるDogクラスのcryメソッドとがコールグラフに出力されることとなる。
【0074】
また、
図14Bは、シングルトンが適用されている場合の一例を示した図である。
具体的には、
図14B(a)は、解析対象となるソースコードの一例を示した図である。
図14B(a)に示す例は、コードの記載上は
図14A(a)に示す例と同様であり、シングルトンが適用されているか否かが
図14A(a)に示す例と異なる。
図14B(b)は、シングルトンが適用されている状況下で、
図14A(a)に示すソースコードに対してポインタ解析を適用した結果の一例を示している。シングルトンが適用されている場合には、オブジェクトx及びyそれぞれに対して共通のhouseオブジェクトが適用されるため、
図14B(b)に示すように、オブジェクトx及びyそれぞれからは、共通のhouseオブジェクトが呼び出されることとなる。
図14B(c)は、
図14B(b)を参照して説明したポインタ解析の結果として出力されるコールグラフの一例を示している。すなわち、Mainクラスのmainメソッドからは、オブジェクトx及びyそれぞれの処理として共通に呼び出されるCatクラスのcryメソッドがコールグラフに出力され、Dogクラスのcryメソッドについてはコールグラフに出力されないこととなる。
なお、以降の説明では、便宜上、シングルトンが適用されている場合のオブジェクトをシングルトンオブジェクトとも称する。すなわち、
図14Bに示す例では、houseオブジェクトはシングルトンオブジェクトとなる。これに対して、
図14Aに示す例では、houseオブジェクトはシングルトンオブジェクトではないこととなる。
【0075】
図14A及び
図14Bを比較するとわかるように、共通のソースコードが適用される場合においても、シングルトンが適用されているか否かに応じてプログラムの動作が異なり、結果として出力されるコールグラフも異なることとなる。このような状況を鑑み、本実施形態では、解析対象となるソースコードに対してシングルトンが適用されているか否かを加味して、より実態に即したコールグラフが生成されるように当該ソースコードを更新する場合の一例について説明する。
【0076】
まず、本実施形態に係る情報処理装置100が、解析対象となるソースコードに対してシングルトンが適用されているか否かを判別するための仕組みの一例について説明する。例えば、フレームワークの中には、対象となるプログラムのスコープを、ソースコードに付加するアノテーションや、ソースコードに関連付けられた設定ファイル等により指定することが可能なものがある。このような場合には、例えば、同スコープの設定としてシングルトンを適用するか否かを設定可能な場合がある。そのため、例えば、情報処理装置100は、このようなフレームワークの仕組みを利用することで、対象となるソースコードに対してシングルトンが適用されているか否かを判別してもよい。
【0077】
例えば、
図16は、フレームワークによりソースコード中に付加されたアノテーションに基づき、当該ソースコードに対してシングルトンが適用されているか否かを判別する仕組みの一例を示した図である。
図16に示す例では、対象となるソースコードにより実現されるプログラムのスコープの指定を意味するキーワード「@Scope」で示されたアノテーションを付加するか否かや、当該アノテーションに指定されたパラメータに応じて、シングルトンが適用されているか否かが示される。
具体的には、
図16(a)及び
図16(b)に示すように、アノテーション「@Scope」は、パラメータとして属性値を指定することが可能であり、当該パラメータとして指定された属性値に応じて、対象となるソースコードのスコープが決定される。そのうえで、このアノテーション「@Scope」に対して、属性値としてシングルトンの適用を意味する「singleton」が指定されている場合には、対象となるソースコードに対してシングルトンが適用されていることを意味することとなる。すなわち、
図16(a)に示す例では、アノテーション「@Scope」は、シングルトンが適用されないことを意味している。また、
図16(b)に示す例では、アノテーション「@Scope」は、シングルトンが適用されることを意味している。そのため、情報処理装置100は、対象となるソースコードに付加された上記アノテーションに対して指定されている属性値に基づき、当該ソースコードに対してシングルトンが適用されているか否かを判別してもよい。
また、
図16(c)に示すようにアノテーション「@Scope」に対して属性値が指定されていない場合や、
図16(d)に示すようにアノテーション「@Scope」が付加されていない場合も想定され得る。このような場合には、スコープとしてデフォルトの設定が適用されることとなる。そのため、このような場合には、情報処理装置100は、当該デフォルトの設定としてシングルトンが適用されていることを意味するか否かに応じて、対象となるソースコードに対してシングルトンが適用されているか否かを判別してもよい。具体的には、
図16(c)や
図16(d)に示す例において、デフォルトの設定としてシングルトンが適用されていることを意味する場合には、情報処理装置100は、対象となるソースコードに対してシングルトンが適用されていると判定することとなる。
【0078】
他の一例として、
図17は、フレームワークにより対象となるソースコードに関連付けられた設定ファイルに規定されたスコープに関する設定に基づき、当該ソースコードに対してシングルトンが適用されているか否かを判別する仕組みの一例を示した図である。
図17に示す例では、クラスごとの種々の設定を規定する「bean」タグに対して、対象となるソースコードにより実現されるプログラムのスコープの指定を意味するキーワード「scope」で示された属性を指定するか否かや、当該属性に指定された属性値に応じて、シングルトンが適用されているか否かが示される。
具体的には、
図17(a)及び
図17(b)に示すように、「bean」タグの「scope」属性には属性値が指定され、当該属性値に応じて、対象となるソースコードのスコープが決定される。そのうえで、この「scope」属性に対して、属性値としてシングルトンの適用を意味する「singleton」が指定されると、対象となるソースコードに対してシングルトンが適用されることを意味することとなる。すなわち、
図17(a)に示す例では、「scope」属性は、シングルトンが適用されないことを意味している。また、
図17(b)に示す例では、「scope」属性は、シングルトンが適用されることを意味している。そのため、情報処理装置100は、対象となるソースコードに関連付けられた設定ファイルを参照し、同設定ファイル内にて「bean」タグの「scope」属性に指定されている属性値に基づき、当該「bean」タグが示すクラス(換言すると、当該クラスのソースコード)に対してシングルトンが適用されているか否かを判別してもよい。
また、
図17(c)に示すように、「bean」タグに対して「scope」属性が指定されていない場合も想定され得る。このような場合には、スコープとしてデフォルトの設定が適用されることとなる。そのため、このような場合には、情報処理装置100は、当該デフォルトの設定としてシングルトンが適用されていることを意味するか否かに応じて、対象となるソースコードに対してシングルトンが適用されているか否かを判別してもよい。具体的には、
図17(c)に示す例の場合において、デフォルトの設定としてシングルトンが適用されていることを意味する場合には、情報処理装置100は、対象となるソースコードに対してシングルトンが適用されていると判定することとなる。
【0079】
続いて、
図18を参照して、本実施形態に係る情報処理装置100による対象となるソースコードの更新方法の一例について説明する。
図18において、ソースコードC501は、解析対象のソースコードを模式的に示している。なお、
図18では図示を省略しているが、
図6及び
図7を参照して説明した例と同様に、クラスA及びクラスBが別途規定されているものとする。また、クラスXには、クラスAを継承したクラスBのオブジェクトが保持されるフィールドbが規定されるおり、同フィールドに対して所定のアノテーション(@Autowired)が示されているものとする。また、
図18では図示を省略しているが、更新後のソースコードC501を対象としたコールグラフを生成する際の起点となる実行コード(Mainクラス)が別途追加されることとなる。
【0080】
情報処理装置100の解析部111は、解析対象として指定された一連のソースコードのうち、所定のアノテーション(@Autowired)が付加されたソースコードC501を抽出し、当該アノテーションが示されたコード(フィールド)を更新対象のコード(換言すると、更新箇所)として特定する。なお、
図18に示す例では、クラスAを継承したクラスBのオブジェクトが設定されるフィールドbが、更新対象のコードとして特定されたものとする。そのうえで、情報処理装置100の更新部112は、更新対象のコードの特定結果に基づき、当該コードが示すオブジェクトの生成を間接的に示すコードを追加する。
具体的には、更新部112は、更新対象のコードに対応する抽象クラスC503を、ソースコードC501と同様のプロジェクト(以下、プロジェクト1とする)に追加したうえで、当該抽象クラスC503に対して対象となるオブジェクトの生成処理を呼び出すコードを追加する。なお、
図18に示す例では、便宜上、ソースコードC503に対してコードC508とコードC509とを例示している。コードC508は、後述するソースコードC502においてコードC506として実体的な処理が規定されるコード(オーバーライドされるコード)である。また、コードC509は、当該ソースコードC502においてコードC507として実体的な処理が規定されるコード(オーバーライドされるコード)である。シングルトンが適用されている場合には、コードC508及びC509の双方が使用される。これに対して、シングルトンが適用されていない場合にはC509のみが使用される。更新部112は、ソースコードC501に対してシングルトンが適用されているか否かの判別結果に基づき、上述の通りコードC508及びC509の出力を選択的に切り替えてもよいし、シングルトンが適用されているか否かに関わらず双方を追加してもよい。
また、更新部112は、ソースコードC501における更新対象のコード(フィールドb)に対して、生成した抽象クラスC503の上記処理を呼び出すコードを追加する。なお、
図18に示す例では、便宜上、ソースコードC501に対してシングルトンが適用されている場合のコードC504と、当該ソースコードC501に対してシングルトンが適用されていない場合のコードC505とを例示している。更新部112は、ソースコードC501に対してシングルトンが適用されているか否かの判別結果に基づき、当該ソースコードC501に対してコードC504及びC505のいずれかを追加する。
【0081】
また、更新部112は、解析対象のソースコードC501が含まれるプロジェクト1とは別のプロジェクト(以下、プロジェクト3とも称する)を生成し、当該プロジェクト3に対して、抽象クラスC503を継承するクラスC502を追加する。具体的には、更新部112は、クラスC502に対して、抽象クラスC503にて定義されたコードにより呼び出される処理のコードを追加する。なお、前述したように、抽象クラスC503には、ソースコードC501に対してシングルトンが適用されているか否かに応じて、コードC508(シングルトンの場合)及びC509(シングルトンでない場合)のいずれかが追加される。そのため、更新部112は、抽象クラスC503に追加したコードに応じて、クラスC502に追加するコードを適宜変更する。
図18に示すソースコードC502の例では、便宜上、ソースコードC501に対してコードC506とコードC507との双方が追加されている状態を例示している。具体的には、コードC506としては、フィールドbに保持されたクラスB(クラスAを継承したクラス)のオブジェクトを返却するコードが追加される。また、同フィールドbには、詳細を後述するコードC507により生成された(newされた)クラスBのオブジェクトが保持される。また、コードC507としては、クラスB(クラスAを継承したクラス)のオブジェクトを生成するコードが追加される。シングルトンが適用されている場合には、コードC506及びC507の双方が使用される。これに対して、シングルトンが適用されていない場合にはC507のみが使用される。更新部112は、シングルトンが適用されているか否かの判定結果に基づき上述の通りコードC506及びC507の出力を選択的に切り替えてもよいし、シングルトンが適用されているか否かに関わらず双方を追加してもよい。なお、このコードの出力に係る制御の切り替えについては、ソースコードC503におけるコードC508及びC509の出力に係る制御の切り替えにあわせて適用することが望ましいことは言うまでもない。
また、
図18に示す例では図示を省略しているが、プロジェクト3には、
図2や
図8を参照して説明した例と同様の技術思想に基づき、更新後のソースコードC501を対象としたコールグラフを生成する際の起点となる実行コード(Mainクラス)が追加される。なお、同実行コードは、
図2や
図8に示す例と同様のため、詳細な説明は省略する。
【0082】
以上のようにして、解析対象となるソースコードが更新されることで、当該ソースコードを対象としたコールグラフを、当該ソースコードに対してシングルトンが適用されているか否かに応じて、より実態に即した態様で出力することが可能となる。
なお、上述した例では、情報処理装置100が、解析対象となるソースコードに付加されたアノテーションや、当該ソースコードに関連付けられた設定ファイル等に基づき、当該ソースコードに対してシングルトンが適用されているか否かを判別する場合の一例について説明した。一方で、情報処理装置100が、解析対象となるソースコードに対してシングルトンが適用されているか否かを判別することが可能であれば、その方法は特に限定はされない。例えば、情報処理装置100は、ユーザからの指示を受け付けることで、当該指示に基づき、対象となるソースコードに対してシングルトンが適用されているか否かを判別してもよい。
【0083】
<補足>
なお、本開示の各実施形態では、主にJavaと称されるプログラム言語により規定されたソースコードを解析の対象とする場合に着目して説明したが、オブジェクトの生成が伴うプログラム言語で規定されたソースコードであれば、対象とするプログラム言語は特に限定はされない。具体的な一例として、C++やObjective-C等により規定されたソースコードを対象として、本開示に係る技術を適用することも可能である。なお、その場合には、解析対象となるソースコードに適用されるプログラム言語に応じて、コードの記載方法が異なるため、対象となるソースコードの更新に際して追加または修正されるコードについても当該プログラム言語のルールに応じて適宜変更されることは言うまでもない。
【0084】
また、上述した実施形態はあくまで一例であり、必ずしも本発明の構成や処理を限定するものではなく、本発明の技術思想を逸脱しない範囲で種々の変形や変更が加えられてもよい。
【0085】
また、以下のような構成も本開示の技術的範囲に属する。
(1)解析対象となる一連のソースコードのうち、ソースコード中に付加されたオブジェクトの生成を示唆するアノテーションと、当該一連のソースコードに関連付けられた設定ファイルにおける生成対象のオブジェクトの定義と、のうちの少なくともいずれかに基づき、当該オブジェクトの第1のフィールドが規定された第1のソースコードを抽出する抽出手段と、前記第1のフィールドに対応するオブジェクトの生成を直接的に示すコードが規定され、かつ前記第1のソースコードとは異なる第2のソースコードと、前記第2のソースコードに規定された処理を呼び出すことで、前記第1のソースコードに規定された前記第1のフィールドを参照する処理を呼び出す実行コードと、を生成する生成手段と、を備え、前記第1のソースコードと、前記第2のソースコードと、前記実行コードと、に基づきコールグラフが生成される、情報処理装置。
(2)前記第1のソースコードに対して前記オブジェクトの生成を間接的に示すコードを追加することで、当該第1のソースコードを更新する更新手段を備え、前記生成手段は、前記オブジェクトの生成を間接的に示すコードに関連付けて、当該オブジェクトの生成を直接的に示すコードが規定された前記第2のソースコードを生成し、当該第2のソースコードに規定された処理を呼び出すことで、前記更新後の第1のソースコードに規定された処理を呼び出すように、前記実行コードを生成する、(1)に記載の情報処理装置。
(3)前記オブジェクトの生成を間接的に示すコードは、前記第2のソースコードに規定されたクラスの抽象クラスに既定された処理を呼び出すコードであり、
前記クラスは、前記抽象クラスを継承するように、前記第2のソースコードに規定される、(2)に記載の情報処理装置。
(4)前記生成手段は、前記オブジェクトに対応する第2のフィールドと、当該オブジェクトを生成して当該第2のフィールドに保持するコードと、呼び出しに応じて当該第2のフィールドに保持された当該オブジェクトを返却するコードと、が規定された前記第2のソースコードを生成し、前記第2のソースコードに規定された処理により生成された前記オブジェクトを呼び出し、当該オブジェクトの処理として前記第1のソースコードに規定された処理を呼び出すように、前記実行コードを生成する、(1)に記載の情報処理装置。
(5)前記生成手段は、第1のオブジェクトの前記第1のフィールドが規定された前記第1のソースコードと、当該第1のソースコードとは管理単位が異なり、かつ当該第1のソースコードに依存して規定される第2のオブジェクトの第2のフィールドが規定された第3のソースコードと、が抽出された場合に、前記第2のオブジェクトに対応する第3のフィールドと、当該第2のオブジェクトを生成して当該第3のフィールドに保持するコードと、呼び出しに応じて当該第3のフィールドに保持された当該第2のオブジェクトを返却するコードと、が規定された第4のソースコードと、前記第1のオブジェクトに対応する前記第2のフィールドと、前記第4のソースコードに規定された前記第3のフィールドに保持された前記第2のオブジェクトを返却するコードの呼び出しに基づき当該第2のフィールドに対して前記第2のオブジェクトを前記第1のオブジェクトとして保持するコードと、呼び出しに応じて当該第2のフィールドに保持された当該第1のオブジェクトを返却するコードと、が規定された前記第2のソースコードと、前記第2のソースコードに規定された処理により生成されたオブジェクトを呼び出し、当該オブジェクトの処理として、前記第1のソースコードに規定された処理と、前記第3のソースコードに規定された処理と、を呼び出す、前記実行コードと、を生成する、(4)に記載の情報処理装置。
(6)情報処理装置が実行する情報処理方法であって、解析対象となる一連のソースコードのうち、ソースコード中に付加されたオブジェクトの生成を示唆するアノテーションと、当該一連のソースコードに関連付けられた設定ファイルにおける生成対象のオブジェクトの定義と、のうちの少なくともいずれかに基づき、当該オブジェクトの第1のフィールドが規定された第1のソースコードを抽出する抽出ステップと、前記第1のフィールドに対応するオブジェクトの生成を直接的に示すコードが規定され、かつ前記第1のソースコードとは異なる第2のソースコードと、前記第2のソースコードに規定された処理を呼び出すことで、前記第1のソースコードに規定された前記第1のフィールドを参照する処理を呼び出す実行コードと、を生成する生成ステップと、を含み、前記第1のソースコードと、前記第2のソースコードと、前記実行コードと、に基づきコールグラフが生成される、情報処理方法。
(7)コンピュータに、解析対象となる一連のソースコードのうち、ソースコード中に付加されたオブジェクトの生成を示唆するアノテーションと、当該一連のソースコードに関連付けられた設定ファイルにおける生成対象のオブジェクトの定義と、のうちの少なくともいずれかに基づき、当該オブジェクトの第1のフィールドが規定された第1のソースコードを抽出する抽出ステップと、前記第1のフィールドに対応するオブジェクトの生成を直接的に示すコードが規定され、かつ前記第1のソースコードとは異なる第2のソースコードと、前記第2のソースコードに規定された処理を呼び出すことで、前記第1のソースコードに規定された前記第1のフィールドを参照する処理を呼び出す実行コードと、を生成する生成ステップと、を実行させ、前記第1のソースコードと、前記第2のソースコードと、前記実行コードと、に基づきコールグラフが生成される、プログラム。
【符号の説明】
【0086】
100 情報処理装置
110 制御部
111 解析部
112 更新部
120 コールグラフ生成部