以下,本実施の形態について,図を用いて説明する。なお,以下の本実施の形態では,主に静的解析を行う際にソースプログラムの更新判定を行う例を説明する。
図1は,ソースプログラムの更新判定を説明する図である。
ここでは,ファイル名が“a.c”であるC言語で記述されたソースプログラムについて,静的解析の実行時に,その更新判定が行われるものとする。
図1(A)は,ソースプログラム自身を比較する例を示す。ソースプログラムの更新判定を行う技術として,ソースプログラム自身を比較して更新判定を行う方法が考えられる。この方法では,例えば,図1(A)に示すように,前回解析時のソースファイルのプログラムと,今回の解析対象のソースファイルのプログラムとを,文字ごとに比較する。なお,ソースファイルは,ソースプログラムのファイルである。
この方法では,ソースプログラムが更新されたか否かを正確に判定することができる。しかし,この方法では,一度解析したソースファイルを次の解析時まで保管しておく必要があり,またソースプログラム自身を比較するため,比較処理に多くの時間が必要となるという問題がある。
図1(B)は,ソースファイルのタイムスタンプを比較する例を示す。ソースプログラムの更新判定を行う技術として,ソースファイルの更新日時を示すタイムスタンプを比較して更新判定を行う方法が考えられる。この方法では,例えば,図1(B)に示すように,前回解析時のソースファイルの更新日時を示すタイムスタンプと,今回の解析対象のソースファイルの更新日時を示すタイムスタンプとを比較する。
この方法では,前回解析時のタイムスタンプさえ保管しておけば前回解析時のソースファイルを保管しておく必要がなく,タイムスタンプ同士の比較であるので比較処理にかかる時間は短い。しかし,この方法では,ソースファイルのタイムスタンプが必ずしもソースプログラムの更新日時を示すとは限らないため,必ずしも正確な更新判定ができないという問題がある。
例えば,構成管理サーバなどを用いて開発資源を一括管理する場合において,作業を行うソースファイルを構成管理サーバからユーザ装置に取り出す際に,そのソースファイルの更新日時を示すタイムスタンプがその取り出し日時に書き換えされるケースがある。このケースでは,ソースプログラム自身が更新されていなくても,ソースファイルのタイムスタンプが前回解析時のものと一致しないことで,更新されたと判定されてしまう可能性がある。
図1(C)は,本実施の形態によるソースプログラムのハッシュ値を比較する例を示す。本実施の形態では,図1(C)に示すように,前回解析時のソースファイルのプログラムのハッシュ値と,今回の解析対象のソースファイルのプログラムのハッシュ値とを比較することで,ソースプログラムの更新を判定する。ハッシュ値を求める際には,例えば,ソースプログラムの全文字を対象としてハッシュ値を求める。
図1(C)に示すように,ソースプログラムのハッシュ値の比較で更新を判定する場合,前回解析時のハッシュ値を保存しておけば,前回解析時のソースファイルをあえて保存しておかなくても,ソースプログラムの更新判定が可能となる。また,ソースプログラム自身を比較する必要がないので,処理時間は短い。また,ソースプログラム自身から算出されるハッシュ値を用いるので,更新判定の正確性は高い。
図2は,依存関係があるファイルが存在する場合のソースプログラムの更新判定を説明する図である。
図2に示す例においてファイル名“a.h”,“b.h”のファイルは,ソースファイル“a.c”のプログラム内で指定されたヘッダファイルである。また,ファイル名“aa.h”のファイルは,さらにヘッダファイル“a.h”のプログラム内で指定されたヘッダファイルである。ヘッダファイルは,インクルードファイルとも呼ばれ,例えば,C言語で記述されたソースファイルのコンパイル時に,該ソースファイルの一部として取り込まれるファイルである。例えば,C言語のソースプログラムにおいて,ヘッダファイルはinclude文で指定される。一般に,ヘッダファイルは,ソースコード形式のファイルである。
取り込むヘッダファイルの指定がソースプログラム内にある場合に,ソースプログラム自身が更新されていなくても,ヘッダファイルのプログラムが更新されていれば,実質的にソースプログラムが更新されている状態となり,コンパイルや解析の結果に影響する。そのため,差分ビルドや差分解析を行う場合には,ソースプログラムの更新判定だけではなく,そのソースプログラムで指定されるヘッダファイルのプログラムの更新も判定する必要がある。
以下では,ソースプログラムで指定されるヘッダファイルのプログラムのように,ソースプログラムと依存関係があるプログラムを,依存関係プログラムとも呼ぶ。また,ヘッダファイルのように,依存関係プログラムのファイルを,依存関係ファイルとも呼ぶ。
依存関係プログラムは,ソースプログラムの差分ビルドや解析などにおいて,そのソースプログラムの更新判断に影響を及ぼすプログラムである。依存関係プログラムとしては,include文で指定されるヘッダファイルのプログラムの他にも,例えば,import文で指定されるライブラリやパッケージのプログラムなどがある。依存関係プログラムは,ソースプログラムを記述する言語の仕様に応じたものとなる。
図2(A)は,ソースプログラムの更新判定において,各依存関係プログラムの更新判定も併せて行う例を示す。上述のように解析対象のソースファイルの更新判定を行う際には,各依存関係ファイルの更新判定も併せて行う。このとき,図2(A)に示すように,ファイルごとに個別に更新判定を行うと,比較処理に多くの時間が必要となるという問題がある。
図2(B)は,本実施の形態によるソースプログラムとその依存関係プログラムとを合わせたハッシュ値を比較する例を示す。本実施の形態では,図2(B)に示すように,ソースファイルのプログラムと依存関係があるファイルプログラムとを合わせてハッシュ値を求め,そのハッシュ値を比較することでソースプログラムの更新を判定する。図2(B)に示すように,ソースプログラムとその依存関係プログラムとをまとめてハッシュ値を求め,そのハッシュ値の比較で更新を判定できれば,プログラムごとに個別に更新を判定するよりも,処理時間が短くなる。
図3は,本実施の形態による開発システムの構成例を示す図である。
図1の例に示す開発システムにおいて,構成管理サーバ20は,開発資源を統合管理するコンピュータである。構成管理サーバ20は,本システムで開発されたソースプログラムのファイルを含む,資源となる様々なソースファイルを格納し,管理するソース管理部25を備える。
図1の例に示す開発システムにおいて,各ユーザ装置10は,開発等に携わる各ユーザが使用するコンピュータである。各ユーザ装置10は,LAN(Local Area Network)等のネットワーク30を介して構成管理サーバ20にアクセス可能である。各ユーザ装置10は,ソースプログラムのプログラミング,コンパイル,解析等を行う際に,構成管理サーバ20のソース管理部25から,必要なソースプログラムを取得する。
図4は,本実施の形態によるユーザ装置の構成例を示す図である。
ユーザ装置10は,プログラム記憶部15,解析部100を備える。プログラム記憶部15は,該ユーザ装置10での作業で使用するソースファイル等のプログラム資源を記憶する記憶部である。作業に使用するソースファイル等のプログラム資源は,例えば,構成管理サーバ20のソース管理部25から取得されたものなどである。
解析部100は,指定された解析対象のソースプログラムの静的解析を行う。解析部100は,解析ツールなどによって実現される。解析対象のソースプログラムは,単体で指定されてもよいし,群で指定されてもよい。なお,本実施の形態による解析部100では,一度解析が行われたソースプログラムについて再度解析が行われる場合に,内容が更新されたソースプログラムについてのみ解析を行う差分解析が行われるものとする。
解析部100は,更新判定部110,解析実行部120を備える。解析実行部120は,解析対象のソースプログラムについて,所定の静的解析を実行する。
更新判定部110は,解析対象のソースプログラムについて,前回の処理時から内容が更新されているかを判定する。本実施の形態において,解析部100にとっての解析対象のソースプログラムは,更新判定部110にとって,更新判定対象のソースプログラムとなる。このとき,本実施の形態の更新判定部110は,更新判定対象のソースプログラム自身だけではなく,該ソースプログラムの依存関係プログラムも含めた更新判定を行う。すなわち,更新判定部110は,更新判定対象のソースプログラム自身が更新されていなくても,依存関係プログラムが更新されていれば,更新判定対象のソースプログラムが更新されていると判定する。
本実施の形態の更新判定部110は,図2(B)の例にも示すように,ソースプログラムと依存関係プログラムとを合わせてハッシュ値を求め,そのハッシュ値を比較することでソースプログラムの更新を判定する。更新判定部110は,算出部111,比較判定部112,更新管理部113,更新管理情報記憶部115を備える。
更新管理情報記憶部115は,ソースプログラムと第2のハッシュ値との対応を含む,ソースプログラムの更新判定に用いる情報を記憶する記憶部である。第2のハッシュ値は,対応するソースプログラムについて,最初の処理で記録されたハッシュ値か,過去の最後に更新が確認された時点でのハッシュ値である。第2のハッシュ値は,対応するソースプログラムについての前回の更新判定時におけるハッシュ値であるとも言える。
本実施の形態では,ソースプログラムの更新が行われない限り第2のハッシュ値は更新されない。そのため,本実施の形態の例における第2のハッシュ値は,対応するソースプログラムについて,前回解析が行われた時点でのソースプログラムと,該ソースプログラムから抽出した依存関係プログラムとから算出されたハッシュ値となる。
算出部111は,更新判定対象のソースプログラムについて,第1のハッシュ値を算出する。本実施の形態の例において,第1のハッシュ値は,更新判定対象のソースプログラム,すなわち今回更新判定を行う時点での該当ソースプログラムと,依存関係プログラムとから算出されるハッシュ値である。
より具体的には,算出部111は,更新判定対象のソースプログラムについて,該更新判定対象のソースプログラムと依存関係があるプログラム,すなわち依存関係プログラムの情報を取得する。依存関係プログラムの情報は,例えば,更新判定対象のソースプログラムから抽出した依存関係プログラムの情報や,更新判定対象のソースプログラムについて前回解析が行われた時点での該当ソースプログラムから抽出した依存関係プログラムの情報などである。前回解析が行われた時点での該当ソースプログラムから抽出した依存関係プログラムの情報を取得する場合には,算出部111は,例えば,更新管理情報記憶部115から情報を取得する。
算出部111は,更新判定対象のソースプログラムに取得した依存関係プログラムを連結したデータのハッシュ値である第1のハッシュ値を求める。例えば,算出部111は,更新判定対象のソースプログラムのファイルと,依存関係プログラムのファイルとを取得する。算出部111は,更新判定対象のソースプログラムの文字列と,依存関係プログラムの文字列とを連結した文字列データを生成する。以下では,更新判定対象のソースプログラムに依存関係プログラムを連結して得られる文字列データを,連結データとも呼ぶ。算出部111は,連結データを所定のハッシュ関数に入力し,第1のハッシュ値を得る。文字列のハッシュ値を求めるハッシュ関数のアルゴリズムについては,様々なハッシュ関数のアルゴリズムが周知である。例えば,C言語でも,対象の文字列からハッシュ値を求めるアルゴリズムがライブラリで提供されている。
比較判定部112は,第1のハッシュ値と第2のハッシュ値との比較結果に基づいて,更新判定対象のソースプログラムの更新有無を判定する。より具体的には,比較判定部112は,更新判定対象のソースプログラムに対応する第2のハッシュ値を,更新管理情報記憶部115から取得する。比較判定部112は,算出部111で算出された第1のハッシュ値と,更新管理情報記憶部115から取得した第2のハッシュ値とを比較する。比較判定部112は,比較結果が一致である場合には,更新判定対象のソースプログラムが更新されていないと判定し,比較結果が不一致である場合には,更新判定対象のソースプログラムが更新されていると判定する。
更新管理部113は,更新判定対象のソースプログラムが更新されていると判定された場合に,更新管理情報記憶部115に記憶された更新判定対象のソースプログラムに対応する第2のハッシュ値を更新する。更新管理部113によって,更新管理情報記憶部115の第2のハッシュ値は,更新判定対象のソースプログラムに更新判定対象のソースプログラムから抽出した依存関係プログラムを連結したデータのハッシュ値で更新される。
例えば,算出部111が,更新判定対象のソースプログラムから抽出した依存関係プログラムの情報に基づいて第1のハッシュ値を求めている場合,更新管理部113は,第1のハッシュ値で更新管理情報記憶部115の第2のハッシュ値を更新する。
また,例えば,算出部111が,前回解析が行われた時点での該当ソースプログラムから抽出された依存関係プログラムの情報に基づいて第1のハッシュ値を求めている場合,更新管理部113は,更新判定対象のソースプログラムから依存関係ファイルを抽出する。更新管理部113は,更新判定対象のソースプログラムに抽出した依存関係プログラムを連結したデータのハッシュ値である第3のハッシュ値を求める。更新管理部113は,求めた第3のハッシュ値で,更新管理情報記憶部115の第2のハッシュ値を更新する。このとき,更新管理部113は,更新判定対象のソースプログラムから抽出した依存関係プログラムの情報で,更新管理情報記憶部115に記憶された,前回解析が行われた時点での該当ソースプログラムから抽出された依存関係プログラムの情報を更新する。
このように,更新判定対象のソースプログラムが更新されていると判定された場合に第2のハッシュ値を更新することにより,該当ソースプログラムについて,常に最後に更新が判定された時点のハッシュ値が,第2のハッシュ値として保管されるようになる。また,該当ソースプログラムの依存関係プログラムの情報を保管する場合も,常に最後に該当ソースプログラムの更新が判定された時点の依存関係プログラムの情報が保管されるようになる。
図5は,本実施の形態の更新判定部による更新判定処理フローチャートである。
更新判定部110において,算出部111は,更新判定対象のソースプログラムについて,依存関係プログラムの情報を取得する(ステップS10)。算出部111は,更新判定対象のソースプログラムと,取得した情報に示される依存関係プログラムとを取得し,更新判定対象のソースプログラムに依存関係プログラムを連結して(ステップS11),連結データを生成する。算出部111は,連結データに対して所定のハッシュ関数を用い,第1のハッシュ値を算出する(ステップS12)。
比較判定部112は,更新管理情報記憶部115から,更新判定対象のソースプログラムに対応する第2のハッシュ値を取得する(ステップS13)。比較判定部112は,第1のハッシュ値と第2のハッシュ値とを比較し,第1のハッシュ値と第2のハッシュ値とが一致するかを判定する(ステップS14)。
比較の結果,第1のハッシュ値と第2のハッシュ値とが一致する場合(ステップS14のYES),更新判定対象のソースプログラムは前回のものから更新されていないと判定されたことになる。
比較の結果,第1のハッシュ値と第2のハッシュ値とが一致しない場合(ステップS14のNO),更新判定対象のソースプログラムは前回のものから更新されていると判定されたことになる。このとき,更新管理部113は,更新判定対象のソースプログラムにその更新判定対象のソースプログラムから抽出した依存関係プログラムを連結したデータのハッシュ値で,更新管理情報記憶部115に記憶された,更新判定対象のソースプログラムに対応する第2のハッシュ値を更新する(ステップS15)。
本実施の形態による更新判定部110では,ソースプログラムの更新判定が,更新判定対象のソースプログラムに基づいて算出されるハッシュ値と,前回処理時の該当ソースプログラムに基づいて算出されたハッシュ値との比較により行われる。これにより,前回処理時のハッシュ値を保存しておけば,前回処理時のソースファイルを無駄に保存しておかなくても,更新判定ができる。また,ソースプログラム自身を比較せずに,ハッシュ値の比較で更新判定を行うので,処理時間の短縮が図れる。また,ソースプログラム自身から求めたハッシュ値を用いて更新判定を行うので,精度が高い判定が可能となる。
さらに,本実施の形態による更新判定部110では,ソースプログラムに依存関係プログラムを連結したデータから,比較に用いるハッシュ値が求められる。これにより,ソースプログラムと依存関係プログラムとをまとめて更新判定できるので,処理時間の短縮が図れる。ソースプログラム自身が更新されていなくても,そのソースプログラムの依存関係プログラムが更新されていれば,そのソースプログラムの解析結果が変わる可能性がある。
図6は,本実施の形態によるユーザ装置を実現するコンピュータのハードウェア構成例を示す図である。
図4に示す本実施の形態のユーザ装置10を実現するコンピュータ1は,例えば,CPU(Central Processing Unit )2,主記憶となるメモリ3,記憶装置4,通信装置5,媒体読取・書込装置6,入力装置7,出力装置8等を備える。記憶装置4は,例えばHDD(Hard Disk Drive )等の外部記憶装置や,補助記憶装置などである。媒体読取・書込装置6は,例えばCD−R(Compact Disc Recordable )ドライブやDVD−R(Digital Versatile Disc Recordable )ドライブなどである。入力装置7は,例えばキーボード・マウス等の入力機器などである。出力装置8は,例えばディスプレイ等の表示装置などである。
図4に示すユーザ装置10およびユーザ装置10が備える各機能部は,コンピュータ1が備えるCPU2,メモリ3等のハードウェアと,ソフトウェアプログラムとによって実現することが可能である。コンピュータ1が実行可能なプログラムは,記憶装置4に記憶され,その実行時にメモリ3に読み出され,CPU2により実行される。
コンピュータ1は,可搬型記録媒体から直接プログラムを読み取り,そのプログラムに従った処理を実行することもできる。また,コンピュータ1は,サーバコンピュータからプログラムが転送されるごとに,逐次,受け取ったプログラムに従った処理を実行することもできる。さらに,このプログラムは,コンピュータ1で読み取り可能な記録媒体に記録しておくことができる。
ここで,本実施の形態の更新判定部110によるソースプログラムのハッシュ値を求める例を説明する。
図7は,ソースプログラムから依存関係プログラムを抽出する例を説明する図である。
ここでは,ファイル名“a.c”のソースファイル200のプログラムを解析して依存関係プログラムを抽出し,更新判定に用いるハッシュ値を求めるものとする。図7に示すファイル名“a.c”のソースファイル200は,C言語で記述されたソースプログラムのファイルの例である。
まず,更新判定部110は,ソースプログラムに対して,構文解析を行う。更新判定部110は,ソースプログラムに対して意味解析を行い,ソースプログラム中の特定の命令文で指定された依存関係プログラムを順に抽出する。図7に示す例では,ソースファイル200のプログラムから,依存関係プログラムを指定する特定の命令文であるinclude文で指定されたヘッダファイル210a〜c,eが抽出される。ヘッダファイル210a〜c,eのプログラムが,依存関係プログラムのファイルとなる依存関係ファイルである。
更新判定部110は,抽出された依存関係プログラムについても,さらに依存関係プログラムの抽出を行う。図7に示す例においても,ファイル名“a.h”のヘッダファイル210cから,さらにファイル名“aa.h”のヘッダファイル210dが抽出されている。本実施の形態では,更新判定部110は,ソースプログラムと抽出された依存関係プログラムとに対して,再帰的に依存関係プログラムの抽出を実行する。
なお,図7に示すソースファイル200のプログラムにおいて,<>で示されるヘッダファイル210a,bは,コンパイラ等が提供する標準ヘッダファイルを示す。また,図7に示すソースファイル200のプログラムにおいて,""で示されるヘッダファイルc〜eは,各企業等で独自に作成されたローカルなヘッダファイルを示す。図7に示す例では,依存関係ファイルとして標準ヘッダファイルも抽出しているが,標準ヘッダファイルを抽出する依存関係ファイルの対象から除外してもよい。
ソフトウェア開発において,ローカルなヘッダファイルについては,随時改良される可能性があるが,標準ヘッダファイルについては,コンパイラのバージョンアップでもない限り,ほとんど更新されることはない。そのため,コンパイラのバージョンアップがない場合には,標準ヘッダファイルを依存関係ファイルの対象外としても問題はない。標準ヘッダファイルを抽出する依存関係ファイルの対象外とすることにより,処理の短縮が図れる。
標準ヘッダファイルを依存関係ファイルとして抽出するか,抽出する依存関係ファイルから除外するかをオプションで選択できるようにしてもよい。
図7に示す例では,ソースファイル200に対する解析で,最終的にヘッダファイル210a〜eの依存関係ファイルが抽出される。更新判定部110は,抽出された依存関係ファイルを,依存関係プログラムの情報である依存関係データに記録する。
図8は,依存関係データの例を示す図である。
図8に示す依存関係データ160は,図7に示すソースファイル200のプログラムから抽出された依存関係プログラムの情報の一例を示す。図8に示す依存関係データ160では,図7に示すソースファイル200のプログラムの解析で抽出された順に,ヘッダファイル210のファイル名が記録されている。図8に示す依存関係データ160において,fで示される数値は,そのヘッダファイル210が,ソースファイル200のプログラムから抽出された順序を示す。本実施の形態の例では,抽出された依存関係プログラムに対して再帰的に依存関係プログラムの抽出が行われるため,図7に示すように,ソースファイル200のプログラムのヘッダファイル210eより先に,ヘッダファイル210cのプログラムのヘッダファイル210dが抽出されている。
なお,ソースプログラムから依存関係プログラムを抽出する順序のルールについては,任意の設計が可能である。例えば,本実施の形態の例ではソースプログラムから抽出された依存関係プログラムから再帰的に依存関係プログラムを抽出しているが,ソースプログラムからすべての依存関係プログラムを抽出し,その後で各依存関係プログラムからさらに依存関係プログラムを抽出するようにしてもよい。だだし,一連の同じソースプログラムに対する更新判定では,常に同じルールで依存関係プログラムの抽出を行うものとする。
ソースプログラムからの依存関係プログラムの抽出において,抽出される順序には意味がある。ソースプログラムにおける依存関係プログラムの出現順序が変わるだけで,コンパイルや静的解析の結果が変わる可能性がある。一連の同じソースプログラムに対する更新判定において,途中で依存関係プログラムを抽出するルールを変えてしまうと,正確な更新判定ができずに正しい差分ビルドや差分解析が実行されない可能性がある。
更新判定部110は,ソースプログラムの解析で得られた依存関係データ160に基づいて,ソースプログラムと依存関係プログラムとを連結した連結データを生成する。
図9は,連結データの例を示す図である。
図9に示す連結データ161は,図7に示すソースファイル200のプログラムに対する解析で得られた依存関係データ160に基づいて,ソースファイル200のプログラムに各ヘッダファイル210のプログラムとを連結したデータの一例である。本実施の形態では,連結データ161は,プログラムの文字列を連結した文字列データとなる。図9に示す連結データ161では,最初にソースファイル200のプログラムがあり,図8の依存関係データ160に示される順に,各ヘッダファイル210a〜eのプログラムが連結されている。
なお,ソースプログラムに依存関係プログラムを連結する順序のルールについては,任意の設計が可能である。例えば,図9に示す例では最初のソースプログラムに対して依存関係データ160に示される順に各依存関係プログラムを連結しているが,最初に依存関係データ160に示される順に依存関係プログラムを連結し,最後にソースプログラムを連結するようにしてもよい。だだし,一連の同じソースプログラムに対する更新判定では,常に同じルールでソースプログラムに依存関係プログラムを連結するものとする。
ソースプログラムに依存関係プログラムを連結する際に,プログラムを連結する順序を変えると,連結データから算出されるハッシュ値が変わってしまう。例えば,前回の更新判定時と今回の更新判定時とで,連結する順序のルールを変えてしまうと,ソースプログラムが更新されていなくても,得られるハッシュ値が異なるので,ソースプログラムが更新されていると判定されてしまう。一連の同じソースプログラムに対する更新判定において,途中でプログラムを連結する順序のルールを変えてしまうと,正確な更新判定ができずに正しい差分ビルドや差分解析が実行されない可能性がある。
更新判定部110は,生成された連結データ161について,所定のハッシュ関数を用いて,ハッシュ値を算出する。ソースプログラムか依存関係プログラムのいずれかが更新されると得られるハッシュ値が変わるので,ハッシュ値の比較により,ソースプログラムの更新を判定できる。
以下では,本実施の形態によるソースプログラムの更新判定の技術について,より具体的な実施例を説明する。
〔実施例1〕
本実施例1において,ユーザは,あらかじめ目的とする静的解析に必要なソースファイルやヘッダファイル等のプログラムファイルを構成管理サーバ20等から取得し,自ユーザ装置10のプログラム記憶部15に格納しておくものとする。ユーザは,静的解析の実行にあたって,解析対象のソースプログラムを指定する。
解析部100は,ユーザに指定された解析対象のソースプログラムの静的解析を実行する。ここでは,解析部100により,必ずしも指定されたすべてのソースプログラムについて解析するのではなく,まだ解析を行っていないソースプログラムと,前回の解析時以降に更新されたソースプログラムとについて解析する差分解析が行われる。解析部100において,更新判定部110は,解析対象のソースプログラムを更新判定対象のソースプログラムとして,上述したハッシュ値の比較により,前回処理時から更新があるかを判定する。
図10は,本実施例1による更新管理データの例を示す図である。
図10に示す更新管理データ116は,更新管理情報記憶部115に記憶された,ソースプログラムと第2のハッシュ値との対応を含む,ソースプログラムの更新判定に用いる情報の一例を示す。図10に示す更新管理データ116は,ファイル形式のデータとなっている。ここでは,ハッシュ値を算出するもととなったソースファイルのファイル名に,拡張子“.hash”を付けたものを,更新管理データ116のファイル名とする。
図10に示すファイル名“a.c.hash”の更新管理データ116は,図7に示すファイル名“a.c”のソースファイル200から求められたハッシュ値が記録されたデータとなる。すなわち,図10に示す更新管理データ116は,ファイル名“a.c”のソースファイル200のプログラムと,そのソースプログラムについての前回解析実行時のハッシュ値である第2のハッシュ値とを対応付けたデータとなる。図10に示す更新管理データ116において,hashで示される値“123456”が,記録された第2のハッシュ値である。
なお,第2のハッシュ値が保管される更新管理データ116が,必ずしも図10に示すようなソースプログラムごとのファイル形式のデータである必要はない。例えば,更新管理データ116が,各ソースプログラムと第2のハッシュ値との対応を示すレコードを持つテーブル形式のデータであってもよい。
本実施例1において,更新判定部110の算出部111は,上述のソースプログラムからハッシュ値を求める手順で,更新判定対象のソースプログラムについての第1のハッシュ値を求める。より具体的には,算出部111は,更新判定対象のソースプログラムから依存関係プログラムを抽出して,依存関係データ160を生成する。算出部111は,生成した依存関係データ160に基づいて,更新判定対象のソースプログラムに依存関係プログラムを連結し,連結データ161を生成する。算出部111は,連結データ161に対して所定のハッシュ関数を用い,第1のハッシュ値を算出する。
比較判定部112は,更新管理情報記憶部115の更新管理データ116から,更新判定対象のソースプログラムに対応する第2のハッシュ値を取得する。比較判定部112は,第1のハッシュ値と第2のハッシュ値とを比較して,双方が一致すれば更新判定対象のソースプログラムは更新されていないと判定し,双方が一致しなければ更新判定対象のソースプログラムが更新されていると判定する。
解析部100において,解析実行部120は,更新判定対象の,すなわち解析対象のソースプログラムが更新されていると判定された場合には,その解析対象のソースプログラムに対する静的解析を実行する。更新判定対象の,すなわち解析対象のソースプログラムが更新されていないと判定された場合には,解析実行部120は,その解析対象のソースプログラムに対する静的解析を実行しない。このように,本実施の形態の解析部100では,差分解析が実行される。
更新判定対象のソースプログラムが更新されていると判定された場合には,該当ソースプログラムについての正しいハッシュ値が,更新管理情報記憶部115に保管された前回の解析実行時の第2のハッシュ値と異なっている。このとき,更新管理部113は,更新管理情報記憶部115に保管された,更新判定対象のソースプログラムに対応する第2のハッシュ値を,更新判定対象のソースプログラムに該ソースプログラムから抽出した依存関係プログラムを連結したデータのハッシュ値で更新する。
本実施例1では,算出部111で求めた第1のハッシュ値が,更新判定対象のソースプログラムに該ソースプログラムから抽出した依存関係プログラムを連結したデータのハッシュ値である。更新管理部113は,算出部111で求めた第1のハッシュ値で,更新管理情報記憶部115に保管された,更新判定対象のソースプログラムに対応する第2のハッシュ値を更新する。
図11は,本実施例1の解析部による差分解析処理フローチャートである。
本実施例1において,解析部100は,解析対象として指定された各ソースプログラムに対して,図11に示す差分解析処理を行う。
解析部100の更新判定部110において,算出部111は,解析対象の,すなわち更新判定対象のソースプログラムに対して,依存関係解析処理を実行する(ステップS20)。依存関係解析処理は,更新判定対象のソースプログラムから依存関係プログラムを抽出し,依存関係データ160を生成する処理である。依存関係解析処理の詳細については,後述する。
算出部111は,生成した依存関係データ160に基づいて,更新判定対象のソースプログラムに該ソースプログラムから抽出した依存関係プログラムを連結し(ステップS21),連結データ161を生成する。算出部111は,連結データ161に対して所定のハッシュ関数を用い,第1のハッシュ値を算出する(ステップS22)。
更新判定部110は,更新判定対象のソースプログラムに対する解析が,最初の解析であるかを判定する(ステップS23)。更新判定対象のソースプログラムに対する解析が最初の解析であるか否かは,例えば,該当ソースプログラムについての第2のハッシュ値が更新管理情報記憶部115に保管されているか否かで判定可能である。最初の解析であれば,更新判定対象のソースプログラムに対応する第2のハッシュ値は存在しない。
最初の解析であれば(ステップS23のYES),更新管理部113は,第1のハッシュ値を,更新判定対象のソースプログラムに対応する第2のハッシュ値として,更新管理情報記憶部115に記憶する更新管理データ116に記録する(ステップS26)。解析実行部120は,更新判定対象の,すなわち解析対象のソースプログラムの静的解析を実行する(ステップS27)。
最初の解析でなければ(ステップS23のNO),比較判定部112は,更新管理情報記憶部115の更新管理データ116から,更新判定対象のソースプログラムに対応する第2のハッシュ値を取得する(ステップS24)。比較判定部112は,第1のハッシュ値と第2のハッシュ値とを比較し,第1のハッシュ値と第2のハッシュ値とが一致するかを判定する(ステップS25)。
第1のハッシュ値と第2のハッシュ値とが一致すれば(ステップS25のYES),更新判定対象のソースプログラムは更新されていないと判定されたことになる。このとき,解析実行部120は,更新判定対象の,すなわち解析対象のソースプログラムの静的解析を実行しない。
第1のハッシュ値と第2のハッシュ値とが一致しなければ(ステップS25のNO),更新管理部113は,第1のハッシュ値を,更新判定対象のソースプログラムに対応する次の第2のハッシュ値として,更新管理情報記憶部115の更新管理データ116に記録する(ステップS26)。これにより,更新管理データ116に記録された,該当ソースプログラムに対応する前回解析時のハッシュ値である第2のハッシュ値が,最新の解析時のハッシュ値に更新される。解析実行部120は,更新判定対象の,すなわち解析対象のソースプログラムの静的解析を実行する(ステップS27)。
図12は,本実施例1の更新判定部による依存関係解析処理フローチャートである。
図12に示す依存関係解析処理は,更新判定対象のソースプログラムと依存関係プログラムとに対して再帰的に依存関係プログラムを抽出する処理を実行し,更新判定対象のソースプログラムについての依存関係データ160を生成する処理の例である。
更新判定部110は,依存関係を解析する対象のプログラムを,プログラム記憶部15から取得する(ステップS30)。最初は,更新判定対象のソースプログラムが,依存関係を解析する対象のプログラムとなる。再帰的に依存関係解析処理が実行された場合には,依存関係プログラムが,依存関係を解析する対象のプログラムとなる。更新判定部110は,ステップS30の処理で取得されたプログラムに対して,構文解析を実行する(ステップS31)。
更新判定部110は,ステップS30の処理で取得されたプログラムに対して意味解析を実行し,該プログラムから特定の命令文を順に1つ抽出する(ステップS32)。更新判定部110は,抽出された特定の命令文で指定された依存関係プログラムの情報を,依存関係データ160に記録する(ステップS33)。更新判定部110は,抽出された特定の命令文で指定された依存関係プログラムを,依存関係を解析する対象のプログラムとして,再帰的に依存関係解析処理を実行する(ステップS34)。
更新判定部110は,ステップS30の処理で取得されたプログラムのすべての特定の命令文について,処理が終了したかを判定する(ステップS35)。まだすべての特定の命令文について処理が終了していなければ(ステップS35のNO),更新判定部110は,ステップS32の処理に戻って,次の特定の命令文についての処理に移る。すべての特定の命令文について処理が終了していれば(ステップS35のYES),更新判定部110は,処理を終了する。
〔実施例2〕
上述の実施例1では,更新判定処理を行うたびに,更新判定対象のソースプログラムから依存関係プログラムを抽出する処理を行い,依存関係データ160を生成している。また,上述の実施例1では,更新判定対象のソースプログラムから生成された依存関係データ160を用いて,第1のハッシュ値を求めている。
これに対して,本実施例2では,更新判定対象のソースプログラムが更新されていると判定された場合にのみ,更新判定対象のソースプログラムから依存関係プログラムを抽出する処理を行い,依存関係データ160を生成する。本実施例2では,第1のハッシュ値を求める際に,前回解析時に該当ソースプログラムに基づいて生成された依存関係データ160を用いるものとする。そのため,本実施例2では,ソースプログラムと第2のハッシュ値との対応情報とともに,ソースプログラムと該ソースプログラムから生成された依存関係データ160との対応情報も,更新管理情報記憶部115に保管しておく。
図13は,本実施例2による更新管理データの例を示す図である。
図13に示す更新管理データ116’は,更新管理情報記憶部115に記憶された,ソースプログラムと第2のハッシュ値との対応と,ソースプログラムと依存関係データ160との対応とを含む,ソースプログラムの更新判定に用いる情報の一例を示す。図13に示す更新管理データ116’は,図10に示す更新管理データ116と同様のファイル形式のデータとなっている。
図13に示すファイル名“a.c.hash”の更新管理データ116’は,図7に示すファイル名“a.c”のソースファイル200から求められたハッシュ値と,図8に示す依存関係データ160とが記録されたデータとなる。すなわち,図13に示す更新管理データ116’は,ファイル名“a.c”のソースファイル200のプログラムと,そのソースプログラムについての前回解析実行時のハッシュ値である第2のハッシュ値とを対応付けたデータとなる。それと同時に,図13に示す更新管理データ116’は,ファイル名“a.c”のソースファイル200のプログラムと,そのソースプログラムについて前回解析時に抽出された依存関係プログラムの情報が記録された依存関係データ160とを対応付けたデータとなる。
なお,上述の図10に示す更新管理データ116の場合と同様に,第2のハッシュ値と依存関係データ160とが保管される更新管理データ116’が,例えばソースプログラムごとのレコードを持つテーブル形式のデータであってもよい。また,図13に示す例では,第2のハッシュ値と依存関係データ160とが1つのファイルの更新管理データ116’で管理されているが,第2のハッシュ値と依存関係データ160とがそれぞれ異なるデータで管理されてもよい。
本実施例2において,更新判定部110の算出部111は,更新判定対象のソースプログラムについて前回解析時に該当ソースプログラムの解析で生成された依存関係データ160を用いて,更新判定対象のソースプログラムについての第1のハッシュ値を求める。より具体的には,算出部111は,更新管理情報記憶部115の更新管理データ116’から,更新判定対象のソースプログラムに対応する依存関係データ160を取得する。算出部111は,取得した依存関係データ160に基づいて,更新判定対象のソースプログラムに依存関係プログラムを連結し,連結データ161を生成する。算出部111は,連結データ161に対して所定のハッシュ関数を用い,第1のハッシュ値を算出する。比較判定部112や解析実行部120については,上述の実施例1と同様の動作となる。
ここで,本実施例2では,更新判定対象のソースプログラムから直接に抽出した依存関係プログラムを用いずに,前回解析時に該当ソースプログラムから抽出した依存関係プログラムを用いて第1のハッシュ値を求めている。更新によってソースプログラムの依存関係プログラムが変更されている可能性があるため,本実施例2で得られる第1のハッシュ値は,必ずしも正確に更新判定対象のソースプログラムとその依存関係プログラムとから求められるハッシュ値になるとは限らない。ただし,本実施例2で求める第1のハッシュ値でも,更新判定対象のソースプログラム更新判定に用いる分には,問題はない。
例えば,更新判定対象のソースプログラムに基づいた依存関係データ160と,前回解析時の該当ソースプログラムに基づいた依存関係データ160とが同じになる場合には,いずれの依存関係データ160を用いても,更新判定対象のソースプログラムから求められる第1のハッシュ値は同じ値となる。すなわち,前回解析時に記録された更新管理データ116' の依存関係データ160を用いても,更新判定対象のソースプログラムについての正しい第1のハッシュ値が求められることになる。そのため,更新判定対象のソースプログラムが更新されていない場合には,第2のハッシュ値と同じ第1のハッシュ値が得られ,更新判定対象のソースプログラムが更新されている場合には,第2のハッシュ値と異なる第1のハッシュ値が得られる。
更新判定対象のソースプログラムに基づいた依存関係データ160と,前回解析時の該当ソースプログラムに基づいた依存関係データ160とが異なる場合には,更新判定対象のソースプログラムと依存関係プログラムとの少なくともいずれかが更新されているはずである。例えば,更新判定対象のソースプログラムが呼び出す依存関係プログラムが変更されている場合,更新判定対象のソースプログラムの記述が更新されている。また例えば,依存関係プログラムが呼び出す依存関係プログラムが変更されている場合,その呼び出しを行っている依存関係プログラムの記述が更新されている。この場合,第1のハッシュ値の算出において,前回解析時に記録された更新管理データ116' の依存関係データ160を用いると,必ず,更新管理データ116' の第2のハッシュ値と異なる第1のハッシュ値が得られることになる。
このように,更新判定対象のソースプログラムに基づいた依存関係データ160の代わりに,前回解析時の該当ソースプログラムに基づいた依存関係データ160を用いて第1のハッシュ値を算出しても,正しいソースプログラムの更新判定が可能である。
更新判定対象のソースプログラムが更新されていると判定された場合,更新管理部113は,次回の更新判定のために,更新判定対象のソースプログラムに基づいた依存関係データ160と,その依存関係データ160を用いて求められるハッシュ値とを,更新管理データ116' に記録しておく必要がある。しかし,上述したように,本実施例2の算出部111で求められる第1のハッシュ値は,必ずしも正確に更新判定対象のソースプログラムとその依存関係プログラムとから求められるハッシュ値になるとは限らない。
そこで,更新管理部113は,更新判定対象のソースプログラムが更新されていると判定された場合に,上述のソースプログラムからハッシュ値を求める手順で,更新判定対象のソースプログラムについての第3のハッシュ値を求める。より具体的には,更新管理部113は,更新判定対象のソースプログラムから依存関係プログラムを抽出して,依存関係データ160を生成する。更新管理部113は,生成した依存関係データ160に基づいて,更新判定対象のソースプログラムに依存関係プログラムを連結し,連結データ161を生成する。更新管理部113は,連結データ161に対して所定のハッシュ関数を用い,第3のハッシュ値を算出する。
更新管理部113は,第3のハッシュ値で,更新管理情報記憶部115に保管された,更新判定対象のソースプログラムに対応する第2のハッシュ値を更新する。また,更新管理部113は,第3のハッシュ値を算出する過程で得られた依存関係データ160で,更新管理情報記憶部115に保管された,更新判定対象のソースプログラムに対応する依存関係データ160を更新する。
図14は,本実施例2の解析部による差分解析処理フローチャートである。
本実施例2において,解析部100は,解析対象として指定された各ソースプログラムに対して,図14に示す差分解析処理を行う。
解析部100の更新判定部110は,解析対象の,すなわち更新判定対象のソースプログラムに対する解析が,最初の解析であるかを判定する(ステップS40)。更新判定対象のソースプログラムに対する解析が最初の解析であるか否かは,例えば,該当ソースプログラムについての第2のハッシュ値や依存関係データ160が更新管理情報記憶部115に保管されているか否かで判定可能である。最初の解析であれば,更新判定対象のソースプログラムに対応する第2のハッシュ値や依存関係データ160は存在しない。最初の解析であれば(ステップS40のYES),更新判定部110は,ステップS46の処理に進む。
最初の解析でなければ(ステップS40のNO),算出部111は,更新管理情報記憶部115の更新管理データ116' から,更新判定対象のソースプログラムに対応する依存関係データ160を取得する(ステップS41)。算出部111は,更新判定対象のソースプログラムに,取得した依存関係データ160に示される依存関係プログラムを連結し(ステップS42),連結データ161を生成する。算出部111は,連結データ161に対して所定のハッシュ関数を用い,第1のハッシュ値を算出する(ステップS43)。
比較判定部112は,更新管理情報記憶部115の更新管理データ116' から,更新判定対象のソースプログラムに対応する第2のハッシュ値を取得する(ステップS44)。比較判定部112は,第1のハッシュ値と第2のハッシュ値とを比較し,第1のハッシュ値と第2のハッシュ値とが一致するかを判定する(ステップS45)。
第1のハッシュ値と第2のハッシュ値とが一致すれば(ステップS45のYES),更新判定対象のソースプログラムは更新されていないと判定されたことになる。このとき,解析実行部120は,更新判定対象の,すなわち解析対象のソースプログラムの静的解析を実行しない。
第1のハッシュ値と第2のハッシュ値とが一致しなければ(ステップS45のNO),更新判定対象のソースプログラムは更新されていると判定されたことになる。このとき,更新判定部110は,次のステップS46の処理に進む。
更新管理部113は,更新判定対象のソースプログラムに対して,依存関係解析処理を実行する(ステップS46)。依存関係解析処理は,例えば図12に示す通りである。更新管理部113は,依存関係データ160に基づいて,更新判定対象のソースプログラムに該ソースプログラムから抽出した依存関係プログラムを連結し(ステップS47),連結データ161を生成する。更新管理部113は,連結データ161に対して所定のハッシュ関数を用い,第3のハッシュ値を算出する(ステップS48)。
更新管理部113は,第3のハッシュ値を,更新判定対象のソースプログラムに対応する次の第2のハッシュ値として,更新管理情報記憶部115の更新管理データ116' に記録する(ステップS49)。更新判定対象のソースプログラムに対する解析が最初の解析である場合には,更新管理データ116' に,該ソースプログラムの最初の解析時のハッシュ値が,第2のハッシュ値として記録される。また,更新判定対象のソースプログラムに対する解析が最初の解析でない場合には,更新管理データ116' に記録された,該当ソースプログラムに対応する前回解析時のハッシュ値である第2のハッシュ値が,最新の解析時のハッシュ値に更新される。
更新管理部113は,ステップS46で生成された依存関係データ160を,更新判定対象のソースプログラムに対応する次の依存関係データ160として,更新管理情報記憶部115の更新管理データ116' に記録する(ステップS50)。更新判定対象のソースプログラムに対する解析が最初の解析である場合には,更新管理データ116' に,該ソースプログラムの最初の解析時の依存関係データ160が記録される。また,更新判定対象のソースプログラムに対する解析が最初の解析でない場合には,更新管理データ116' に記録された,該当ソースプログラムに対応する前回解析時の依存関係データ160が,最新の解析時の依存関係データ160に更新される。
解析実行部120は,更新判定対象の,すなわち解析対象のソースプログラムの静的解析を実行する(ステップS51)。
実施例2では,更新されたと判定された場合にのみ,更新判定対象のソースプログラムから依存関係プログラムを抽出する処理が行われる。そのため,更新されていないソースプログラムの方が多い場合などには,更新判定対象のソースプログラムから依存関係プログラムを抽出する処理の回数が減るので,実施例1と比べて処理時間が短くなる。
ただし,実施例2では,更新されたと判定された場合には,比較に用いる第1のハッシュ値の他に,次回更新判定時の第2のハッシュ値として保管するための第3のハッシュ値を求める処理が行われる。そのため,更新されているソースプログラムの方が多い場合などには,ハッシュ値を算出する回数が増えるので,実施例1と比べて処理時間が長くなる。
このような更新判定処理の設計は,実施例1,実施例2に示す更新判定処理の例に限らず,任意である。例えば,実施例1に示す更新判定処理と,実施例2に示す更新判定処理とをオプションで指定できるように設計することも可能である。
以上,本実施の形態について説明したが,本発明はその主旨の範囲において種々の変形が可能であることは当然である。
例えば,本実施の形態では,差分解析で静的解析を行う場合においてソースプログラムの更新判定を行う例を説明したが,ソースプログラムの更新判定を行う様々なケースで,本実施の形態による更新判定の技術を利用可能である。
また,本実施の形態では,ユーザ装置10での解析時にソースプログラムの更新判定を行う例を説明したが,これに限るものではない。例えば,構成管理サーバ20が,定期的に管理するソースプログラムの解析をまとめて行うようなケースで,本実施の形態によるソースプログラムの更新を行うなどの設計は任意である。