(57)【要約】【課題】ソースプログラムの更新判定で，依存関係があるプログラムも含めて，ファイルを無駄に保持せずに，より短時間でより正確に更新判定を行う技術を提供する。【解決手段】更新管理情報記憶部１１５は，ソースプログラムと前回処理時の第２のハッシュ値との対応を記憶する。算出部１１１は，更新判定対象のソースプログラムに，該プログラムと依存関係があるとされたプログラムを連結したデータのハッシュ値である第１のハッシュ値を求める。比較判定部１１２は，該当ソースプログラムに対応する第２のハッシュ値を取得し，第１のハッシュ値と第２のハッシュ値とが不一致である場合に，該当ソースプログラムが更新されたと判定する。更新管理部１１３は，該当ソースプログラムが更新と判定された場合に，該当ソースプログラムに該プログラムから抽出した依存関係プログラムを連結したデータのハッシュ値で，第２のハッシュ値を更新する。【選択図】図４
2014010699.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータに，
更新判定対象のソースプログラムと依存関係があるプログラムの情報を取得し，
前記ソースプログラムに前記取得した依存関係があるプログラムを連結したデータのハッシュ値である第１のハッシュ値を求め，
記憶部に記憶された，前記ソースプログラムに対応する第２のハッシュ値を取得し，
前記第１のハッシュ値および前記第２のハッシュ値の比較結果に基づき，前記ソースプログラムの更新有無を判定し，
前記ソースプログラムが更新されていると判定された場合に，前記ソースプログラムに前記ソースプログラムから抽出した依存関係があるプログラムを連結したデータのハッシュ値で，記憶部に記憶された前記第２のハッシュ値を更新する
処理を実行させるための更新判定プログラム。
【請求項２】
前記ソースプログラムと依存関係があるプログラムの情報を取得する処理では，記憶部に記憶された，前記ソースプログラムに対応する依存関係があるプログラムの情報を取得し，
前記第２のハッシュ値を更新する処理では，前記ソースプログラムが更新されていると判定された場合に，前記ソースプログラムから前記ソースプログラムと依存関係があるプログラムを抽出し，前記ソースプログラムに該抽出した依存関係があるプログラムを連結したデータのハッシュ値である第３のハッシュ値を求め，求めた第３のハッシュ値で記憶部に記憶された前記第２のハッシュ値を更新し，
前記コンピュータに，さらに，前記ソースプログラムが更新されていると判定された場合に，前記ソースプログラムから抽出した依存関係があるプログラムの情報で，記憶部に記憶された前記依存関係があるプログラムの情報を更新する処理を実行させる
ことを特徴とする請求項１に記載の更新判定プログラム。
【請求項３】
前記依存関係があるプログラムを抽出する際には，標準ヘッダファイルを抽出する対象から除外する
ことを特徴とする請求項１または請求項２に記載の更新判定プログラム。
【請求項４】
ソースプログラムと第２のハッシュ値との対応を含む情報を記憶する記憶部と，
更新判定対象のソースプログラムと依存関係があるプログラムの情報を取得し，前記更新判定対象のソースプログラムに前記取得した依存関係があるプログラムを連結したデータのハッシュ値である第１のハッシュ値を求める算出部と，
前記更新判定対象のソースプログラムに対応する第２のハッシュ値を前記記憶部から取得し，前記第１のハッシュ値および前記第２のハッシュ値の比較結果に基づき，前記更新判定対象のソースプログラムの更新有無を判定する比較判定部と，
前記更新判定対象のソースプログラムが更新されていると判定された場合に，前記更新判定対象のソースプログラムに前記更新判定対象のソースプログラムから抽出した依存関係があるプログラムを連結したデータのハッシュ値で，前記記憶部に記憶された前記第２のハッシュ値を更新する更新管理部とを備える
ことを特徴とする更新判定装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は，プログラムの更新を判定する更新判定プログラムおよび更新判定装置に関するものである。
【背景技術】
【０００２】
例えば，ソフトウェアの開発等において，作成されたソースプログラムのコンパイルや静的解析等が行われる。このとき，最初は，コンパイラや静的解析ツールなどへの入力の対象となったすべてのソースプログラムのファイルに対して，コンパイルや静的解析等が実行される。２回目以降は，手間や時間の無駄を省くために，更新されたソースプログラムのファイルのみを対象として，コンパイルや静的解析等を実行するということが一般に行われている。なお，以下では，ソースプログラムのファイルをソースファイルとも呼ぶ。
【０００３】
このような差分ビルドや差分解析などを行う場合には，対象となるソースプログラムが更新されているか否かを判断する必要がある。このとき，ユーザが１つ１つのソースプログラムの更新を判断するのは非常に手間となるので，ソースプログラムの更新判定をコンピュータで自動化できることが望ましい。
【０００４】
ソースプログラムの更新判定を行う技術としては，例えば，前回処理時のソースプログラム自身と，今回処理を行うソースプログラム自身とを直接に比較する技術がある。また，別の技術としては，前回処理時のソースファイルの更新時刻を示すタイムスタンプと，今回処理を行うソースファイルの更新時刻を示すタイムスタンプとを比較する技術がある。
【０００５】
なお，監視対象ファイルが更新されたか否かを，該ファイルの前回アクセス時のハッシュ値と今回アクセス時のハッシュ値とを比較して判定する技術が知られている。また，プログラム開発において，プログラムや，関連するプログラム部品，ツール，仕様書，開発者等の情報を統合的に管理する技術が知られている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開平９−１９０３７２号公報
【特許文献２】特開平９−２１２３５２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
上述のソースプログラム自身を比較する技術は，正確な比較判定ができるという利点がある。しかし，この技術では，前回処理時のソースファイルをすべて別に保存しておく必要があり，ディスクスペースを大量に消費するという問題がある。また，ソースプログラム同士の比較処理には多くの時間を浪費するという問題がある。
【０００８】
これに対して，上述のタイムスタンプを比較する技術は，前回処理時のソースプログラムについてはそのファイルの更新時刻を示すタイムスタンプのみを保存しておけばよく，さらに比較判定の処理時間が短いという利点がある。しかし，この技術では，ソースファイルの更新時間を示すタイムスタンプが必ずしもそのソースプログラムの更新時刻を示しているとは限らないため，必ずしも正確に更新を判定できないという問題がある。
【０００９】
また，ソースプログラムのコンパイルや静的解析などの処理では，そのソースプログラムと依存関係があるプログラムについても同時に処理が行われる。依存関係があるプログラムは，例えば，ソースプログラム中のｉｎｃｌｕｄｅ文で指定されるヘッダファイルや，ｉｍｐｏｒｔ文で指定されるライブラリやパッケージなどのプログラムである。差分ビルドや差分解析などを行う場合には，処理対象のソースプログラムだけではなく，そのソースプログラムと依存関係があるプログラムについても更新されているか否かを判断する必要がある。依存関係があるプログラムについてもそれぞれ更新を判定する処理を行うと，その比較処理には多くの時間を浪費するという問題がある。
【００１０】
一側面では，本発明は，短時間で正確なプログラムの更新判定を可能とする技術を提供することを目的とする。
【課題を解決するための手段】
【００１１】
１態様では，開示するプログラムは，コンピュータを次のように機能させる。すなわち，前記プログラムは，前記プログラムがインストールされて実行されるコンピュータに，更新判定対象のソースプログラムと依存関係があるプログラムの情報を取得し，該ソースプログラムに取得した依存関係があるプログラムを連結したデータのハッシュ値である第１のハッシュ値を求め，記憶部に記憶された該ソースプログラムに対応する第２のハッシュ値を取得し，第１のハッシュ値および第２のハッシュ値の比較結果に基づき，該ソースプログラムの更新有無を判定し，該ソースプログラムが更新されていると判定された場合に，該ソースプログラムに該ソースプログラムから抽出した依存関係があるプログラムを連結したデータのハッシュ値で，記憶部に記憶された第２のハッシュ値を更新する処理を実行させる。
【発明の効果】
【００１２】
１態様では，短時間で正確なプログラムの更新判定が可能となる。
【図面の簡単な説明】
【００１３】
【図１】ソースプログラムの更新判定を説明する図である。
【図２】依存関係があるファイルが存在する場合のソースプログラムの更新判定を説明する図である。
【図３】本実施の形態による開発システムの構成例を示す図である。
【図４】本実施の形態によるユーザ装置の構成例を示す図である。
【図５】本実施の形態の更新判定部による更新判定処理フローチャートである。
【図６】本実施の形態によるユーザ装置を実現するコンピュータのハードウェア構成例を示す図である。
【図７】ソースプログラムから依存関係プログラムを抽出する例を説明する図である。
【図８】依存関係データの例を示す図である。
【図９】連結データの例を示す図である。
【図１０】本実施例１による更新管理データの例を示す図である。
【図１１】本実施例１の解析部による差分解析処理フローチャートである。
【図１２】本実施例１の更新判定部による依存関係解析処理フローチャートである。
【図１３】本実施例２による更新管理データの例を示す図である。
【図１４】本実施例２の解析部による差分解析処理フローチャートである。
【発明を実施するための形態】
【００１４】
以下，本実施の形態について，図を用いて説明する。なお，以下の本実施の形態では，主に静的解析を行う際にソースプログラムの更新判定を行う例を説明する。
【００１５】
図１は，ソースプログラムの更新判定を説明する図である。
【００１６】
ここでは，ファイル名が“ａ．ｃ”であるＣ言語で記述されたソースプログラムについて，静的解析の実行時に，その更新判定が行われるものとする。
【００１７】
図１（Ａ）は，ソースプログラム自身を比較する例を示す。ソースプログラムの更新判定を行う技術として，ソースプログラム自身を比較して更新判定を行う方法が考えられる。この方法では，例えば，図１（Ａ）に示すように，前回解析時のソースファイルのプログラムと，今回の解析対象のソースファイルのプログラムとを，文字ごとに比較する。なお，ソースファイルは，ソースプログラムのファイルである。
【００１８】
この方法では，ソースプログラムが更新されたか否かを正確に判定することができる。しかし，この方法では，一度解析したソースファイルを次の解析時まで保管しておく必要があり，またソースプログラム自身を比較するため，比較処理に多くの時間が必要となるという問題がある。
【００１９】
図１（Ｂ）は，ソースファイルのタイムスタンプを比較する例を示す。ソースプログラムの更新判定を行う技術として，ソースファイルの更新日時を示すタイムスタンプを比較して更新判定を行う方法が考えられる。この方法では，例えば，図１（Ｂ）に示すように，前回解析時のソースファイルの更新日時を示すタイムスタンプと，今回の解析対象のソースファイルの更新日時を示すタイムスタンプとを比較する。
【００２０】
この方法では，前回解析時のタイムスタンプさえ保管しておけば前回解析時のソースファイルを保管しておく必要がなく，タイムスタンプ同士の比較であるので比較処理にかかる時間は短い。しかし，この方法では，ソースファイルのタイムスタンプが必ずしもソースプログラムの更新日時を示すとは限らないため，必ずしも正確な更新判定ができないという問題がある。
【００２１】
例えば，構成管理サーバなどを用いて開発資源を一括管理する場合において，作業を行うソースファイルを構成管理サーバからユーザ装置に取り出す際に，そのソースファイルの更新日時を示すタイムスタンプがその取り出し日時に書き換えされるケースがある。このケースでは，ソースプログラム自身が更新されていなくても，ソースファイルのタイムスタンプが前回解析時のものと一致しないことで，更新されたと判定されてしまう可能性がある。
【００２２】
図１（Ｃ）は，本実施の形態によるソースプログラムのハッシュ値を比較する例を示す。本実施の形態では，図１（Ｃ）に示すように，前回解析時のソースファイルのプログラムのハッシュ値と，今回の解析対象のソースファイルのプログラムのハッシュ値とを比較することで，ソースプログラムの更新を判定する。ハッシュ値を求める際には，例えば，ソースプログラムの全文字を対象としてハッシュ値を求める。
【００２３】
図１（Ｃ）に示すように，ソースプログラムのハッシュ値の比較で更新を判定する場合，前回解析時のハッシュ値を保存しておけば，前回解析時のソースファイルをあえて保存しておかなくても，ソースプログラムの更新判定が可能となる。また，ソースプログラム自身を比較する必要がないので，処理時間は短い。また，ソースプログラム自身から算出されるハッシュ値を用いるので，更新判定の正確性は高い。
【００２４】
図２は，依存関係があるファイルが存在する場合のソースプログラムの更新判定を説明する図である。
【００２５】
図２に示す例においてファイル名“ａ．ｈ”，“ｂ．ｈ”のファイルは，ソースファイル“ａ．ｃ”のプログラム内で指定されたヘッダファイルである。また，ファイル名“ａａ．ｈ”のファイルは，さらにヘッダファイル“ａ．ｈ”のプログラム内で指定されたヘッダファイルである。ヘッダファイルは，インクルードファイルとも呼ばれ，例えば，Ｃ言語で記述されたソースファイルのコンパイル時に，該ソースファイルの一部として取り込まれるファイルである。例えば，Ｃ言語のソースプログラムにおいて，ヘッダファイルはｉｎｃｌｕｄｅ文で指定される。一般に，ヘッダファイルは，ソースコード形式のファイルである。
【００２６】
取り込むヘッダファイルの指定がソースプログラム内にある場合に，ソースプログラム自身が更新されていなくても，ヘッダファイルのプログラムが更新されていれば，実質的にソースプログラムが更新されている状態となり，コンパイルや解析の結果に影響する。そのため，差分ビルドや差分解析を行う場合には，ソースプログラムの更新判定だけではなく，そのソースプログラムで指定されるヘッダファイルのプログラムの更新も判定する必要がある。
【００２７】
以下では，ソースプログラムで指定されるヘッダファイルのプログラムのように，ソースプログラムと依存関係があるプログラムを，依存関係プログラムとも呼ぶ。また，ヘッダファイルのように，依存関係プログラムのファイルを，依存関係ファイルとも呼ぶ。
【００２８】
依存関係プログラムは，ソースプログラムの差分ビルドや解析などにおいて，そのソースプログラムの更新判断に影響を及ぼすプログラムである。依存関係プログラムとしては，ｉｎｃｌｕｄｅ文で指定されるヘッダファイルのプログラムの他にも，例えば，ｉｍｐｏｒｔ文で指定されるライブラリやパッケージのプログラムなどがある。依存関係プログラムは，ソースプログラムを記述する言語の仕様に応じたものとなる。
【００２９】
図２（Ａ）は，ソースプログラムの更新判定において，各依存関係プログラムの更新判定も併せて行う例を示す。上述のように解析対象のソースファイルの更新判定を行う際には，各依存関係ファイルの更新判定も併せて行う。このとき，図２（Ａ）に示すように，ファイルごとに個別に更新判定を行うと，比較処理に多くの時間が必要となるという問題がある。
【００３０】
図２（Ｂ）は，本実施の形態によるソースプログラムとその依存関係プログラムとを合わせたハッシュ値を比較する例を示す。本実施の形態では，図２（Ｂ）に示すように，ソースファイルのプログラムと依存関係があるファイルプログラムとを合わせてハッシュ値を求め，そのハッシュ値を比較することでソースプログラムの更新を判定する。図２（Ｂ）に示すように，ソースプログラムとその依存関係プログラムとをまとめてハッシュ値を求め，そのハッシュ値の比較で更新を判定できれば，プログラムごとに個別に更新を判定するよりも，処理時間が短くなる。
【００３１】
図３は，本実施の形態による開発システムの構成例を示す図である。
【００３２】
図１の例に示す開発システムにおいて，構成管理サーバ２０は，開発資源を統合管理するコンピュータである。構成管理サーバ２０は，本システムで開発されたソースプログラムのファイルを含む，資源となる様々なソースファイルを格納し，管理するソース管理部２５を備える。
【００３３】
図１の例に示す開発システムにおいて，各ユーザ装置１０は，開発等に携わる各ユーザが使用するコンピュータである。各ユーザ装置１０は，ＬＡＮ（Local Area Network）等のネットワーク３０を介して構成管理サーバ２０にアクセス可能である。各ユーザ装置１０は，ソースプログラムのプログラミング，コンパイル，解析等を行う際に，構成管理サーバ２０のソース管理部２５から，必要なソースプログラムを取得する。
【００３４】
図４は，本実施の形態によるユーザ装置の構成例を示す図である。
【００３５】
ユーザ装置１０は，プログラム記憶部１５，解析部１００を備える。プログラム記憶部１５は，該ユーザ装置１０での作業で使用するソースファイル等のプログラム資源を記憶する記憶部である。作業に使用するソースファイル等のプログラム資源は，例えば，構成管理サーバ２０のソース管理部２５から取得されたものなどである。
【００３６】
解析部１００は，指定された解析対象のソースプログラムの静的解析を行う。解析部１００は，解析ツールなどによって実現される。解析対象のソースプログラムは，単体で指定されてもよいし，群で指定されてもよい。なお，本実施の形態による解析部１００では，一度解析が行われたソースプログラムについて再度解析が行われる場合に，内容が更新されたソースプログラムについてのみ解析を行う差分解析が行われるものとする。
【００３７】
解析部１００は，更新判定部１１０，解析実行部１２０を備える。解析実行部１２０は，解析対象のソースプログラムについて，所定の静的解析を実行する。
【００３８】
更新判定部１１０は，解析対象のソースプログラムについて，前回の処理時から内容が更新されているかを判定する。本実施の形態において，解析部１００にとっての解析対象のソースプログラムは，更新判定部１１０にとって，更新判定対象のソースプログラムとなる。このとき，本実施の形態の更新判定部１１０は，更新判定対象のソースプログラム自身だけではなく，該ソースプログラムの依存関係プログラムも含めた更新判定を行う。すなわち，更新判定部１１０は，更新判定対象のソースプログラム自身が更新されていなくても，依存関係プログラムが更新されていれば，更新判定対象のソースプログラムが更新されていると判定する。
【００３９】
本実施の形態の更新判定部１１０は，図２（Ｂ）の例にも示すように，ソースプログラムと依存関係プログラムとを合わせてハッシュ値を求め，そのハッシュ値を比較することでソースプログラムの更新を判定する。更新判定部１１０は，算出部１１１，比較判定部１１２，更新管理部１１３，更新管理情報記憶部１１５を備える。
【００４０】
更新管理情報記憶部１１５は，ソースプログラムと第２のハッシュ値との対応を含む，ソースプログラムの更新判定に用いる情報を記憶する記憶部である。第２のハッシュ値は，対応するソースプログラムについて，最初の処理で記録されたハッシュ値か，過去の最後に更新が確認された時点でのハッシュ値である。第２のハッシュ値は，対応するソースプログラムについての前回の更新判定時におけるハッシュ値であるとも言える。
【００４１】
本実施の形態では，ソースプログラムの更新が行われない限り第２のハッシュ値は更新されない。そのため，本実施の形態の例における第２のハッシュ値は，対応するソースプログラムについて，前回解析が行われた時点でのソースプログラムと，該ソースプログラムから抽出した依存関係プログラムとから算出されたハッシュ値となる。
【００４２】
算出部１１１は，更新判定対象のソースプログラムについて，第１のハッシュ値を算出する。本実施の形態の例において，第１のハッシュ値は，更新判定対象のソースプログラム，すなわち今回更新判定を行う時点での該当ソースプログラムと，依存関係プログラムとから算出されるハッシュ値である。
【００４３】
より具体的には，算出部１１１は，更新判定対象のソースプログラムについて，該更新判定対象のソースプログラムと依存関係があるプログラム，すなわち依存関係プログラムの情報を取得する。依存関係プログラムの情報は，例えば，更新判定対象のソースプログラムから抽出した依存関係プログラムの情報や，更新判定対象のソースプログラムについて前回解析が行われた時点での該当ソースプログラムから抽出した依存関係プログラムの情報などである。前回解析が行われた時点での該当ソースプログラムから抽出した依存関係プログラムの情報を取得する場合には，算出部１１１は，例えば，更新管理情報記憶部１１５から情報を取得する。
【００４４】
算出部１１１は，更新判定対象のソースプログラムに取得した依存関係プログラムを連結したデータのハッシュ値である第１のハッシュ値を求める。例えば，算出部１１１は，更新判定対象のソースプログラムのファイルと，依存関係プログラムのファイルとを取得する。算出部１１１は，更新判定対象のソースプログラムの文字列と，依存関係プログラムの文字列とを連結した文字列データを生成する。以下では，更新判定対象のソースプログラムに依存関係プログラムを連結して得られる文字列データを，連結データとも呼ぶ。算出部１１１は，連結データを所定のハッシュ関数に入力し，第１のハッシュ値を得る。文字列のハッシュ値を求めるハッシュ関数のアルゴリズムについては，様々なハッシュ関数のアルゴリズムが周知である。例えば，Ｃ言語でも，対象の文字列からハッシュ値を求めるアルゴリズムがライブラリで提供されている。
【００４５】
比較判定部１１２は，第１のハッシュ値と第２のハッシュ値との比較結果に基づいて，更新判定対象のソースプログラムの更新有無を判定する。より具体的には，比較判定部１１２は，更新判定対象のソースプログラムに対応する第２のハッシュ値を，更新管理情報記憶部１１５から取得する。比較判定部１１２は，算出部１１１で算出された第１のハッシュ値と，更新管理情報記憶部１１５から取得した第２のハッシュ値とを比較する。比較判定部１１２は，比較結果が一致である場合には，更新判定対象のソースプログラムが更新されていないと判定し，比較結果が不一致である場合には，更新判定対象のソースプログラムが更新されていると判定する。
【００４６】
更新管理部１１３は，更新判定対象のソースプログラムが更新されていると判定された場合に，更新管理情報記憶部１１５に記憶された更新判定対象のソースプログラムに対応する第２のハッシュ値を更新する。更新管理部１１３によって，更新管理情報記憶部１１５の第２のハッシュ値は，更新判定対象のソースプログラムに更新判定対象のソースプログラムから抽出した依存関係プログラムを連結したデータのハッシュ値で更新される。
【００４７】
例えば，算出部１１１が，更新判定対象のソースプログラムから抽出した依存関係プログラムの情報に基づいて第１のハッシュ値を求めている場合，更新管理部１１３は，第１のハッシュ値で更新管理情報記憶部１１５の第２のハッシュ値を更新する。
【００４８】
また，例えば，算出部１１１が，前回解析が行われた時点での該当ソースプログラムから抽出された依存関係プログラムの情報に基づいて第１のハッシュ値を求めている場合，更新管理部１１３は，更新判定対象のソースプログラムから依存関係ファイルを抽出する。更新管理部１１３は，更新判定対象のソースプログラムに抽出した依存関係プログラムを連結したデータのハッシュ値である第３のハッシュ値を求める。更新管理部１１３は，求めた第３のハッシュ値で，更新管理情報記憶部１１５の第２のハッシュ値を更新する。このとき，更新管理部１１３は，更新判定対象のソースプログラムから抽出した依存関係プログラムの情報で，更新管理情報記憶部１１５に記憶された，前回解析が行われた時点での該当ソースプログラムから抽出された依存関係プログラムの情報を更新する。
【００４９】
このように，更新判定対象のソースプログラムが更新されていると判定された場合に第２のハッシュ値を更新することにより，該当ソースプログラムについて，常に最後に更新が判定された時点のハッシュ値が，第２のハッシュ値として保管されるようになる。また，該当ソースプログラムの依存関係プログラムの情報を保管する場合も，常に最後に該当ソースプログラムの更新が判定された時点の依存関係プログラムの情報が保管されるようになる。
【００５０】
図５は，本実施の形態の更新判定部による更新判定処理フローチャートである。
【００５１】
更新判定部１１０において，算出部１１１は，更新判定対象のソースプログラムについて，依存関係プログラムの情報を取得する（ステップＳ１０）。算出部１１１は，更新判定対象のソースプログラムと，取得した情報に示される依存関係プログラムとを取得し，更新判定対象のソースプログラムに依存関係プログラムを連結して（ステップＳ１１），連結データを生成する。算出部１１１は，連結データに対して所定のハッシュ関数を用い，第１のハッシュ値を算出する（ステップＳ１２）。
【００５２】
比較判定部１１２は，更新管理情報記憶部１１５から，更新判定対象のソースプログラムに対応する第２のハッシュ値を取得する（ステップＳ１３）。比較判定部１１２は，第１のハッシュ値と第２のハッシュ値とを比較し，第１のハッシュ値と第２のハッシュ値とが一致するかを判定する（ステップＳ１４）。
【００５３】
比較の結果，第１のハッシュ値と第２のハッシュ値とが一致する場合（ステップＳ１４のＹＥＳ），更新判定対象のソースプログラムは前回のものから更新されていないと判定されたことになる。
【００５４】
比較の結果，第１のハッシュ値と第２のハッシュ値とが一致しない場合（ステップＳ１４のＮＯ），更新判定対象のソースプログラムは前回のものから更新されていると判定されたことになる。このとき，更新管理部１１３は，更新判定対象のソースプログラムにその更新判定対象のソースプログラムから抽出した依存関係プログラムを連結したデータのハッシュ値で，更新管理情報記憶部１１５に記憶された，更新判定対象のソースプログラムに対応する第２のハッシュ値を更新する（ステップＳ１５）。
【００５５】
本実施の形態による更新判定部１１０では，ソースプログラムの更新判定が，更新判定対象のソースプログラムに基づいて算出されるハッシュ値と，前回処理時の該当ソースプログラムに基づいて算出されたハッシュ値との比較により行われる。これにより，前回処理時のハッシュ値を保存しておけば，前回処理時のソースファイルを無駄に保存しておかなくても，更新判定ができる。また，ソースプログラム自身を比較せずに，ハッシュ値の比較で更新判定を行うので，処理時間の短縮が図れる。また，ソースプログラム自身から求めたハッシュ値を用いて更新判定を行うので，精度が高い判定が可能となる。
【００５６】
さらに，本実施の形態による更新判定部１１０では，ソースプログラムに依存関係プログラムを連結したデータから，比較に用いるハッシュ値が求められる。これにより，ソースプログラムと依存関係プログラムとをまとめて更新判定できるので，処理時間の短縮が図れる。ソースプログラム自身が更新されていなくても，そのソースプログラムの依存関係プログラムが更新されていれば，そのソースプログラムの解析結果が変わる可能性がある。
【００５７】
図６は，本実施の形態によるユーザ装置を実現するコンピュータのハードウェア構成例を示す図である。
【００５８】
図４に示す本実施の形態のユーザ装置１０を実現するコンピュータ１は，例えば，ＣＰＵ（Central Processing Unit ）２，主記憶となるメモリ３，記憶装置４，通信装置５，媒体読取・書込装置６，入力装置７，出力装置８等を備える。記憶装置４は，例えばＨＤＤ（Hard Disk Drive ）等の外部記憶装置や，補助記憶装置などである。媒体読取・書込装置６は，例えばＣＤ−Ｒ（Compact Disc Recordable ）ドライブやＤＶＤ−Ｒ（Digital Versatile Disc Recordable ）ドライブなどである。入力装置７は，例えばキーボード・マウス等の入力機器などである。出力装置８は，例えばディスプレイ等の表示装置などである。
【００５９】
図４に示すユーザ装置１０およびユーザ装置１０が備える各機能部は，コンピュータ１が備えるＣＰＵ２，メモリ３等のハードウェアと，ソフトウェアプログラムとによって実現することが可能である。コンピュータ１が実行可能なプログラムは，記憶装置４に記憶され，その実行時にメモリ３に読み出され，ＣＰＵ２により実行される。
【００６０】
コンピュータ１は，可搬型記録媒体から直接プログラムを読み取り，そのプログラムに従った処理を実行することもできる。また，コンピュータ１は，サーバコンピュータからプログラムが転送されるごとに，逐次，受け取ったプログラムに従った処理を実行することもできる。さらに，このプログラムは，コンピュータ１で読み取り可能な記録媒体に記録しておくことができる。
【００６１】
ここで，本実施の形態の更新判定部１１０によるソースプログラムのハッシュ値を求める例を説明する。
【００６２】
図７は，ソースプログラムから依存関係プログラムを抽出する例を説明する図である。
【００６３】
ここでは，ファイル名“ａ．ｃ”のソースファイル２００のプログラムを解析して依存関係プログラムを抽出し，更新判定に用いるハッシュ値を求めるものとする。図７に示すファイル名“ａ．ｃ”のソースファイル２００は，Ｃ言語で記述されたソースプログラムのファイルの例である。
【００６４】
まず，更新判定部１１０は，ソースプログラムに対して，構文解析を行う。更新判定部１１０は，ソースプログラムに対して意味解析を行い，ソースプログラム中の特定の命令文で指定された依存関係プログラムを順に抽出する。図７に示す例では，ソースファイル２００のプログラムから，依存関係プログラムを指定する特定の命令文であるｉｎｃｌｕｄｅ文で指定されたヘッダファイル２１０ａ〜ｃ，ｅが抽出される。ヘッダファイル２１０ａ〜ｃ，ｅのプログラムが，依存関係プログラムのファイルとなる依存関係ファイルである。
【００６５】
更新判定部１１０は，抽出された依存関係プログラムについても，さらに依存関係プログラムの抽出を行う。図７に示す例においても，ファイル名“ａ．ｈ”のヘッダファイル２１０ｃから，さらにファイル名“ａａ．ｈ”のヘッダファイル２１０ｄが抽出されている。本実施の形態では，更新判定部１１０は，ソースプログラムと抽出された依存関係プログラムとに対して，再帰的に依存関係プログラムの抽出を実行する。
【００６６】
なお，図７に示すソースファイル２００のプログラムにおいて，<>で示されるヘッダファイル２１０ａ，ｂは，コンパイラ等が提供する標準ヘッダファイルを示す。また，図７に示すソースファイル２００のプログラムにおいて，""で示されるヘッダファイルｃ〜ｅは，各企業等で独自に作成されたローカルなヘッダファイルを示す。図７に示す例では，依存関係ファイルとして標準ヘッダファイルも抽出しているが，標準ヘッダファイルを抽出する依存関係ファイルの対象から除外してもよい。
【００６７】
ソフトウェア開発において，ローカルなヘッダファイルについては，随時改良される可能性があるが，標準ヘッダファイルについては，コンパイラのバージョンアップでもない限り，ほとんど更新されることはない。そのため，コンパイラのバージョンアップがない場合には，標準ヘッダファイルを依存関係ファイルの対象外としても問題はない。標準ヘッダファイルを抽出する依存関係ファイルの対象外とすることにより，処理の短縮が図れる。
【００６８】
標準ヘッダファイルを依存関係ファイルとして抽出するか，抽出する依存関係ファイルから除外するかをオプションで選択できるようにしてもよい。
【００６９】
図７に示す例では，ソースファイル２００に対する解析で，最終的にヘッダファイル２１０ａ〜ｅの依存関係ファイルが抽出される。更新判定部１１０は，抽出された依存関係ファイルを，依存関係プログラムの情報である依存関係データに記録する。
【００７０】
図８は，依存関係データの例を示す図である。
【００７１】
図８に示す依存関係データ１６０は，図７に示すソースファイル２００のプログラムから抽出された依存関係プログラムの情報の一例を示す。図８に示す依存関係データ１６０では，図７に示すソースファイル２００のプログラムの解析で抽出された順に，ヘッダファイル２１０のファイル名が記録されている。図８に示す依存関係データ１６０において，ｆで示される数値は，そのヘッダファイル２１０が，ソースファイル２００のプログラムから抽出された順序を示す。本実施の形態の例では，抽出された依存関係プログラムに対して再帰的に依存関係プログラムの抽出が行われるため，図７に示すように，ソースファイル２００のプログラムのヘッダファイル２１０ｅより先に，ヘッダファイル２１０ｃのプログラムのヘッダファイル２１０ｄが抽出されている。
【００７２】
なお，ソースプログラムから依存関係プログラムを抽出する順序のルールについては，任意の設計が可能である。例えば，本実施の形態の例ではソースプログラムから抽出された依存関係プログラムから再帰的に依存関係プログラムを抽出しているが，ソースプログラムからすべての依存関係プログラムを抽出し，その後で各依存関係プログラムからさらに依存関係プログラムを抽出するようにしてもよい。だだし，一連の同じソースプログラムに対する更新判定では，常に同じルールで依存関係プログラムの抽出を行うものとする。
【００７３】
ソースプログラムからの依存関係プログラムの抽出において，抽出される順序には意味がある。ソースプログラムにおける依存関係プログラムの出現順序が変わるだけで，コンパイルや静的解析の結果が変わる可能性がある。一連の同じソースプログラムに対する更新判定において，途中で依存関係プログラムを抽出するルールを変えてしまうと，正確な更新判定ができずに正しい差分ビルドや差分解析が実行されない可能性がある。
【００７４】
更新判定部１１０は，ソースプログラムの解析で得られた依存関係データ１６０に基づいて，ソースプログラムと依存関係プログラムとを連結した連結データを生成する。
【００７５】
図９は，連結データの例を示す図である。
【００７６】
図９に示す連結データ１６１は，図７に示すソースファイル２００のプログラムに対する解析で得られた依存関係データ１６０に基づいて，ソースファイル２００のプログラムに各ヘッダファイル２１０のプログラムとを連結したデータの一例である。本実施の形態では，連結データ１６１は，プログラムの文字列を連結した文字列データとなる。図９に示す連結データ１６１では，最初にソースファイル２００のプログラムがあり，図８の依存関係データ１６０に示される順に，各ヘッダファイル２１０ａ〜ｅのプログラムが連結されている。
【００７７】
なお，ソースプログラムに依存関係プログラムを連結する順序のルールについては，任意の設計が可能である。例えば，図９に示す例では最初のソースプログラムに対して依存関係データ１６０に示される順に各依存関係プログラムを連結しているが，最初に依存関係データ１６０に示される順に依存関係プログラムを連結し，最後にソースプログラムを連結するようにしてもよい。だだし，一連の同じソースプログラムに対する更新判定では，常に同じルールでソースプログラムに依存関係プログラムを連結するものとする。
【００７８】
ソースプログラムに依存関係プログラムを連結する際に，プログラムを連結する順序を変えると，連結データから算出されるハッシュ値が変わってしまう。例えば，前回の更新判定時と今回の更新判定時とで，連結する順序のルールを変えてしまうと，ソースプログラムが更新されていなくても，得られるハッシュ値が異なるので，ソースプログラムが更新されていると判定されてしまう。一連の同じソースプログラムに対する更新判定において，途中でプログラムを連結する順序のルールを変えてしまうと，正確な更新判定ができずに正しい差分ビルドや差分解析が実行されない可能性がある。
【００７９】
更新判定部１１０は，生成された連結データ１６１について，所定のハッシュ関数を用いて，ハッシュ値を算出する。ソースプログラムか依存関係プログラムのいずれかが更新されると得られるハッシュ値が変わるので，ハッシュ値の比較により，ソースプログラムの更新を判定できる。
【００８０】
以下では，本実施の形態によるソースプログラムの更新判定の技術について，より具体的な実施例を説明する。
【００８１】
〔実施例１〕
本実施例１において，ユーザは，あらかじめ目的とする静的解析に必要なソースファイルやヘッダファイル等のプログラムファイルを構成管理サーバ２０等から取得し，自ユーザ装置１０のプログラム記憶部１５に格納しておくものとする。ユーザは，静的解析の実行にあたって，解析対象のソースプログラムを指定する。
【００８２】
解析部１００は，ユーザに指定された解析対象のソースプログラムの静的解析を実行する。ここでは，解析部１００により，必ずしも指定されたすべてのソースプログラムについて解析するのではなく，まだ解析を行っていないソースプログラムと，前回の解析時以降に更新されたソースプログラムとについて解析する差分解析が行われる。解析部１００において，更新判定部１１０は，解析対象のソースプログラムを更新判定対象のソースプログラムとして，上述したハッシュ値の比較により，前回処理時から更新があるかを判定する。
【００８３】
図１０は，本実施例１による更新管理データの例を示す図である。
【００８４】
図１０に示す更新管理データ１１６は，更新管理情報記憶部１１５に記憶された，ソースプログラムと第２のハッシュ値との対応を含む，ソースプログラムの更新判定に用いる情報の一例を示す。図１０に示す更新管理データ１１６は，ファイル形式のデータとなっている。ここでは，ハッシュ値を算出するもととなったソースファイルのファイル名に，拡張子“．ｈａｓｈ”を付けたものを，更新管理データ１１６のファイル名とする。
【００８５】
図１０に示すファイル名“ａ．ｃ．ｈａｓｈ”の更新管理データ１１６は，図７に示すファイル名“ａ．ｃ”のソースファイル２００から求められたハッシュ値が記録されたデータとなる。すなわち，図１０に示す更新管理データ１１６は，ファイル名“ａ．ｃ”のソースファイル２００のプログラムと，そのソースプログラムについての前回解析実行時のハッシュ値である第２のハッシュ値とを対応付けたデータとなる。図１０に示す更新管理データ１１６において，ｈａｓｈで示される値“１２３４５６”が，記録された第２のハッシュ値である。
【００８６】
なお，第２のハッシュ値が保管される更新管理データ１１６が，必ずしも図１０に示すようなソースプログラムごとのファイル形式のデータである必要はない。例えば，更新管理データ１１６が，各ソースプログラムと第２のハッシュ値との対応を示すレコードを持つテーブル形式のデータであってもよい。
【００８７】
本実施例１において，更新判定部１１０の算出部１１１は，上述のソースプログラムからハッシュ値を求める手順で，更新判定対象のソースプログラムについての第１のハッシュ値を求める。より具体的には，算出部１１１は，更新判定対象のソースプログラムから依存関係プログラムを抽出して，依存関係データ１６０を生成する。算出部１１１は，生成した依存関係データ１６０に基づいて，更新判定対象のソースプログラムに依存関係プログラムを連結し，連結データ１６１を生成する。算出部１１１は，連結データ１６１に対して所定のハッシュ関数を用い，第１のハッシュ値を算出する。
【００８８】
比較判定部１１２は，更新管理情報記憶部１１５の更新管理データ１１６から，更新判定対象のソースプログラムに対応する第２のハッシュ値を取得する。比較判定部１１２は，第１のハッシュ値と第２のハッシュ値とを比較して，双方が一致すれば更新判定対象のソースプログラムは更新されていないと判定し，双方が一致しなければ更新判定対象のソースプログラムが更新されていると判定する。
【００８９】
解析部１００において，解析実行部１２０は，更新判定対象の，すなわち解析対象のソースプログラムが更新されていると判定された場合には，その解析対象のソースプログラムに対する静的解析を実行する。更新判定対象の，すなわち解析対象のソースプログラムが更新されていないと判定された場合には，解析実行部１２０は，その解析対象のソースプログラムに対する静的解析を実行しない。このように，本実施の形態の解析部１００では，差分解析が実行される。
【００９０】
更新判定対象のソースプログラムが更新されていると判定された場合には，該当ソースプログラムについての正しいハッシュ値が，更新管理情報記憶部１１５に保管された前回の解析実行時の第２のハッシュ値と異なっている。このとき，更新管理部１１３は，更新管理情報記憶部１１５に保管された，更新判定対象のソースプログラムに対応する第２のハッシュ値を，更新判定対象のソースプログラムに該ソースプログラムから抽出した依存関係プログラムを連結したデータのハッシュ値で更新する。
【００９１】
本実施例１では，算出部１１１で求めた第１のハッシュ値が，更新判定対象のソースプログラムに該ソースプログラムから抽出した依存関係プログラムを連結したデータのハッシュ値である。更新管理部１１３は，算出部１１１で求めた第１のハッシュ値で，更新管理情報記憶部１１５に保管された，更新判定対象のソースプログラムに対応する第２のハッシュ値を更新する。
【００９２】
図１１は，本実施例１の解析部による差分解析処理フローチャートである。
【００９３】
本実施例１において，解析部１００は，解析対象として指定された各ソースプログラムに対して，図１１に示す差分解析処理を行う。
【００９４】
解析部１００の更新判定部１１０において，算出部１１１は，解析対象の，すなわち更新判定対象のソースプログラムに対して，依存関係解析処理を実行する（ステップＳ２０）。依存関係解析処理は，更新判定対象のソースプログラムから依存関係プログラムを抽出し，依存関係データ１６０を生成する処理である。依存関係解析処理の詳細については，後述する。
【００９５】
算出部１１１は，生成した依存関係データ１６０に基づいて，更新判定対象のソースプログラムに該ソースプログラムから抽出した依存関係プログラムを連結し（ステップＳ２１），連結データ１６１を生成する。算出部１１１は，連結データ１６１に対して所定のハッシュ関数を用い，第１のハッシュ値を算出する（ステップＳ２２）。
【００９６】
更新判定部１１０は，更新判定対象のソースプログラムに対する解析が，最初の解析であるかを判定する（ステップＳ２３）。更新判定対象のソースプログラムに対する解析が最初の解析であるか否かは，例えば，該当ソースプログラムについての第２のハッシュ値が更新管理情報記憶部１１５に保管されているか否かで判定可能である。最初の解析であれば，更新判定対象のソースプログラムに対応する第２のハッシュ値は存在しない。
【００９７】
最初の解析であれば（ステップＳ２３のＹＥＳ），更新管理部１１３は，第１のハッシュ値を，更新判定対象のソースプログラムに対応する第２のハッシュ値として，更新管理情報記憶部１１５に記憶する更新管理データ１１６に記録する（ステップＳ２６）。解析実行部１２０は，更新判定対象の，すなわち解析対象のソースプログラムの静的解析を実行する（ステップＳ２７）。
【００９８】
最初の解析でなければ（ステップＳ２３のＮＯ），比較判定部１１２は，更新管理情報記憶部１１５の更新管理データ１１６から，更新判定対象のソースプログラムに対応する第２のハッシュ値を取得する（ステップＳ２４）。比較判定部１１２は，第１のハッシュ値と第２のハッシュ値とを比較し，第１のハッシュ値と第２のハッシュ値とが一致するかを判定する（ステップＳ２５）。
【００９９】
第１のハッシュ値と第２のハッシュ値とが一致すれば（ステップＳ２５のＹＥＳ），更新判定対象のソースプログラムは更新されていないと判定されたことになる。このとき，解析実行部１２０は，更新判定対象の，すなわち解析対象のソースプログラムの静的解析を実行しない。
【０１００】
第１のハッシュ値と第２のハッシュ値とが一致しなければ（ステップＳ２５のＮＯ），更新管理部１１３は，第１のハッシュ値を，更新判定対象のソースプログラムに対応する次の第２のハッシュ値として，更新管理情報記憶部１１５の更新管理データ１１６に記録する（ステップＳ２６）。これにより，更新管理データ１１６に記録された，該当ソースプログラムに対応する前回解析時のハッシュ値である第２のハッシュ値が，最新の解析時のハッシュ値に更新される。解析実行部１２０は，更新判定対象の，すなわち解析対象のソースプログラムの静的解析を実行する（ステップＳ２７）。
【０１０１】
図１２は，本実施例１の更新判定部による依存関係解析処理フローチャートである。
【０１０２】
図１２に示す依存関係解析処理は，更新判定対象のソースプログラムと依存関係プログラムとに対して再帰的に依存関係プログラムを抽出する処理を実行し，更新判定対象のソースプログラムについての依存関係データ１６０を生成する処理の例である。
【０１０３】
更新判定部１１０は，依存関係を解析する対象のプログラムを，プログラム記憶部１５から取得する（ステップＳ３０）。最初は，更新判定対象のソースプログラムが，依存関係を解析する対象のプログラムとなる。再帰的に依存関係解析処理が実行された場合には，依存関係プログラムが，依存関係を解析する対象のプログラムとなる。更新判定部１１０は，ステップＳ３０の処理で取得されたプログラムに対して，構文解析を実行する（ステップＳ３１）。
【０１０４】
更新判定部１１０は，ステップＳ３０の処理で取得されたプログラムに対して意味解析を実行し，該プログラムから特定の命令文を順に１つ抽出する（ステップＳ３２）。更新判定部１１０は，抽出された特定の命令文で指定された依存関係プログラムの情報を，依存関係データ１６０に記録する（ステップＳ３３）。更新判定部１１０は，抽出された特定の命令文で指定された依存関係プログラムを，依存関係を解析する対象のプログラムとして，再帰的に依存関係解析処理を実行する（ステップＳ３４）。
【０１０５】
更新判定部１１０は，ステップＳ３０の処理で取得されたプログラムのすべての特定の命令文について，処理が終了したかを判定する（ステップＳ３５）。まだすべての特定の命令文について処理が終了していなければ（ステップＳ３５のＮＯ），更新判定部１１０は，ステップＳ３２の処理に戻って，次の特定の命令文についての処理に移る。すべての特定の命令文について処理が終了していれば（ステップＳ３５のＹＥＳ），更新判定部１１０は，処理を終了する。
【０１０６】
〔実施例２〕
上述の実施例１では，更新判定処理を行うたびに，更新判定対象のソースプログラムから依存関係プログラムを抽出する処理を行い，依存関係データ１６０を生成している。また，上述の実施例１では，更新判定対象のソースプログラムから生成された依存関係データ１６０を用いて，第１のハッシュ値を求めている。
【０１０７】
これに対して，本実施例２では，更新判定対象のソースプログラムが更新されていると判定された場合にのみ，更新判定対象のソースプログラムから依存関係プログラムを抽出する処理を行い，依存関係データ１６０を生成する。本実施例２では，第１のハッシュ値を求める際に，前回解析時に該当ソースプログラムに基づいて生成された依存関係データ１６０を用いるものとする。そのため，本実施例２では，ソースプログラムと第２のハッシュ値との対応情報とともに，ソースプログラムと該ソースプログラムから生成された依存関係データ１６０との対応情報も，更新管理情報記憶部１１５に保管しておく。
【０１０８】
図１３は，本実施例２による更新管理データの例を示す図である。
【０１０９】
図１３に示す更新管理データ１１６’は，更新管理情報記憶部１１５に記憶された，ソースプログラムと第２のハッシュ値との対応と，ソースプログラムと依存関係データ１６０との対応とを含む，ソースプログラムの更新判定に用いる情報の一例を示す。図１３に示す更新管理データ１１６’は，図１０に示す更新管理データ１１６と同様のファイル形式のデータとなっている。
【０１１０】
図１３に示すファイル名“ａ．ｃ．ｈａｓｈ”の更新管理データ１１６’は，図７に示すファイル名“ａ．ｃ”のソースファイル２００から求められたハッシュ値と，図８に示す依存関係データ１６０とが記録されたデータとなる。すなわち，図１３に示す更新管理データ１１６’は，ファイル名“ａ．ｃ”のソースファイル２００のプログラムと，そのソースプログラムについての前回解析実行時のハッシュ値である第２のハッシュ値とを対応付けたデータとなる。それと同時に，図１３に示す更新管理データ１１６’は，ファイル名“ａ．ｃ”のソースファイル２００のプログラムと，そのソースプログラムについて前回解析時に抽出された依存関係プログラムの情報が記録された依存関係データ１６０とを対応付けたデータとなる。
【０１１１】
なお，上述の図１０に示す更新管理データ１１６の場合と同様に，第２のハッシュ値と依存関係データ１６０とが保管される更新管理データ１１６’が，例えばソースプログラムごとのレコードを持つテーブル形式のデータであってもよい。また，図１３に示す例では，第２のハッシュ値と依存関係データ１６０とが１つのファイルの更新管理データ１１６’で管理されているが，第２のハッシュ値と依存関係データ１６０とがそれぞれ異なるデータで管理されてもよい。
【０１１２】
本実施例２において，更新判定部１１０の算出部１１１は，更新判定対象のソースプログラムについて前回解析時に該当ソースプログラムの解析で生成された依存関係データ１６０を用いて，更新判定対象のソースプログラムについての第１のハッシュ値を求める。より具体的には，算出部１１１は，更新管理情報記憶部１１５の更新管理データ１１６’から，更新判定対象のソースプログラムに対応する依存関係データ１６０を取得する。算出部１１１は，取得した依存関係データ１６０に基づいて，更新判定対象のソースプログラムに依存関係プログラムを連結し，連結データ１６１を生成する。算出部１１１は，連結データ１６１に対して所定のハッシュ関数を用い，第１のハッシュ値を算出する。比較判定部１１２や解析実行部１２０については，上述の実施例１と同様の動作となる。
【０１１３】
ここで，本実施例２では，更新判定対象のソースプログラムから直接に抽出した依存関係プログラムを用いずに，前回解析時に該当ソースプログラムから抽出した依存関係プログラムを用いて第１のハッシュ値を求めている。更新によってソースプログラムの依存関係プログラムが変更されている可能性があるため，本実施例２で得られる第１のハッシュ値は，必ずしも正確に更新判定対象のソースプログラムとその依存関係プログラムとから求められるハッシュ値になるとは限らない。ただし，本実施例２で求める第１のハッシュ値でも，更新判定対象のソースプログラム更新判定に用いる分には，問題はない。
【０１１４】
例えば，更新判定対象のソースプログラムに基づいた依存関係データ１６０と，前回解析時の該当ソースプログラムに基づいた依存関係データ１６０とが同じになる場合には，いずれの依存関係データ１６０を用いても，更新判定対象のソースプログラムから求められる第１のハッシュ値は同じ値となる。すなわち，前回解析時に記録された更新管理データ１１６' の依存関係データ１６０を用いても，更新判定対象のソースプログラムについての正しい第１のハッシュ値が求められることになる。そのため，更新判定対象のソースプログラムが更新されていない場合には，第２のハッシュ値と同じ第１のハッシュ値が得られ，更新判定対象のソースプログラムが更新されている場合には，第２のハッシュ値と異なる第１のハッシュ値が得られる。
【０１１５】
更新判定対象のソースプログラムに基づいた依存関係データ１６０と，前回解析時の該当ソースプログラムに基づいた依存関係データ１６０とが異なる場合には，更新判定対象のソースプログラムと依存関係プログラムとの少なくともいずれかが更新されているはずである。例えば，更新判定対象のソースプログラムが呼び出す依存関係プログラムが変更されている場合，更新判定対象のソースプログラムの記述が更新されている。また例えば，依存関係プログラムが呼び出す依存関係プログラムが変更されている場合，その呼び出しを行っている依存関係プログラムの記述が更新されている。この場合，第１のハッシュ値の算出において，前回解析時に記録された更新管理データ１１６' の依存関係データ１６０を用いると，必ず，更新管理データ１１６' の第２のハッシュ値と異なる第１のハッシュ値が得られることになる。
【０１１６】
このように，更新判定対象のソースプログラムに基づいた依存関係データ１６０の代わりに，前回解析時の該当ソースプログラムに基づいた依存関係データ１６０を用いて第１のハッシュ値を算出しても，正しいソースプログラムの更新判定が可能である。
【０１１７】
更新判定対象のソースプログラムが更新されていると判定された場合，更新管理部１１３は，次回の更新判定のために，更新判定対象のソースプログラムに基づいた依存関係データ１６０と，その依存関係データ１６０を用いて求められるハッシュ値とを，更新管理データ１１６' に記録しておく必要がある。しかし，上述したように，本実施例２の算出部１１１で求められる第１のハッシュ値は，必ずしも正確に更新判定対象のソースプログラムとその依存関係プログラムとから求められるハッシュ値になるとは限らない。
【０１１８】
そこで，更新管理部１１３は，更新判定対象のソースプログラムが更新されていると判定された場合に，上述のソースプログラムからハッシュ値を求める手順で，更新判定対象のソースプログラムについての第３のハッシュ値を求める。より具体的には，更新管理部１１３は，更新判定対象のソースプログラムから依存関係プログラムを抽出して，依存関係データ１６０を生成する。更新管理部１１３は，生成した依存関係データ１６０に基づいて，更新判定対象のソースプログラムに依存関係プログラムを連結し，連結データ１６１を生成する。更新管理部１１３は，連結データ１６１に対して所定のハッシュ関数を用い，第３のハッシュ値を算出する。
【０１１９】
更新管理部１１３は，第３のハッシュ値で，更新管理情報記憶部１１５に保管された，更新判定対象のソースプログラムに対応する第２のハッシュ値を更新する。また，更新管理部１１３は，第３のハッシュ値を算出する過程で得られた依存関係データ１６０で，更新管理情報記憶部１１５に保管された，更新判定対象のソースプログラムに対応する依存関係データ１６０を更新する。
【０１２０】
図１４は，本実施例２の解析部による差分解析処理フローチャートである。
【０１２１】
本実施例２において，解析部１００は，解析対象として指定された各ソースプログラムに対して，図１４に示す差分解析処理を行う。
【０１２２】
解析部１００の更新判定部１１０は，解析対象の，すなわち更新判定対象のソースプログラムに対する解析が，最初の解析であるかを判定する（ステップＳ４０）。更新判定対象のソースプログラムに対する解析が最初の解析であるか否かは，例えば，該当ソースプログラムについての第２のハッシュ値や依存関係データ１６０が更新管理情報記憶部１１５に保管されているか否かで判定可能である。最初の解析であれば，更新判定対象のソースプログラムに対応する第２のハッシュ値や依存関係データ１６０は存在しない。最初の解析であれば（ステップＳ４０のＹＥＳ），更新判定部１１０は，ステップＳ４６の処理に進む。
【０１２３】
最初の解析でなければ（ステップＳ４０のＮＯ），算出部１１１は，更新管理情報記憶部１１５の更新管理データ１１６' から，更新判定対象のソースプログラムに対応する依存関係データ１６０を取得する（ステップＳ４１）。算出部１１１は，更新判定対象のソースプログラムに，取得した依存関係データ１６０に示される依存関係プログラムを連結し（ステップＳ４２），連結データ１６１を生成する。算出部１１１は，連結データ１６１に対して所定のハッシュ関数を用い，第１のハッシュ値を算出する（ステップＳ４３）。
【０１２４】
比較判定部１１２は，更新管理情報記憶部１１５の更新管理データ１１６' から，更新判定対象のソースプログラムに対応する第２のハッシュ値を取得する（ステップＳ４４）。比較判定部１１２は，第１のハッシュ値と第２のハッシュ値とを比較し，第１のハッシュ値と第２のハッシュ値とが一致するかを判定する（ステップＳ４５）。
【０１２５】
第１のハッシュ値と第２のハッシュ値とが一致すれば（ステップＳ４５のＹＥＳ），更新判定対象のソースプログラムは更新されていないと判定されたことになる。このとき，解析実行部１２０は，更新判定対象の，すなわち解析対象のソースプログラムの静的解析を実行しない。
【０１２６】
第１のハッシュ値と第２のハッシュ値とが一致しなければ（ステップＳ４５のＮＯ），更新判定対象のソースプログラムは更新されていると判定されたことになる。このとき，更新判定部１１０は，次のステップＳ４６の処理に進む。
【０１２７】
更新管理部１１３は，更新判定対象のソースプログラムに対して，依存関係解析処理を実行する（ステップＳ４６）。依存関係解析処理は，例えば図１２に示す通りである。更新管理部１１３は，依存関係データ１６０に基づいて，更新判定対象のソースプログラムに該ソースプログラムから抽出した依存関係プログラムを連結し（ステップＳ４７），連結データ１６１を生成する。更新管理部１１３は，連結データ１６１に対して所定のハッシュ関数を用い，第３のハッシュ値を算出する（ステップＳ４８）。
【０１２８】
更新管理部１１３は，第３のハッシュ値を，更新判定対象のソースプログラムに対応する次の第２のハッシュ値として，更新管理情報記憶部１１５の更新管理データ１１６' に記録する（ステップＳ４９）。更新判定対象のソースプログラムに対する解析が最初の解析である場合には，更新管理データ１１６' に，該ソースプログラムの最初の解析時のハッシュ値が，第２のハッシュ値として記録される。また，更新判定対象のソースプログラムに対する解析が最初の解析でない場合には，更新管理データ１１６' に記録された，該当ソースプログラムに対応する前回解析時のハッシュ値である第２のハッシュ値が，最新の解析時のハッシュ値に更新される。
【０１２９】
更新管理部１１３は，ステップＳ４６で生成された依存関係データ１６０を，更新判定対象のソースプログラムに対応する次の依存関係データ１６０として，更新管理情報記憶部１１５の更新管理データ１１６' に記録する（ステップＳ５０）。更新判定対象のソースプログラムに対する解析が最初の解析である場合には，更新管理データ１１６' に，該ソースプログラムの最初の解析時の依存関係データ１６０が記録される。また，更新判定対象のソースプログラムに対する解析が最初の解析でない場合には，更新管理データ１１６' に記録された，該当ソースプログラムに対応する前回解析時の依存関係データ１６０が，最新の解析時の依存関係データ１６０に更新される。
【０１３０】
解析実行部１２０は，更新判定対象の，すなわち解析対象のソースプログラムの静的解析を実行する（ステップＳ５１）。
【０１３１】
実施例２では，更新されたと判定された場合にのみ，更新判定対象のソースプログラムから依存関係プログラムを抽出する処理が行われる。そのため，更新されていないソースプログラムの方が多い場合などには，更新判定対象のソースプログラムから依存関係プログラムを抽出する処理の回数が減るので，実施例１と比べて処理時間が短くなる。
【０１３２】
ただし，実施例２では，更新されたと判定された場合には，比較に用いる第１のハッシュ値の他に，次回更新判定時の第２のハッシュ値として保管するための第３のハッシュ値を求める処理が行われる。そのため，更新されているソースプログラムの方が多い場合などには，ハッシュ値を算出する回数が増えるので，実施例１と比べて処理時間が長くなる。
【０１３３】
このような更新判定処理の設計は，実施例１，実施例２に示す更新判定処理の例に限らず，任意である。例えば，実施例１に示す更新判定処理と，実施例２に示す更新判定処理とをオプションで指定できるように設計することも可能である。
【０１３４】
以上，本実施の形態について説明したが，本発明はその主旨の範囲において種々の変形が可能であることは当然である。
【０１３５】
例えば，本実施の形態では，差分解析で静的解析を行う場合においてソースプログラムの更新判定を行う例を説明したが，ソースプログラムの更新判定を行う様々なケースで，本実施の形態による更新判定の技術を利用可能である。
【０１３６】
また，本実施の形態では，ユーザ装置１０での解析時にソースプログラムの更新判定を行う例を説明したが，これに限るものではない。例えば，構成管理サーバ２０が，定期的に管理するソースプログラムの解析をまとめて行うようなケースで，本実施の形態によるソースプログラムの更新を行うなどの設計は任意である。
【符号の説明】
【０１３７】
１０  ユーザ装置
１５  プログラム記憶部
１００  解析部
１１０  更新判定部
１１１  算出部
１１２  比較判定部
１１３  更新管理部
１１５  更新管理情報記憶部
１２０  解析実行部
２０  構成管理サーバ
２５  ソース管理部
３０  ネットワーク
【図１】
2014010699.tif 000003
【図２】
2014010699.tif 000004
【図３】
2014010699.tif 000005
【図４】
2014010699.tif 000006
【図５】
2014010699.tif 000007
【図６】
2014010699.tif 000008
【図７】
2014010699.tif 000009
【図８】
2014010699.tif 000010
【図９】
2014010699.tif 000011
【図１０】
2014010699.tif 000012
【図１１】
2014010699.tif 000013
【図１２】
2014010699.tif 000014
【図１３】
2014010699.tif 000015
【図１４】
2014010699.tif 000016