(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024142692
(43)【公開日】2024-10-11
(54)【発明の名称】情報処理装置、情報処理方法、及びプログラム
(51)【国際特許分類】
G06F 8/36 20180101AFI20241003BHJP
【FI】
G06F8/36
【審査請求】未請求
【請求項の数】9
【出願形態】OL
(21)【出願番号】P 2023054943
(22)【出願日】2023-03-30
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.JAVA
(71)【出願人】
【識別番号】000191076
【氏名又は名称】日鉄ソリューションズ株式会社
(74)【代理人】
【識別番号】100117857
【弁理士】
【氏名又は名称】南林 薫
(72)【発明者】
【氏名】津村 耕司
(72)【発明者】
【氏名】木村 博昭
【テーマコード(参考)】
5B376
【Fターム(参考)】
5B376BC15
5B376BC23
5B376BC31
5B376BC38
5B376BC69
5B376BC80
(57)【要約】
【課題】静的解析により対象となるソースコードのコールグラフをより好適な態様で生成可能とする。
【解決手段】解析対象となる一連のソースコードを取得する取得手段と、前記一連のソースコードのうち、オブジェクトの生成を示唆する第1のアノテーションが記載された第1のソースコードを更新対象として抽出する抽出手段と、更新対象として抽出された前記第1のソースコード中の、前記第1のアノテーションが示されたフィールドを対象として、当該フィールドに対応するオブジェクトの生成を直接的に示す第1のコードと、当該オブジェクトの生成を間接的に示す第2のコードと、のいずれかを追加することで、当該第1のソースコードを更新し、当該更新後の第1のソースコードに規定された処理を呼び出す実行コードを生成する更新手段と、を備え、前記更新後の第1のソースコードと、前記実行コードと、に基づきコールグラフが生成される、情報処理装置。
【選択図】
図7
【特許請求の範囲】
【請求項1】
解析対象となる一連のソースコードのうち、オブジェクトの生成を示唆する第1のアノテーションが付加された第1のソースコードを更新対象として抽出する抽出手段と、
更新対象として抽出された前記第1のソースコード中の、前記第1のアノテーションが示されたフィールドを対象として、当該フィールドに対応するオブジェクトの生成を直接的に示す第1のコードと、当該オブジェクトの生成を間接的に示す第2のコードと、のいずれかを追加することで、当該第1のソースコードを更新し、当該更新後の第1のソースコードに規定された処理を呼び出す実行コードを生成する更新手段と、
を備え、
前記更新後の第1のソースコードと、前記実行コードと、に基づきコールグラフが生成される、
情報処理装置。
【請求項2】
前記更新手段は、
前記第1のソースコードに対して前記第1のコードを追加した場合に、
前記更新後の第1のソースコードに規定された処理を直接呼び出すように、前記実行コードを生成する、
請求項1に記載の情報処理装置。
【請求項3】
前記更新手段は、
前記第1のソースコードに対して前記第2のコードを追加した場合に、
当該第2のコードに関連付けて、前記第1のアノテーションが示されたフィールドに対応するオブジェクトの生成を直接的に示すコードが規定された第2のソースコードを生成し、
当該第2のソースコードに規定された処理を呼び出すことで、前記更新後の第1のソースコードに規定された処理を呼び出すように、前記実行コードを生成する、
請求項1に記載の情報処理装置。
【請求項4】
前記第2のコードは、前記第2のソースコードに規定されたクラスの抽象クラスに既定された処理を呼び出すコードであり、
前記クラスは、前記抽象クラスを継承するように、前記第2のソースコードに規定される、
請求項3に記載の情報処理装置。
【請求項5】
前記更新手段は、
更新対象として抽出された前記第1のソースコードにおいて、前記第1のアノテーションが示されたフィールドに対応するオブジェクトを対象として、シングルトンが適用されているか否か判定し、
前記オブジェクトに対してシングルトンが適用されている場合には、前記第2のコードを追加することにより前記第1のソースコードを更新する、
請求項1乃至4のいずれか1項に記載の情報処理装置。
【請求項6】
前記更新手段は、更新対象として抽出された前記第1のソースコードにおいて、前記第1のアノテーションが示されたフィールドを対象として示された、当該フィールドに対応するオブジェクトのスコープを示す第2のアノテーションの規定に基づき、当該フィールドに対応するオブジェクトを対象として、シングルトンが適用されているか否かを判定する、
請求項5に記載の情報処理装置。
【請求項7】
前記更新手段は、更新対象として抽出された前記第1のソースコードに関連付けられた設定ファイルにおける、当該第1のソースコードに示されたフィールドに対応するオブジェクトのスコープを示す属性情報に基づき、当該フィールドに対応するオブジェクトを対象として、シングルトンが適用されているか否かを判定する、
請求項5に記載の情報処理装置。
【請求項8】
情報処理装置が実行する情報処理方法であって、
解析対象となる一連のソースコードのうち、オブジェクトの生成を示唆する第1のアノテーションが付加された第1のソースコードを更新対象として抽出する抽出ステップと、
更新対象として抽出された前記第1のソースコード中の、前記第1のアノテーションが示されたフィールドを対象として、当該フィールドに対応するオブジェクトの生成を直接的に示す第1のコードと、当該オブジェクトの生成を間接的に示す第2のコードと、のいずれかを追加することで、当該第1のソースコードを更新し、当該更新後の第1のソースコードに規定された処理を呼び出す実行コードを生成する更新ステップと、
を含み、
前記更新後の第1のソースコードと、前記実行コードと、に基づきコールグラフが生成される、
情報処理方法。
【請求項9】
コンピュータに、
解析対象となる一連のソースコードのうち、オブジェクトの生成を示唆する第1のアノテーションが付加された第1のソースコードを更新対象として抽出する抽出ステップと、
更新対象として抽出された前記第1のソースコード中の、前記第1のアノテーションが示されたフィールドを対象として、当該フィールドに対応するオブジェクトの生成を直接的に示す第1のコードと、当該オブジェクトの生成を間接的に示す第2のコードと、のいずれかを追加することで、当該第1のソースコードを更新し、当該更新後の第1のソースコードに規定された処理を呼び出す実行コードを生成する更新ステップと、
を実行させ、
前記更新後の第1のソースコードと、前記実行コードと、に基づきコールグラフが生成される、
プログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本開示は、情報処理装置、情報処理方法、及びプログラムに関する。
【背景技術】
【0002】
プログラムの開発や保守に際して、対象となるプログラムを理解するために、当該プログラムにソースコード解析を施したうえで、当該解析の結果を利用する場合がある。このようなソースコード解析の手法の1つとして、プログラム中で生成されたオブジェクトがどのように伝搬していくかを解析する、ポインタ解析と称される手法が知られている。ポインタ解析の結果として出力されるデータとしては、例えば、コールグラフと称されるオブジェクト間の呼び出し関係を示したデータが知られている。
【0003】
また、近年では、プログラム開発を効率よく行うために、アプリケーションフレームワークとも称される、数多くの再利用可能なプログラム部品を有するテンプレートを利用するケースが増えている。
【先行技術文献】
【特許文献】
【0004】
【発明の概要】
【発明が解決しようとする課題】
【0005】
一方で、アプリケーションフレームワークを利用して作成されたプログラムでは、プログラムの実行時にアプリケーションフレームワークによってオブジェクト間の依存関係が構成される。そのため、アプリケーションフレームワークを利用してプログラムが作成される場合に、オブジェクトの生成を示したコードがソースコード上に明示的に規定されない場合がある。このような場合には、ポインタ解析のような所謂静的な解析手法では、正確な解析が困難な場合がある。
【0006】
上記のような課題に対して、特許文献1には、依存性の注入(DI:Dependency Injection)に係る情報を利用して、コールグラフを生成する技術の一例が開示されている。しかしながら、特許文献1に開示された技術ではポインタ解析を行っているわけではないため、必ずしも正確なコールグラフ(より実態に即したコールグラフ)が作成されるとは限らない。
【0007】
本発明は上記の問題を鑑み、静的解析により対象となるソースコードのコールグラフをより好適な態様で生成可能とすることを目的とする。
【課題を解決するための手段】
【0008】
本発明に係る情報処理装置は、解析対象となる一連のソースコードのうち、オブジェクトの生成を示唆する第1のアノテーションが記載された第1のソースコードを更新対象として抽出する抽出手段と、更新対象として抽出された前記第1のソースコード中の、前記第1のアノテーションが示されたフィールドを対象として、当該フィールドに対応するオブジェクトの生成を直接的に示す第1のコードと、当該オブジェクトの生成を間接的に示す第2のコードと、のいずれかを追加することで、当該第1のソースコードを更新し、当該更新後の第1のソースコードに規定された処理を呼び出す実行コードを生成する更新手段と、を備え、前記更新後の第1のソースコードと、前記実行コードと、に基づきコールグラフが生成される。
【発明の効果】
【0009】
本発明によれば、静的解析により対象となるソースコードのコールグラフをより好適な態様で生成することが可能となる。
【図面の簡単な説明】
【0010】
【
図1】情報処理装置の機能の概要について説明するための図である。
【
図2】ソースコードの更新方法の一例について説明するための図である。
【
図3】情報処理装置のハードウェア構成の一例を示した図である。
【
図4】情報処理装置の機能構成の一例を示した機能ブロック図である。
【
図5】情報処理装置の処理の一例を示したフローチャートである。
【
図6】ソースコードの更新に伴いエラーが発生する場合の一例を示した図である。
【
図7】ソースコードの更新方法の一例について説明するための図である。
【
図8A】シングルトンが適用されていない場合の一例を示した図である。
【
図8B】シングルトンが適用されている場合の一例を示した図である。
【
図9】シングルトンの考慮について説明するための図である。
【
図10】シングルトンの適用の可否を判別する仕組みの一例を示した図である。
【
図11】シングルトンの適用の可否を判別する仕組みの一例を示した図である。
【
図12】ソースコードの更新方法の一例について説明するための図である。
【
図13】実行コードの生成方法の一例について説明するための図である。
【発明を実施するための形態】
【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による、解析対象となるソースコードの更新結果の一例を示している。具体的には、ソースコードC121は、解析対象のソースコードに対して情報処理装置100により修正が施されることで更新された後の、当該ソースコードの一例を示している。また、ソースコードC122は、更新後のソースコードC121に規定された処理を呼び出す実行コード(所謂Mainクラスが規定されたコード)である。
フレームワークの中には、実行時にオブジェクト間の依存関係が構成される部分に対してアノテーションが付加されるものがある。本実施形態に係る情報処理装置100は、当該アノテーションに基づき、解析対象として指定された一連のソースコードの中から、更新対象となるソースコードと、当該ソースコード中における更新対象となるコード(例えば、フィールド)とを特定する。そのうえで、情報処理装置100は、更新対象となるコードに関する定義に基づき、当該コードに修正を施す。
【0016】
例えば、
図2(a)に示す例では、フィールドC124に対して、実行時にオブジェクト間の依存関係が構成されることを意味するキーワード「@Autowired」で示しされたアノテーションC123が付加されている。そのため、情報処理装置100は、解析対象として指定された一連のソースコードのうち、アノテーションC123が付加されたソースコードC121を更新対象として抽出する。そのうえで、情報処理装置100は、ソースコードC121内での定義に従い、アノテーションC123が示されたフィールドC124に対して、オブジェクトの生成を示すコードを追加する。具体的には、
図2(a)に示す例では、アノテーションC123が示されたフィールドC124に対して、オブジェクトの生成を直接的に示すコード(例えば、オブジェクトをnewするコード)が追加されている。
この際に、情報処理装置100は、例えば、生成対象とするオブジェクトを、フレームワークが管理対象となるコンポーネントとして扱うクラスに対して付加したアノテーションに基づき特定する。例えば、フィールドC124に設定されるオブジェクトは、クラスAまたはクラスBのオブジェクトとなる。また、
図2(a)に示す例では、クラスBに対して、管理対象となるコンポーネントであることを意味するキーワード「@Component」で示されたアノテーションC125が付加されている。一方で、クラスAに対しては、管理対象となるコンポーネントであることを意味するアノテーションが付加されていない。そのため、情報処理装置100は、フィールドC124に設定されるオブジェクトが、クラスBのオブジェクトであるものと認識し、クラスBのオブジェクトの生成を直接的に示すコードを追加している。
以上のようにして、ソースコードC121が更新される。
また、情報処理装置100は、対象となるソースコードの更新結果に基づき、コールグラフ生成時の起点となる実行コードに相当するソースコードC122を生成する。具体的には、情報処理装置100は、少なくとも更新がなされたコードの呼び出しに係るコードが呼び出しの対象とする実行コードとして、ソースコードC122を生成する。例えば、
図2(a)に示す例の場合には、ソースコードC121中のフィールドC124が更新の対象となっており、コードC125にて当該フィールドC124に保持されたオブジェクトが参照されている。そのため、情報処理装置100は、更新対象となるフィールドC124が規定されたクラスXのオブジェクトを生成し、当該オブジェクトの処理としてコードC125として規定された処理を呼び出すコードC126が規定されたソースコードC122を生成している。
なお、上述した要件を満たす実行コード(ソースコードC122相当のコード)を生成することが可能であれば、その方法は特に限定はされない。例えば、以下に示す参考文献に開示された手法を利用することで、上述した要件を満たす実行コードを生成することも可能である。
・参考文献: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」で示しされたアノテーションC123が、オブジェクトの生成を示唆する「第1のアノテーション」の一例に相当する。すなわち、同アノテーションC123が付加されたソースコードC121、すなわち更新対象となるソースコードが、「第1のソースコード」の一例に相当する。また、アノテーションC123が示されたフィールドC124に対して追加された、オブジェクトの生成を直接的に示すコードが、「第1のコード」の一例に相当する。
【0017】
なお、アノテーションC123として付加されるキーワードについては、適用されるフレームワークに応じて異なる場合がある。そのため、情報処理装置100は、適用されるフレームワークに応じて、アノテーションC123として抽出するキーワードを適宜変更してもよい。また、情報処理装置100が、適用されるフレームワークを識別することが可能であれば、その方法についても特に限定はされない。具体的な一例として、情報処理装置100は、ユーザからの指示に応じて適用されるフレームワークを認識し、当該フレームワークに応じてアノテーションC123として抽出するキーワードを変更してもよい。また、他の一例として、情報処理装置100は、解析対象として指定されたソースコードに含まれる情報や、当該ソースコードに紐付けられた設定ファイル等を解析することで、適用されるフレームワークを認識してもよい。
【0018】
図2(b)は、更新前のソースコードのプログラムが実行された場合における、オブジェクト間の呼び出し関係を示すコールグラフの一例を示している。また、
図2(c)は、
図2(a)に示した更新後のソースコードを対象としたポインタ解析(静的解析)により生成されるコールグラフの一例を示している。
図2(b)と
図2(c)とを比較するとわかるように、
図2(c)に示すコールグラフでは、実行コードC122からの呼び出しに係るコールグラフが含まれるものの、その他のコールグラフについては、
図2(b)に示すコールグラフと同様となっている。すなわち、
図2(a)に示すように解析対象のソースコードが更新されることで、ポインタ解析を利用する状況下においても、実態に即したコールグラフを生成することが可能となる。なお、以降では、本実施形態に係る情報処理装置100について、より詳しく説明をする。
【0019】
(ハードウェア構成)
図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を介して相互に接続されている。
【0020】
CPU910は、情報処理装置100の各種動作を制御する中央演算装置である。例えば、CPU910は、情報処理装置100全体の動作を制御してもよい。ROM920は、CPU910で実行可能な制御プログラムやブートプログラム等を記憶する。RAM930は、CPU910の主記憶メモリであり、ワークエリア又は各種プログラムを展開するための一時記憶領域として用いられる。
【0021】
補助記憶装置940は、各種データや各種プログラムを記憶する。補助記憶装置940は、HDD(Hard Disk Drive)や、SSD(Solid State Drive)に代表される不揮発性メモリ等のような、各種データを一時的または持続的に記憶可能な記憶デバイスにより実現される。
【0022】
出力装置950は、各種情報を出力する装置であり、ユーザに対する各種情報の提示に利用される。例えば、出力装置950は、ディスプレイ等の表示デバイスにより実現され得る。この場合には、出力装置950は、各種表示情報を表示させることで、ユーザに対して情報を提示する。また、他の一例として、出力装置950は、音声や電子音等の音を出力する音響出力デバイスにより実現されてもよい。この場合には、出力装置950は、音声や電信等の音を出力することで、ユーザに対して情報を提示する。また、出力装置950として適用されるデバイスは、ユーザに対して情報を提示するために利用する媒体に応じて適宜変更されてもよい。
【0023】
入力装置960は、ユーザからの各種指示の受け付けに利用される。本実施形態では、入力装置960は、マウス、キーボード、タッチパネル等の入力デバイスを含む。また、他の一例として、入力装置960は、マイクロフォン等の集音デバイスを含み、ユーザが発話した音声を集音してもよい。この場合には、集音された音声に対して音響解析や自然言語処理等の各種解析処理が施されることで、この音声が示す内容がユーザからの指示として認識される。また、入力装置960として適用されるデバイスは、ユーザからの指示を認識する方法に応じて適宜変更されてもよい。また、入力装置960として複数種類のデバイスが適用されてもよい。
【0024】
ネットワークI/F970は、外部の装置とのネットワークを介した通信に利用される。なお、ネットワークI/F970として適用されるデバイスは、通信経路の種別や適用される通信方式に応じて適宜変更されてもよい。
【0025】
CPU910が、ROM220または補助記憶装置940に記憶されたプログラムをRAM930に展開し、このプログラムを実行することで、
図4を参照して後述する情報処理装置の機能構成や、
図5を参照して後述する情報処理装置の処理等が実現される。
【0026】
(機能構成)
図4を参照して、本実施形態に係る情報処理装置100の機能構成の一例について説明する。
図4に示すように、本実施形態に係る情報処理装置100は、制御部110と、コールグラフ生成部120とを含む。
【0027】
制御部110は、解析対象となる一連のソースコードD210の入力を受け付け、当該ソースコードD210に対して
図2を参照して説明した更新を施したうえで、更新後のソースコードD220を所定の出力先に出力する。具体的には、制御部110は、解析部111と、更新部112とを含む。
【0028】
解析部111は、解析対象となる一連のソースコードD210に対して所定の解析を施すことで、一連のソースコードD210の中から更新対象となるソースコードと、当該ソースコード中の更新対象となるコードとを特定する。具体的には、解析部111は、
図2(a)を参照して説明したように、所定のアノテーションが付加されたソースコードを更新の対象とするソースコードとして抽出し、当該ソースコードにおいて当該アノテーションが示されたコードを更新の対象とするコードとして特定する。
また、解析部111は、解析対象となる一連のソースコードD210と依存関係のある、当該一連のソースコードD210に含まれていない他のソースコードが存在する場合には、当該他のソースコードについても解析対象に含めてもよい。具体的な一例として、解析部111は、プロジェクト等のようなソースコードの管理に利用される管理単位により解析対象となる一連のソースコードが指定された場合に、設定ファイル等を利用して当該管理単位間の依存関係を特定してもよい。そのうえで、解析部111は、解析対象として指定された管理単位と依存関係のある他の管理単位が解析対象に含まれていない場合に、当該他の管理単位についても解析対象に含めてもよい。
【0029】
更新部112は、解析部111による更新対象となるソースコード及び当該ソースコード中のコードの特定結果に基づき、当該ソースコードに対して
図2(a)を参照して説明したように、オブジェクトの生成に係るコード(例えば、オブジェクトの生成を直接的に示すコード)を追加する更新を行う。また、更新部112は、更新対象となるソースコードの更新結果を踏まえ、少なくとも当該ソースコードを対象としてコールグラフを生成するための起点となる実行コード(所謂Mainクラスが規定されたコード)を生成する。そして、更新部112は、更新後のソースコードを含む解析対象となる一連のソースコードと、生成した実行コードとを、コールグラフを生成するための一連のソースコードD220として所定の出力先に出力する。例えば、
図4に示す例では、更新部112は、コールグラフを生成するための一連のソースコードD220を、後述するコールグラフ生成部120に出力している。
【0030】
コールグラフ生成部120は、制御部110により少なくとも一部のソースコードの更新がなされた、コールグラフを生成するための一連のソースコードD220を対象として、所謂ポインタ解析のような静的解析によりコールグラフを生成する。なお、ソースコードを解析することで所謂コールグラフを生成することが可能であれば、その方法(例えば、ソースコードの解析方法)については特に限定はされない。すなわち、コールグラフの生成に公知のロジックが適用されてもよい。そのため、例えば、入力された一連のソースコードを分析してコールグラフを生成する公知のツールが、コールグラフ生成部120として適用されてもよい。以上のようにして、コールグラフ生成部120は、一連のソースコードD220を入力としてコールグラフD230を生成し、生成した当該コールグラフD230を所定の出力先に出力する。
【0031】
なお、
図4に示す構成はあくまで一例であり、必ずしも本実施形態に係る情報処理装置100の機能構成を限定するものではない。
例えば、
図4に示した一連の構成要素が、複数の装置が協働することで実現されてもよい。具体的な一例として、コールグラフ生成部120に相当する構成要素が、情報処理装置100以外の他の装置により実現されてもよい。この場合には、制御部110を含む情報処理装置100は、コールグラフを生成するための一連のソースコードD220を、ネットワークを介して接続された当該他の装置に送信してもよい。また、他の一例として、制御部110は、コールグラフを生成するための一連のソースコードD220を、所定の記憶装置(例えば、データ管理のためのサーバ等)に出力してもよい。この場合には、コールグラフ生成部120を含む他の装置は、当該記憶装置からコールグラフの生成対象となる一連のソースコードを取得してもよい。
また、他の一例として、
図4に示した一連の構成要素のうち、少なくとも一部の構成要素の処理負荷が複数の装置に分散されてもよい。
また、
図4に示した一連の構成要素のうち、少なくとも一部の構成要素が、クラウドサービスのような所謂ネットワークサービスにより実現されてもよい。
【0032】
(処理)
図5を参照して、本実施形態に係る情報処理装置100の処理の一例について説明する。
S110において、制御部110は、解析対象となる一連のソースコードD210の入力を受け付ける。また、このとき制御部110は、解析対象となる一連のソースコードD210と依存関係を有する他のソースコードが存在するか否かを確認し、当該他のソースコードを解析対象に含めてもよい。
【0033】
S120において、解析部111は、S110に解析対象として入力を受け付けた一連のソースコードD210に対して所定の解析処理を施すことで、更新対象となるソースコードと、当該ソースコード中の更新箇所(すなわち、更新対象となるコード)とを特定する。具体的には、解析部111は、所定のアノテーションC123が付加されたソースコードを解析対象のソースコードとして抽出し、当該ソースコード中の当該アノテーションC123が示されたコードを更新箇所として特定する。
【0034】
S130において、更新部112は、S120における更新対象となるソースコード及び更新箇所の特定結果に基づき、当該ソースコードに対して更新箇所に示されたコードに対応するオブジェクトの生成に係るコードを追加することで、当該ソースコードを更新する。また、更新部112は、更新対象となるソースコードの更新結果を踏まえ、少なくとも当該ソースコードを対象としてコールグラフを生成するための起点となる実行コードを生成する。そして、更新部112は、更新後のソースコードを含む解析対象となる一連のソースコードと、生成した実行コードとを、コールグラフを生成するための一連のソースコードとして所定の出力先に出力する。
以上のようにして、更新部112から出力された一連のソースコードは、例えば、コールグラフ生成部120によるコールグラフの生成に利用される。
【0035】
(変形例)
本実施形態の変形例として、情報処理装置100が実行コードの生成に際して、フレームワークが解析対象のソースコードに付加したアノテーションを利用して、当該実行コード内で呼び出す処理を特定する方法の一例について説明する。例えば、
図13は、本変形例に係る情報処理装置の機能の概要について説明するための説明図である。
【0036】
図13(a)に示すソースコードC151は、解析対象となるソースコードの一例を示している。ソースコードC151では、
図1(a)に例示したソースコードC111と同様に、クラスXのコード内において、クラスBのオブジェクトのフィールドC154と、フィールドC154に保持されるオブジェクトの処理(メソッド)を呼び出すコードC158とが規定されている。
また、上記クラスXには、「@Controller」で示されたアノテーションC155が付加されている。このアノテーションC155は、アプリケーションの実行の起点となるクラスに付与されるアノテーションであり、例えば、HTTPリクエストに対して最初に呼び出されクラスに付与され得る。
また、上記コードC158には、キーワード「@RequestMapping」で示されたアノテーションC156が付加されている。このアノテーションC156は、アノテーションC155に関連付けて規定されており、HTTPリクエストを受け取って処理するメソッドに対して付加され、どのHTTPメソッドのリクエストを処理するかが「method」属性により指定される。また、アノテーションC156と同様に、どのHTTPメソッドのリクエストを処理するかを指定可能な他のアノテーションとして、キーワード「@GetMapping」、「@PostMapping」、「@PutMapping」、「@DeleteMapping」、及び「@PatchMapping」等で示されるアノテーションが挙げられる。本変形例では、これらのアノテーションについても、アノテーションC156と同様に扱うものとする。
なお、@Controllerアノテーションは、@Componentアノテーションを内包するアノテーションである。すなわち、@Controllerアノテーションが付与されたクラスXも、コンポーネントとして管理対象となる。
【0037】
図13(b)は、本変形例に係る情報処理装置100による、解析対象となるソースコードの更新結果の一例を示している。具体的には、ソースコードC152は、解析対象のソースコードに対して情報処理装置100により修正が施されることで更新された後の、当該ソースコードの一例を示している。また、ソースコードC153は、更新後のソースコードC152に規定された処理を呼び出す実行コードである。
【0038】
ソースコードC152では、
図1及び
図2を参照して説明した例と同様に、フィールドC154に対して、クラスBのオブジェクトの生成を直接的に示すコードが追加されることで更新がなされている。なお、ソースコードC151をソースコードC152に更新する方法については、
図1及び
図2を参照して説明した例と同様のため、詳細な説明は省略する。
【0039】
また、本変形例に係る情報処理装置100は、実行コードC153の生成に際して、アノテーションC155及びC156に基づき、当該実行コードC153にて呼び出す処理を特定する。
具体的には、情報処理装置100は、解析対象となるソースコードC151に付加されたアノテーションC155に基づき、処理の呼び出し対象となるクラスを特定する。
図13に示す例の場合には、情報処理装置100は、クラスXを対象として特定することとなる。
次いで、情報処理装置100は、解析対象となるソースコードC151に付加されたアノテーションC156に基づき、対象として特定したクラスの一連の処理のうち、実行コードにて呼び出す処理を特定する。例えば、
図13に示す例では、クラスXにおいてコードC158により示された処理に対してアノテーションC156が付加されている。そのため、情報処理装置100は、クラスXのオブジェクトの処理として、コードC158により示された処理が呼び出されるように、実行コードC153を生成する。
【0040】
以上、本実施形態の変形例として、情報処理装置100が実行コードの生成に際して、フレームワークが解析対象のソースコードに付加したアノテーションを利用して、当該実行コード内で呼び出す処理を特定する方法の一例について説明した。
【0041】
(作用効果)
以上説明したように、本実施形態に係る情報処理装置100は、解析対象となる一連のソースコードから、所定のアノテーションが付加されたソースコードを更新対象のソースコードとして抽出し、当該アノテーションが付加されたコードを更新箇所として特定する。そのうえで、情報処理装置100は、更新対象となるソースコード中の特定した更新箇所に対して、当該更新箇所に示されたコード(例えば、フィールド)に、当該コードに対応するオブジェクトの生成に係るコード(例えば、オブジェクトの生成を直接的に示すコード)を追加することで当該ソースコードを更新する。また、情報処理装置100は、更新対象となるソースコードの更新結果を踏まえ、少なくとも当該ソースコードを対象としてコールグラフを生成するための起点となる実行コードを生成する。そのうえで、情報処理装置100は、更新後のソースコードを含む解析対象となる一連のソースコードと、生成した実行コードとを、コールグラフを生成するための一連のソースコードとして所定の出力先に出力する。以上のようにして生成された一連のソースコードを利用することで、
図2を参照して説明したように、コールグラフの生成にポインタ解析のような静的解析が利用される場合においても、より実態に即したコールグラフを生成することが可能となる。
【0042】
<第2の実施形態>
本開示の第2の実施形態について説明する。前述した実施形態では、対象となるソースコードに対してオブジェクトの生成を直接的に示すコード(例えば、オブジェクトをnewするコード)を追加することで、当該ソースコードの更新がなされていた。一方で、このように対象となるソースコードに対してオブジェクトの生成を直接的に示すコードが追加されることで、当該ソースコードのコンパイル時にエラーが発生する(すなわち、コンパイルに失敗する)場合がある。本実施形態では、このような状況を鑑み、対象となるソースコードの更新方法の他の一例について説明する。なお、本実施形態では、前述した第1の実施形態と特に異なる部分に着目して説明を行い、当該第1の実施形態と実質的に同様の部分については詳細な説明は省略する。
【0043】
まず、
図6を参照して、対象となるソースコードに対してオブジェクトの生成を直接的に示すコードが追加されることで、当該ソースコードのコンパイル時にエラーが発生する場合の一例について説明する。
図6に示す例では、クラスA及びXがプロジェクト1において管理されており、クラスAを継承するクラスBがプロジェクト2において管理されている。なお、本開示における「継承」とは、オブジェクト指向を構成する概念の一つとして規定される継承に相当し、あるオブジェクトに他のオブジェクトの特性を引き継がせることを意味する。すなわち、本開示において継承とは、クラスの定義に係る共通部分を、別クラスにまとめることを意味する。また、クラスXでは、クラスBのオブジェクトが保持されるフィールドが規定されており、当該フィールドに保持されたオブジェクトの処理として呼び出されるコードが示されているものとする。このような場合において、前述した第1の実施形態と同様に、クラスXに対して、クラスBのオブジェクトの生成を直接的に示すコード(例えば、クラスBのオブジェクトをnewするコード)が追加されたものとする。このような状況下で、プロジェクト1を対象としてソースコードのコンパイルが実行されると、当該プロジェクト1にはクラスBが規定されておらず、プロジェクト1がプロジェクト2に依存していないため、クラスXにてクラスBを参照できず、これによりエラーとなりコンパイルが失敗することとなる。
【0044】
そこで、本実施形態では、上記に例示したような状況下においても、対象となる一連のソースコードをコンパイル可能な状態を維持しつつ、ポインタ解析のような静的解析により当該一連のソースコードのコールグラフを生成可能とする仕組みの一例について説明する。
【0045】
例えば、
図7は、本実施形態に係る情報処理装置100による対象となるソースコードの更新方法の一例について説明するための図である。具体的には、
図7(a)は、本実施形態に係る情報処理装置100によるソースコードの更新内容の一例を示している。
【0046】
図7(a)において、プロジェクトC331は、解析対象となる一連のソースコードを管理するためのプロジェクト(管理単位)を模式的に示している。なお、
図7(a)に示す例では、便宜上、プロジェクトC331に含まれる一連のソースコードのうち、特にポイントとなる一部のソースコードを抜粋して図示している。情報処理装置100の解析部111は、第1の実施形態と同様に、所定のアノテーションC333が付加されたソースコードを更新の対象とするソースコードとして抽出し、当該ソースコードにおいて当該アノテーションC333が示されたコードC335(フィールド)を更新の対象とするコード(換言すると、更新箇所)として特定する。そのうえで、情報処理装置100の更新部112は、更新対象のコードC335の特定結果に基づき、当該コードC335が示すオブジェクトの生成を間接的に示すコードを追加する。
具体的には、更新部112は、更新対象のコードに対応する抽象クラスC334をプロジェクトC331に追加したうえで、当該抽象クラスC334に対して対象となるオブジェクトの生成処理を呼び出すコードを追加する。また、更新部112は、更新対象のコードC335に対して、生成した抽象クラスC334の上記処理を呼び出すコードを追加する。
なお、
図7(a)において、アノテーションC333が示されたコードC335(フィールド)を対象として追加された、オブジェクトの生成を間接的に示すコード(別途追加された抽象クラスC334の処理を呼び出すコード)が、「第2のコード」の一例に相当する。また、抽象クラスC334を継承するクラスC336が規定されたソースコード、すなわち、オブジェクトの生成を直接的に示すコードが示された更新対象のソースコードとは異なる他のソースコードが、「第2のソースコード」の一例に相当する。
【0047】
また、更新部112は、解析対象のプロジェクトC331とは別のプロジェクトC332を生成し、当該プロジェクトC332に対して、抽象クラスC334を継承するクラスC336と、コールグラフを生成するための起点となる実行コードC337とを追加する。具体的には、更新部112は、クラスC336に対して、抽象クラスC334にて定義されたコードにより呼び出される処理のコードを追加し、当該コード内に対象となるオブジェクトの生成を直接的に示すコード(例えば、オブジェクトをnewするコード)を追加する。また、更新部112は、実行コードC337において、クラスC336のオブジェクトを生成し、当該オブジェクトの処理として、更新対象のソースコード中のコードC335が示すオブジェクトに対応付けて追加した、抽象クラスC334の処理を呼び出すコードを規定する。
【0048】
図7(b)は、更新前のソースコードのプログラムが実行された場合における、オブジェクト間の呼び出し関係を示すコールグラフの一例を示している。また、
図7(c)は、
図7(a)に示した更新後のソースコードを対象としたポインタ解析(静的解析)により生成されるコールグラフの一例を示している。
図7(b)と
図7(c)とを比較するとわかるように、コールグラフ全体としては異なるものの、
図7(c)に示すコールグラフには、部分的なコールグラフC338として、
図7(b)に示すコールグラフと実質的に同様のコールグラフが含まれる。すなわち、
図7(c)に示すコールグラフには、本来想定されるコールグラフと実質的に同様のコールグラフC338と、分析のために追加されたコードに基づき生成されるコールグラフとが含まれることとなる。このような前提のもとで、余分な部分を省いて本来のコールグラフと実質的に同等のコールグラフを得るためには、例えば、
図7(c)に示す一連のコールグラフから、パッケージ名等を抽出条件として、解析対象のソースコードのコールグラフを抽出すればよい。このように、本実施形態においても、ポインタ解析を利用する状況下であったとしても、実態に即したコールグラフ(すなわち、コールグラフC338)を生成することが可能となる。
また、
図7(a)に例示するように、解析対象となるソースコードが更新されることで、更新後においてもプログラム言語の文法上は整合性が維持されるため、当該ソースコードのコンパイル時にエラーが発生しないこととなる。具体的には、
図7(a)に例示する状態にて、プロジェクトC331を対象としてコンパイルが実行された場合においても、当該コンパイルは正常に終了することとなる。
すなわち、本実施形態に係る情報処理装置100に依れば、対象となる一連のソースコードをコンパイル可能な状態を維持しつつ、ポインタ解析のような静的解析により当該一連のソースコードのコールグラフを生成することが可能となる。
【0049】
<第3の実施形態>
本開示の第3の実施形態について以下に説明する。本実施形態では、第2の実施形態をさらに拡張した実施形態として、所謂シングルトン(Singleton)と称される設計思想(デザインパターン)に基づきソースコードが規定されている場合を考慮して、解析対象となるソースコードのコールグラフを生成可能とするための仕組みの一例について説明する。なお、本実施形態では、前述した第1の実施形態や第2の実施形態と特に異なる部分に着目して説明を行い、当該第1の実施形態や当該第2の実施形態と実質的に同様の部分については詳細な説明は省略する。
【0050】
まず、本実施形態の特徴をよりわかりやすくするために、
図8A及び
図8Bを参照して、シングルトンが適用されない場合と、シングルトンが適用される場合との違いについて概要を説明する。
【0051】
例えば、
図8Aは、シングルトンが適用されていない場合の一例を示した図である。
具体的には、
図8A(a)は、解析対象となるソースコードの一例を示した図である。
図8A(a)に示す例では、前提として、オブジェクトx及びyそれぞれに対して、Houseクラスのオブジェクト(以下、houseオブジェクトとも称する)のpetフィールドにDogクラスのオブジェクトが設定されている。このような状況下で、オブジェクトxを対象として、houseオブジェクトのpetフィールドに設定されているオブジェクトを、Catクラスのオブジェクトに置き換えている(すなわち、Catクラスのオブジェクトをnewして代入している)。なお、参考として、
図9に、
図8Aと後述する
図8Bとのそれぞれに示すソースコードにて定義される一連のオブジェクトのソースコードの一例を示す。
図8A(b)は、シングルトンが適用されていない状況下で、
図8A(a)に示すソースコードに対してポインタ解析を適用した結果の一例を示している。シングルトンが適用されていない場合には、オブジェクトx及びyそれぞれに対して個別にhouseオブジェクトが生成されるため、
図8A(b)に示すように、オブジェクトx及びyそれぞれからは、互いに異なるhouseオブジェクトが呼び出されることとなる。すなわち、オブジェクトxについては、houseオブジェクトからCatクラスのオブジェクトの生成処理が呼び出され、オブジェクトyについては、houseオブジェクトからDogクラスのオブジェクトの生成処理が呼び出されることとなる。
図8A(c)は、
図8A(b)を参照して説明したポインタ解析の結果として出力されるコールグラフの一例を示している。すなわち、Mainクラスのmainメソッドからは、オブジェクトxの処理として呼び出されるCatクラスのcryメソッドと、オブジェクトyの処理として呼び出されるDogクラスのcryメソッドとがコールグラフに出力されることとなる。
【0052】
また、
図8Bは、シングルトンが適用されている場合の一例を示した図である。
具体的には、
図8B(a)は、解析対象となるソースコードの一例を示した図である。
図8B(a)に示す例は、コードの記載上は
図8A(a)に示す例と同様であり、シングルトンが適用されているか否かが
図8A(a)に示す例と異なる。
図8B(b)は、シングルトンが適用されている状況下で、
図8A(a)に示すソースコードに対してポインタ解析を適用した結果の一例を示している。シングルトンが適用されている場合には、オブジェクトx及びyそれぞれに対して共通のhouseオブジェクトが適用されるため、
図8B(b)に示すように、オブジェクトx及びyそれぞれからは、共通のhouseオブジェクトが呼び出されることとなる。
図8B(c)は、
図8B(b)を参照して説明したポインタ解析の結果として出力されるコールグラフの一例を示している。すなわち、Mainクラスのmainメソッドからは、オブジェクトx及びyそれぞれの処理として共通に呼び出されるCatクラスのcryメソッドがコールグラフに出力され、Dogクラスのcryメソッドについてはコールグラフに出力されないこととなる。
なお、以降の説明では、便宜上、シングルトンが適用されている場合のオブジェクトをシングルトンオブジェクトとも称する。すなわち、
図8Bに示す例では、houseオブジェクトはシングルトンオブジェクトとなる。これに対して、
図8Aに示す例では、houseオブジェクトはシングルトンオブジェクトではないこととなる。
【0053】
図8A及び
図8Bを比較するとわかるように、共通のソースコードが適用される場合においても、シングルトンが適用されているか否かに応じてプログラムの動作が異なり、結果として出力されるコールグラフも異なることとなる。このような状況を鑑み、本実施形態では、解析対象となるソースコードに対してシングルトンが適用されているか否かを加味して、より実態に即したコールグラフが生成されるように当該ソースコードを更新する場合の一例について説明する。
【0054】
まず、本実施形態に係る情報処理装置100が、解析対象となるソースコードに対してシングルトンが適用されているか否かを判別するための仕組みの一例について説明する。例えば、フレームワークの中には、対象となるプログラムのスコープを、ソースコードに付加するアノテーションや、ソースコードに関連付けられた設定ファイル等により指定することが可能なものがある。このような場合には、例えば、同スコープの設定としてシングルトンを適用するか否かを設定可能な場合がある。そのため、例えば、情報処理装置100は、このようなフレームワークの仕組みを利用することで、対象となるソースコードに対してシングルトンが適用されているか否かを判別してもよい。
【0055】
例えば、
図10は、フレームワークによりソースコード中に付加されたアノテーションに基づき、当該ソースコードに対してシングルトンが適用されているか否かを判別する仕組みの一例を示した図である。
図10に示す例では、対象となるソースコードにより実現されるプログラムのスコープの指定を意味するキーワード「@Scope」で示されたアノテーションを付加するか否かや、当該アノテーションに指定されたパラメータに応じて、シングルトンが適用されているか否かが示される。
具体的には、
図10(a)及び
図10(b)に示すように、アノテーション「@Scope」は、パラメータとして属性値を指定することが可能であり、当該パラメータとして指定された属性値に応じて、対象となるソースコードのスコープが決定される。そのうえで、このアノテーション「@Scope」に対して、属性値としてシングルトンの適用を意味する「singleton」が指定されている場合には、対象となるソースコードに対してシングルトンが適用されていることを意味することとなる。すなわち、
図10(a)に示す例では、アノテーション「@Scope」は、シングルトンが適用されないことを意味している。また、
図10(b)に示す例では、アノテーション「@Scope」は、シングルトンが適用されることを意味している。そのため、情報処理装置100は、対象となるソースコードに付加された上記アノテーションに対して指定されている属性値に基づき、当該ソースコードに対してシングルトンが適用されているか否かを判別してもよい。
また、
図10(c)に示すようにアノテーション「@Scope」に対して属性値が指定されていない場合や、
図10(d)に示すようにアノテーション「@Scope」が付加されていない場合も想定され得る。このような場合には、スコープとしてデフォルトの設定が適用されることとなる。そのため、このような場合には、情報処理装置100は、当該デフォルトの設定としてシングルトンが適用されていることを意味するか否かに応じて、対象となるソースコードに対してシングルトンが適用されているか否かを判別してもよい。具体的には、
図10(c)や
図10(d)に示す例において、デフォルトの設定としてシングルトンが適用されていることを意味する場合には、情報処理装置100は、対象となるソースコードに対してシングルトンが適用されていると判定することとなる。
【0056】
他の一例として、
図11は、フレームワークにより対象となるソースコードに関連付けられた設定ファイルに規定されたスコープに関する設定に基づき、当該ソースコードに対してシングルトンが適用されているか否かを判別する仕組みの一例を示した図である。
図11に示す例では、クラスごとの種々の設定を規定する「bean」タグに対して、対象となるソースコードにより実現されるプログラムのスコープの指定を意味するキーワード「scope」で示された属性を指定するか否かや、当該属性に指定された属性値に応じて、シングルトンが適用されているか否かが示される。
具体的には、
図11(a)及び
図11(b)に示すように、「bean」タグの「scope」属性には属性値が指定され、当該属性値に応じて、対象となるソースコードのスコープが決定される。そのうえで、この「scope」属性に対して、属性値としてシングルトンの適用を意味する「singleton」が指定されると、対象となるソースコードに対してシングルトンが適用されることを意味することとなる。すなわち、
図11(a)に示す例では、「scope」属性は、シングルトンが適用されないことを意味している。また、
図11(b)に示す例では、「scope」属性は、シングルトンが適用されることを意味している。そのため、情報処理装置100は、対象となるソースコードに関連付けられた設定ファイルを参照し、同設定ファイル内にて「bean」タグの「scope」属性に指定されている属性値に基づき、当該「bean」タグが示すクラス(換言すると、当該クラスのソースコード)に対してシングルトンが適用されているか否かを判別してもよい。
また、
図11(c)に示すように、「bean」タグに対して「scope」属性が指定されていない場合も想定され得る。このような場合には、スコープとしてデフォルトの設定が適用されることとなる。そのため、このような場合には、情報処理装置100は、当該デフォルトの設定としてシングルトンが適用されていることを意味するか否かに応じて、対象となるソースコードに対してシングルトンが適用されているか否かを判別してもよい。具体的には、
図11(c)に示す例の場合において、デフォルトの設定としてシングルトンが適用されていることを意味する場合には、情報処理装置100は、対象となるソースコードに対してシングルトンが適用されていると判定することとなる。
【0057】
続いて、
図12を参照して、本実施形態に係る情報処理装置100による対象となるソースコードの更新方法の一例について説明する。
図12において、ソースコードC501は、解析対象のソースコードを模式的に示している。なお、
図12では図示を省略しているが、
図6及び
図7を参照して説明した例と同様に、クラスA及びクラスBが別途規定されているものとする。また、クラスXには、クラスAを継承したクラスBのオブジェクトが保持されるフィールドbが規定されるおり、同フィールドに対して所定のアノテーション(@Autowired)が示されているものとする。また、
図12では図示を省略しているが、更新後のソースコードC501を対象としたコールグラフを生成する際の起点となる実行コード(Mainクラス)が別途追加されることとなる。
【0058】
情報処理装置100の解析部111は、解析対象として指定された一連のソースコードのうち、所定のアノテーション(@Autowired)が付加されたソースコードC501を抽出し、当該アノテーションが示されたコード(フィールド)を更新対象のコード(換言すると、更新箇所)として特定する。なお、
図12に示す例では、クラスAを継承したクラスBのオブジェクトが設定されるフィールドbが、更新対象のコードとして特定されたものとする。そのうえで、情報処理装置100の更新部112は、更新対象のコードの特定結果に基づき、当該コードが示すオブジェクトの生成を間接的に示すコードを追加する。
具体的には、更新部112は、更新対象のコードに対応する抽象クラスC503を、ソースコードC501と同様のプロジェクト(以下、プロジェクト1とする)に追加したうえで、当該抽象クラスC503に対して対象となるオブジェクトの生成処理を呼び出すコードを追加する。なお、
図12に示す例では、便宜上、ソースコードC503に対してコードC508とコードC509とが追加されている状態を例示している。コードC508は、後述するソースコードC502においてコードC506として実体的な処理が規定されるコード(オーバーライドされるコード)である。また、コードC509は、当該ソースコードC502においてコードC507として実体的な処理が規定されるコード(オーバーライドされるコード)である。シングルトンが適用されている場合には、コードC508及びC509の双方が使用される。これに対して、シングルトンが適用されていない場合にはC509のみが使用される。更新部112は、ソースコードC501に対してシングルトンが適用されているか否かの判別結果に基づき上述の通りコードC508及びC509の出力を選択的に切り替えてもよいし、シングルトンが適用されているか否かに関わらず双方を追加してもよい。
また、更新部112は、ソースコードC501における更新対象のコード(フィールドb)に対して、生成した抽象クラスC503の上記処理を呼び出すコードを追加する。なお、
図12に示す例では、便宜上、ソースコードC501に対してシングルトンが適用されている場合のコードC504と、当該ソースコードC501に対してシングルトンが適用されていない場合のコードC505とを例示している。更新部112は、ソースコードC501に対してシングルトンが適用されているか否かの判別結果に基づき、当該ソースコードC501に対してコードC504及びC505のいずれかを追加する。
【0059】
また、更新部112は、解析対象のソースコードC501が含まれるプロジェクト1とは別のプロジェクト(以下、プロジェクト3とも称する)を生成し、当該プロジェクト3に対して、抽象クラスC503を継承するクラスC502を追加する。具体的には、更新部112は、クラスC502に対して、抽象クラスC503にて定義されたコードにより呼び出される処理のコードを追加する。なお、前述したように、抽象クラスC503には、ソースコードC501に対してシングルトンが適用されているか否かに応じて、コードC508(シングルトンの場合)及びC509(シングルトンでない場合)のいずれかが追加される。そのため、更新部112は、抽象クラスC503に追加したコードに応じて、クラスC502に追加するコードを適宜変更する。
図12に示すソースコードC502の例では、便宜上、ソースコードC501に対してコードC506とコードC507とが追加されている状態を例示している。具体的には、コードC506としては、フィールドbに保持されたクラスB(クラスAを継承したクラス)のオブジェクトを返却するコードが追加される。また、同フィールドbには、詳細を後述するコードC507により生成された(newされた)クラスBのオブジェクトが保持される。また、コードC507としては、クラスB(クラスAを継承したクラス)のオブジェクトを生成するコードが追加される。シングルトンが適用されている場合には、コードC506及びC507の双方が使用される。これに対して、シングルトンが適用されていない場合にはC507のみが使用される。更新部112は、シングルトンが適用されているか否かの判定結果に基づき上述の通りコードC506及びC507の出力を選択的に切り替えてもよいし、シングルトンが適用されているか否かに関わらず双方を追加してもよい。なお、このコードの出力に係る制御の切り替えについては、ソースコードC503におけるコードC508及びC509の出力に係る制御の切り替えにあわせて適用することが望ましいことは言うまでもない。
また、
図12に示す例では図示を省略しているが、プロジェクト3には、
図7を参照して説明した例と同様の技術思想に基づき、更新後のソースコードC501を対象としたコールグラフを生成する際の起点となる実行コード(Mainクラス)が追加される。なお、同実行コードは、
図7に示す例と同様のため、詳細な説明は省略する。
【0060】
以上のようにして、解析対象となるソースコードが更新されることで、当該ソースコードを対象としたコールグラフを、当該ソースコードに対してシングルトンが適用されているか否かに応じて、より実態に即した態様で出力することが可能となる。
なお、上述した例では、情報処理装置100が、解析対象となるソースコードに付加されたアノテーションや、当該ソースコードに関連付けられた設定ファイル等に基づき、当該ソースコードに対してシングルトンが適用されているか否かを判別する場合の一例について説明した。一方で、情報処理装置100が、解析対象となるソースコードに対してシングルトンが適用されているか否かを判別することが可能であれば、その方法は特に限定はされない。例えば、情報処理装置100は、ユーザからの指示を受け付けることで、当該指示に基づき、対象となるソースコードに対してシングルトンが適用されているか否かを判別してもよい。
【0061】
<補足>
なお、本開示の各実施形態では、主にJavaと称されるプログラム言語により規定されたソースコードを解析の対象とする場合に着目して説明したが、オブジェクトの生成が伴うプログラム言語で規定されたソースコードであれば、対象とするプログラム言語は特に限定はされない。具体的な一例として、C++やObjective-C等により規定されたソースコードを対象として、本開示に係る技術を適用することも可能である。なお、その場合には、解析対象となるソースコードに適用されるプログラム言語に応じて、コードの記載方法が異なるため、対象となるソースコードの更新に際して追加または修正されるコードについても当該プログラム言語のルールに応じて適宜変更されることは言うまでもない。
【0062】
また、上述した実施形態はあくまで一例であり、必ずしも本発明の構成や処理を限定するものではなく、本発明の技術思想を逸脱しない範囲で種々の変形や変更が加えられてもよい。
【0063】
また、以下のような構成も本開示の技術的範囲に属する。
(1)解析対象となる一連のソースコードのうち、オブジェクトの生成を示唆する第1のアノテーションが付加された第1のソースコードを更新対象として抽出する抽出手段と、更新対象として抽出された前記第1のソースコード中の、前記第1のアノテーションが示されたフィールドを対象として、当該フィールドに対応するオブジェクトの生成を直接的に示す第1のコードと、当該オブジェクトの生成を間接的に示す第2のコードと、のいずれかを追加することで、当該第1のソースコードを更新し、当該更新後の第1のソースコードに規定された処理を呼び出す実行コードを生成する更新手段と、を備え、前記更新後の第1のソースコードと、前記実行コードと、に基づきコールグラフが生成される、情報処理装置。
(2)前記更新手段は、前記第1のソースコードに対して前記第1のコードを追加した場合に、前記更新後の第1のソースコードに規定された処理を直接呼び出すように、前記実行コードを生成する、(1)に記載の情報処理装置。
(3)前記更新手段は、前記第1のソースコードに対して前記第2のコードを追加した場合に、当該第2のコードに関連付けて、前記第1のアノテーションが示されたフィールドに対応するオブジェクトの生成を直接的に示すコードが規定された第2のソースコードを生成し、当該第2のソースコードに規定された処理を呼び出すことで、前記更新後の第1のソースコードに規定された処理を呼び出すように、前記実行コードを生成する、(1)に記載の情報処理装置。
(4)前記第2のコードは、前記第2のソースコードに規定されたクラスの抽象クラスに既定された処理を呼び出すコードであり、前記クラスは、前記抽象クラスを継承するように、前記第2のソースコードに規定される、(3)に記載の情報処理装置。
(5)前記更新手段は、更新対象として抽出された前記第1のソースコードにおいて、前記第1のアノテーションが示されたフィールドに対応するオブジェクトを対象として、シングルトンが適用されているか否か判定し、前記オブジェクトに対してシングルトンが適用されている場合には、前記第2のコードを追加することにより前記第1のソースコードを更新する、(1)乃至(4)のいずれか1項に記載の情報処理装置。
(6)前記更新手段は、更新対象として抽出された前記第1のソースコードにおいて、前記第1のアノテーションが示されたフィールドを対象として示された、当該フィールドに対応するオブジェクトのスコープを示す第2のアノテーションの規定に基づき、当該フィールドに対応するオブジェクトを対象として、シングルトンが適用されているか否かを判定する、(5)に記載の情報処理装置。
(7)前記更新手段は、更新対象として抽出された前記第1のソースコードに関連付けられた設定ファイルにおける、当該第1のソースコードに示されたフィールドに対応するオブジェクトのスコープを示す属性情報に基づき、当該フィールドに対応するオブジェクトを対象として、シングルトンが適用されているか否かを判定する、(5)に記載の情報処理装置。
(8)情報処理装置が実行する情報処理方法であって、解析対象となる一連のソースコードのうち、オブジェクトの生成を示唆する第1のアノテーションが付加された第1のソースコードを更新対象として抽出する抽出ステップと、更新対象として抽出された前記第1のソースコード中の、前記第1のアノテーションが示されたフィールドを対象として、当該フィールドに対応するオブジェクトの生成を直接的に示す第1のコードと、当該オブジェクトの生成を間接的に示す第2のコードと、のいずれかを追加することで、当該第1のソースコードを更新し、当該更新後の第1のソースコードに規定された処理を呼び出す実行コードを生成する更新ステップと、を含み、前記更新後の第1のソースコードと、前記実行コードと、に基づきコールグラフが生成される、情報処理方法。
(9)コンピュータに、解析対象となる一連のソースコードのうち、オブジェクトの生成を示唆する第1のアノテーションが付加された第1のソースコードを更新対象として抽出する抽出ステップと、更新対象として抽出された前記第1のソースコード中の、前記第1のアノテーションが示されたフィールドを対象として、当該フィールドに対応するオブジェクトの生成を直接的に示す第1のコードと、当該オブジェクトの生成を間接的に示す第2のコードと、のいずれかを追加することで、当該第1のソースコードを更新し、当該更新後の第1のソースコードに規定された処理を呼び出す実行コードを生成する更新ステップと、を実行させ、前記更新後の第1のソースコードと、前記実行コードと、に基づきコールグラフが生成される、プログラム。
【符号の説明】
【0064】
100 情報処理装置
110 制御部
111 解析部
112 更新部
120 コールグラフ生成部