(57)【要約】【課題】検出するクローンコードの最長一致を図り、クローンコードの過検出を防ぐ。【解決手段】検出テーブル作成部１０２は、クローンコード検出対象のファイルにおける所定の単位のデータ毎の区間情報を第１の検出テーブルに登録するとともに、クローンコード検出対象のファイルとの比較対象となるファイルにおける所定の単位のデータ毎の区間情報を検出テーブルに登録する。クローン簡易結合部１０３は、検出テーブルにおける所定の単位のデータ間の区間情報が所定の条件を満たす場合、検出テーブルにおける該当する区間情報をファイル毎に結合させる。【選択図】図１
2010061301.tif 000002
【特許請求の範囲】
【請求項１】
クローンコード検出対象のファイルにおける所定の単位のデータ毎の区間情報を第１の検出テーブルに登録するとともに、クローンコード検出対象のファイルとの比較対象となるファイルにおける前記所定の単位のデータ毎の区間情報を前記第１の検出テーブルに登録する第１の検出テーブル生成手段と、
前記第１の検出テーブルにおける前記所定の単位のデータ間の区間情報が所定の条件を満たす場合、前記第１の検出テーブルにおける該当する区間情報をファイル毎に結合させる第１の結合手段と、
前記第１の検出テーブル内の区間情報を抽出してクローンコードテーブルに登録するクローンコードテーブル生成手段とを有することを特徴とするクローンコード検出装置。
【請求項２】
前記第１の結合手段は、前記第１の検出テーブルに登録されるファイル間に亘って、前記所定の単位のデータ間の区間情報が同じオフセットを有する場合、前記第１の検出テーブルにおける前記所定の単位のデータ間の区間情報を結合させることを特徴とする請求項１に記載のクローンコード検出装置。
【請求項３】
前記第１の結合手段による結合処理後の前記第１の検出テーブル内における前記所定の単位のデータ間の区間情報が重なる、又は接続される場合、該当する区間情報を結合させた区間情報を第２の検出テーブルに登録する第２の結合テーブル生成手段を更に有し、
前記第１の結合手段は、前記第２の検出テーブルを前記第１の検出テーブルに置き換え、前記第２の検出テーブルから置き換えられることにより生成された前記第１の検出テーブルにおける前記所定の単位のデータ間の区間情報が前記所定の条件を満たす場合、前記第１の検出テーブルにおける該当する区間情報を結合させることを特徴とする請求項２に記載のクローンコード検出装置。
【請求項４】
前記第１の結合テーブルの区間情報が前記第２の結合テーブルの区間情報に包含される場合、前記第１の結合テーブルにおける該当する区間情報を削除する削除手段を更に有し、
前記クローンコードテーブル生成手段は、前記削除手段により区間情報が削除された後の前記第１のテーブル内の区間情報を抽出して前記クローンコードテーブルに登録することを特徴とする請求項３に記載のクローンコード検出装置。
【請求項５】
クローンコード検出装置によるクローンコード検出方法であって、
クローンコード検出対象のファイルにおける所定の単位のデータ毎の区間情報を検出テーブルに登録するとともに、クローンコード検出対象のファイルとの比較対象となるファイルにおける前記所定の単位のデータ毎の区間情報を前記検出テーブルに登録する検出テーブル生成ステップと、
前記検出テーブルにおける前記所定の単位のデータ間の区間情報が所定の条件を満たす場合、前記検出テーブルにおける該当する区間情報をファイル毎に結合させる結合ステップと、
前記検出テーブル内の区間情報を抽出してクローンコードテーブルに登録するクローンコードテーブル生成ステップとを含むことを特徴とするクローンコード検出方法。
【請求項６】
クローンコード検出対象のファイルにおける所定の単位のデータ毎の区間情報を検出テーブルに登録するとともに、クローンコード検出対象のファイルとの比較対象となるファイルにおける前記所定の単位のデータ毎の区間情報を前記検出テーブルに登録する検出テーブル生成ステップと、
前記検出テーブルにおける前記所定の単位のデータ間の区間情報が所定の条件を満たす場合、前記検出テーブルにおける該当する区間情報をファイル毎に結合させる結合ステップと、
前記検出テーブル内の区間情報を抽出してクローンコードテーブルに登録するクローンコードテーブル生成ステップとをコンピュータに実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ファイル間のクローンコードの検出処理に適用される技術に関するものである。
【背景技術】
【０００２】
近年、コンピュータシステムの開発において、大量のソースコードを多人数で記述することが行われている。コンピュータシステム開発のプロジェクトでは、プロジェクトを評価することも行われている。このような開発の場面では、あるメンバが作成したソースコードを他のメンバがコピー（クローン）して使うことが行われる場合もある。
【０００３】
フレームワークの自動生成コードの可能性や手法によっては過検出の場合があるため、単純にクローンが多いことだけでは良し悪しを評価できないが、クローンコードは多くの場合、不具合や機能変更時の修正コストを増大させるため、クローンが多いことは望ましいことではなく、クローンを検出することはプロジェクトを評価する上で重要な指標である。
【０００４】
なお、クローンコードは次のようにして発生することが考えられる。第１に、作業者が自分自身や他者のソースコードをコピー＆ペーストを行ってクローンコードが発生する場合が挙げられる。第２に、アプリケーションフレームワーク等で同じようなコードが自動生成される場合が挙げられる。
【０００５】
【特許文献１】特開２００３−２９９７８号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
しかしながら、従来からクローンコードを検出する方法が存在するが、その検出処理の計算量が多く、クローンコードの検出に多くの時間がかかってしまい、実用的と言えるものではなかった。効率的にクローンコードを検出する技術が例えば特許文献１に開示されている。
【０００７】
特許文献１には、テキストから同形パターンを検出する同形パターン検出システムが開示されている。特許文献１に開示される同形パターン検出システムでは、字句解析、規則による変形、パラメータ変換、同形検出、同形出力により対象のテキストの同形を検出する。しかしながら、特許文献１に開示される同形パターン検出システムは、計算量がＯ（Ｎ）〜Ｏ（ＮｌｏｇＮ）と高速であるが、抽出されたクローンコードが最長一致ではないので過検出が多くなるという問題があった。
【０００８】
そこで、本発明の目的は、検出するクローンコードの最長一致を図り、クローンコードの過検出を防ぐことにある。
【課題を解決するための手段】
【０００９】
本発明のクローンコード検出装置は、クローンコード検出対象のファイルにおける所定の単位のデータ毎の区間情報を第１の検出テーブルに登録するとともに、クローンコード検出対象のファイルとの比較対象となるファイルにおける前記所定の単位のデータ毎の区間情報を前記第１の検出テーブルに登録する第１の検出テーブル生成手段と、前記第１の検出テーブルにおける前記所定の単位のデータ間の区間情報が所定の条件を満たす場合、前記第１の検出テーブルにおける該当する区間情報をファイル毎に結合させる第１の結合手段と、前記第１の検出テーブル内の区間情報を抽出してクローンコードテーブルに登録するクローンコードテーブル生成手段とを有することを特徴とする。
本発明のクローンコード検出方法は、クローンコード検出装置によるクローンコード検出方法であって、クローンコード検出対象のファイルにおける所定の単位のデータ毎の区間情報を検出テーブルに登録するとともに、クローンコード検出対象のファイルとの比較対象となるファイルにおける前記所定の単位のデータ毎の区間情報を前記検出テーブルに登録する検出テーブル生成ステップと、前記検出テーブルにおける前記所定の単位のデータ間の区間情報が所定の条件を満たす場合、前記検出テーブルにおける該当する区間情報をファイル毎に結合させる結合ステップと、前記検出テーブル内の区間情報を抽出してクローンコードテーブルに登録するクローンコードテーブル生成ステップとを含むことを特徴とする。
本発明のプログラムは、クローンコード検出対象のファイルにおける所定の単位のデータ毎の区間情報を検出テーブルに登録するとともに、クローンコード検出対象のファイルとの比較対象となるファイルにおける前記所定の単位のデータ毎の区間情報を前記検出テーブルに登録する検出テーブル生成ステップと、前記検出テーブルにおける前記所定の単位のデータ間の区間情報が所定の条件を満たす場合、前記検出テーブルにおける該当する区間情報をファイル毎に結合させる結合ステップと、前記検出テーブル内の区間情報を抽出してクローンコードテーブルに登録するクローンコードテーブル生成ステップとをコンピュータに実行させることを特徴とする。
【発明の効果】
【００１０】
本発明においては、クローンコード検出対象のファイルと当該ファイルの比較対象となるファイルとの間の区間情報をファイル毎に結合し、結合した区間情報をクローンコードテーブルに登録するように構成している。従って、本発明によれば、検出するクローンコードの最長一致を図ることが可能となり、クローンコードの過検出を防ぐことができる。
【発明を実施するための最良の形態】
【００１１】
以下、本発明を適用した好適な実施形態を、添付図面を参照しながら詳細に説明する。
【００１２】
図１は、本発明の実施形態に係るクローンコード検出装置の機能的な構成を示すブロック図である。図１に示すように、本実施形態に係るクローンコード検出装置１００は、基底テーブル作成部１０１、検出テーブル作成部１０２、クローン簡易結合部１０３、クローン結合部１０４及び包含クローン削除部１０５により構成される。
【００１３】
基底テーブル作成部１０１は、最後にクローンコードの検出を行った時点における最新ファイルのソースコードをトークン列に変換し、n-gram化されたトークン列とそれらのトークン列の区間情報を基底テーブルに登録する。
【００１４】
検出テーブル作成部１０２は、クローンコードの検出対象となるファイルのソースコードをトークン列に変換し、n-gram化されたトークン列とそれらのトークン列の区間情報とを検出テーブルに登録する。そして、検出テーブル作成部１０２は、基底テーブルに登録される区間情報を後述する方法によって検出テーブルに登録する。
【００１５】
クローン簡易結合部１０３は、検出テーブルのレコード同士の対応する区間情報を比較し、比較した区間情報が各ファイル間で同じオフセットを有するのであれば、区間情報の結合を行う。
【００１６】
クローン結合部１０４は、クローン簡易結合部１０３により生成された検出テーブルから、ファイル毎に区間情報を取得する。そして、クローン結合部１０４は、前段のトークン列の区間情報の終端と後段のトークン列の区間情報の始端とが重なる、又は、前段のトークン列の区間情報の終端と後段のトークン列の区間情報の始端とが接続される場合、それらの区間情報を結合した区間情報を新検出テーブルに登録する。
【００１７】
包含クローン削除部１０５は、検出テーブルと新検出テーブルとを比較し、検出テーブルの区間情報が新検出テーブルの区間情報に完全に包含されている場合、即ち、検出テーブル内に過検出となっている区間情報が存在する場合、検出テーブルにおける過検出の区間情報が登録されているレコードを削除する。
【００１８】
図２は、本実施形態に係るクローンコード検出装置１００のハードウェア構成を示す図である。
【００１９】
ＣＰＵ２０１は、システムバスに接続される各デバイスやコントローラを統括的に制御する。ＲＯＭ２０３又はＨＤ（ハードディスク）２０７には、ＣＰＵ２０１の制御プログラムであるＢＩＯＳ（Basic Input / Output System）やオペレーティングシステムプログラム、クローンコード検出装置１００が実行する例えば図３−１乃至図３−３に示す処理のプログラム等が記憶されている。
【００２０】
なお、図２の例では、ＨＤ２０７はクローンコード検出装置１００の内部に配置された構成としているが、他の実施形態としてＨＤ２０７に相当する構成がクローンコード検出装置１００の外部に配置された構成としてもよい。また、本実施形態に係る例えば図３−１乃至図３−３に示す処理を行うためのプログラムは、フレキシブルディスク（ＦＤ）やＣＤ−ＲＯＭ等、コンピュータ読み取り可能な記録媒体に記録され、それらの記録媒体から供給される構成としてもよいし、インターネット等の通信媒体を介して供給される構成としてもよい。
【００２１】
ＲＡＭ２０２は、ＣＰＵ２０１の主メモリ、ワークエリア等として機能する。ＣＰＵ２０１は、処理の実行に際して必要なプログラム等をＲＡＭ２０２にロードして、プログラムを実行することで各種動作を実現するものである。
【００２２】
ＨＤ２０７やＦＤ２０６は、外部メモリとして機能する。ＣＰＵ２０１は、処理の実行に際して必要なプログラム等をＲＡＭ２０２にロードして、プログラムを実行することで各種動作を実現するものである。
【００２３】
ディスクコントローラ２０５は、ＨＤ２０７やＦＤ２０６等の外部メモリへのアクセスを制御する。通信Ｉ／Ｆコントローラ２０４は、インターネットやＬＡＮと接続し、例えばＴＣＰ／ＩＰによって外部との通信を制御するものである。
【００２４】
ディスプレイコントローラ２０８は、ディスプレイ２０９における画像表示を制御する。
【００２５】
ＫＢコントローラ２１０は、ＫＢ（キーボード）２１１からの操作入力を受け付け、ＣＰＵ２０１に対して送信する。なお、図示していないが、ＫＢ２１１の他に、マウス等のポインティングデバイスもユーザの操作手段として本実施形態に係るクローンコード検出装置１００に適用可能である。
【００２６】
図１に示す基底テーブル作成部１０１、検出テーブル作成部１０２、クローン簡易結合部１０３、クローン結合部１０４及び包含クローン削除部１０５は、例えばＨＤ２０７内に記憶され、必要に応じてＲＡＭ２０２にロードされるプログラム及びそれを実行するＣＰＵ２０１によって実現される構成である。
【００２７】
図３−１乃至図３−３は、本実施形態に係るクローンコード検出装置１００の動作の流れを示すフローチャートである。以下、図３−１乃至図３−３に示すフローチャートを参照しながらクローンコード検出装置１００の動作の流れについて説明するが、その説明の前に、図４を用いてリポジトリにおけるファイルの格納状況の一例について説明する。リポジトリには、クローンコード検出装置１００によるクローンコードの検出対象となるファイルが格納されている。リポジトリは、クローンコード検出装置１００内部におけるＨＤＤ等の記録媒体の一部記録領域に構成されてもよいし、クローンコード検出装置１００と通信回線を介して接続されるＤＢサーバ等に構成されてもよい。なお、図４に示すリポジトリにおけるファイルの格納構成は飽くまでも一例であり、クローンコード検出装置１００が処理の対象は図４に示すファイルのみではない。従って、以下の説明においては、説明の容易のため、図４に示すファイル以外も適宜使用してクローンコード検出装置１００の動作を説明する。
するものとする。
【００２８】
図４は、リポジトリにおける各ファイルの各バージョンの格納状況とともにバージョンの更新状況を示す図である。図４では、時間の経過を図面の上方から下方に表している。図４において、ファイル１（Ｆ１）は、バージョン１（Ｖ１）でリポジトリに登録され、それ以降の更新はない。ファイル２（Ｆ２）は、バージョン１（Ｖ１）でリポジトリに登録され、その後、バージョン２（Ｖ２）、バージョン３（Ｖ３）と２度更新されて登録されている。即ち、ファイル２については、バージョン１〜３のファイルが夫々登録されている。ファイル３（Ｆ３）は、バージョン１でリポジトリに登録され、その後、バージョン２、バージョン３、バージョン４と３度更新されて登録されている。即ち、ファイル３については、バージョン１〜４のファイルが夫々登録されている。４０１の破線は、最後にクローンコードの検出処理が行われた時点を表しており、４０２の破線は、現在時刻を表している。即ち、図４では、最後にクローンコードの検出が行われた時点でリポジトリに登録される最新ファイルは、ファイル１ではバージョン１、ファイル２ではバージョン２、ファイル３ではバージョン２であることを表している。また、図４では、最後のクローンコードの検出が行われた時点からファイル２がバージョン２からバージョン３に１度更新され、ファイル３がバージョン２からバージョン４まで２度更新されたことが示されている。
【００２９】
次に、クローンコード検出装置１００の動作について説明する。図３−１において、基底テーブル作成部１０１は、最後にクローンコードの検出を行った時点における最新ファイルをリポジトリから読み出す（ステップＳ３０１）。即ち、基底テーブル作成部１０１は、ファイル１のバージョン１、ファイル２のバージョン２、ファイル３のバージョン２を読み出す。
【００３０】
続いて、基底テーブル作成部１０１は、リポジトリから取り出した各ファイル内に記述されるソースコードを構文解析し、voidであればVといったように、ソースコードをトークン列に変換する（ステップＳ３０２）。ここでの変換ルールはad hocを用いる。
【００３１】
図５は、ソースコードからトークン列への変換例と基底テーブルの構成例とを示す図である。図５の５０１、５０２に示すように、void（ソースコード）はV（トークン）に、method1（ソースコード）は$（トークン）に、int（ソースコード）はI（トークン）に、arg（ソースコード）は%（トークン）に、long（ソースコード）はL（トークン）に、I（ソースコード）は%（トークン）に、10L（ソースコード）は&（トークン）に変換されている。
【００３２】
続いて、基底テーブル作成部１０１は、トークン列をn-gram（n=1,2,3,・・・、図５では、n=10）化し、n-gram化されたトークン列とファイル内におけるトークン列の区間情報とを基底テーブルに登録する（ステップＳ３０３）。図５の５０３に示すように、基底テーブルにおいて、トークン列v$(I%)[L%=がファイル１の２行目の２列目（２，１）から３行目の４列目（３，４）まで（（２，１）−（３，４））、トークン列v$(I%)[L%=がファイル２の１０行目の１列目から１０行目の９列目まで（（１０，１）−（１０，９））、トークン列v$(I%)[L%=がファイル３の１行目の１列目から１行目の９列目まで（（１，１）−（１，９））存在することが区間情報として登録されている。
【００３３】
また、トークン列$(I%)[L%=&がファイル１の２行目の２列目から３行目の５列目まで（（２，２）−（３，５））、トークン列$(I%)[L%=&がファイル３の１行目の２列目から１行目の１０列目まで（（１，２）−（１，１０））存在することが区間情報として登録されている。
【００３４】
また、トークン列(I%)[L%=&;がファイル３の１行目の３列目から１行目の１１列目まで（（１，３）−（１，１１））存在することが区間情報として登録されている。また、トークン列=$(%,%,%);がファイル１の１２行目の１列目から１２行目の１２列目まで（（１２，１）−（１２，１２））存在することが区間情報として登録されている。
【００３５】
図６は、検出テーブル作成部１０２による検出テーブルの作成処理を説明するための図である。図６においては、ファイル３のバージョン３をクローンコードの検出対象とした場合に作成される検出テーブルの構成例を示している。
【００３６】
続いて、検出テーブル作成部１０２は、基底テーブルに検出対象のファイル３の旧バージョンが存在するか否かを判定する（ステップＳ３０４）。ファイル３の旧バージョンが存在する場合、検出テーブル作成部１０２は、図６の６０１に示すように、基底テーブルから検出対象のファイル３の旧バージョンの区間情報を削除する（ステップＳ３０５）。これは、バージョン違いの同一種類のファイルである場合、新バージョンのファイルは旧バージョンのファイルが部分的に更新されて共通部分が多いため、その共通部分をクローンコードとして検出するのは適切ではないからである。一方、ファイル３の旧バージョンが存在しない場合、処理はステップＳ３０５を実行せずにステップＳ３０６に移行する。
【００３７】
続いて、検出テーブル作成部１０２は、ファイル３のバージョン３をリポジトリから読み出す（ステップＳ３０６）。そして、検出テーブル作成部１０２は、ファイル３のバージョン３内に記述されるソースコードを構文解析し、トークン列に変換する（ステップＳ３０７）。
【００３８】
続いて、検出テーブル作成部１０２は、トークン列をn-gram化し、n-gram化されたトークン列と該当するトークン列のファイル内における区間情報とを検出テーブルに登録する（ステップＳ３０８）。図６の６０２に示すように、クローン列v$(I%)[L%=がファイルＦ３のバージョンｖ３の２行目の５列目から２行目の１３行目まで（（２，５）−（２，１３））、クローン列$(I%)[L%=&がファイルＦ３のバージョンｖ３の２行目の６行目から２行目の１４行目まで（（２，６）−（２，１４））、クローン列(I%)[L%=&;がファイルＦ３のバージョンｖ３の２行目の７列目から２行目の１５列目まで（（２，７）−（２，１５））存在することが区間情報として登録されている。
【００３９】
続いて、検出テーブル作成部１０２は、検出テーブルに区間情報が登録されているトークン列と同じトークン列に区間情報が基底テーブルにおいて登録されている場合、基底テーブルにおける該当するトークン列の区間情報を検出テーブルに登録する（ステップＳ３０９）。
【００４０】
図６の６０３に示すように、検出テーブルにおいて、３つのトークン列v$(I%)[L%=、$(I%)[L%=&、(I%)[L%=&;の区間情報が登録されているが、基底テーブルでは、そのうちの２つのトークン列v$(I%)[L%=、$(I%)[L%=&の区間情報が登録された状態となっている。従って、検出テーブル作成部１０２は、基底テーブルにおける２つのトークン列v$(I%)[L%=、$(I%)[L%=&の区間情報を検出テーブルに登録する。
【００４１】
続いて、図３−２において、検出テーブル作成部１０２は、ファイル間において区間情報が１つしか登録されていないトークン列のレコードが存在するか否かを判定する（ステップＳ３１０）。ファイル間において区間情報が１つしか登録されていない場合、検出テーブル作成部１０２は、該当するレコードを削除する（ステップＳ３１１）。これは、ファイル間において区間情報が１つしか登録されていないトークン列は、その時点でクローンコードではないことが明らかなためである。図６の例では、トークン列(I%)[L%=&;のレコードにはファイル３の区間情報しか登録されない。従って、トークン列(I%)[L%=&;のレコードが削除されることになる。以上により、図６の６０３に示す検出テーブルが作成される。一方、ファイル間において区間情報が１つしか登録されていないトークン列のレコードが存在しない場合、処理はステップＳ３１１を実行せずにステップＳ３１２に移行する。
【００４２】
続いて、クローン簡易結合部１０３は、検出テーブルの各レコードを区間情報の数毎に分類する（ステップＳ３１２）。図７の例においては、４つの区間情報を登録しているトークン列V$(I%)[L%=のレコードとトークン列(I%)[L%=&;のレコードとの分類と、３つの区間情報を登録しているトークン列$(I%)[L%=&のレコードとトークン列I%)[L%=&;%のレコードとの分類になる。
【００４３】
続いて、クローン簡易結合部１０３は、クローン簡易結合処理を行う（ステップＳ３１３）。即ち、クローン簡易結合部１０３は、分類毎に、レコード同士の対応する区間情報を比較し、比較した区間情報が各ファイル間で同じオフセットを有するのであれば、区間情報の結合を行う。
【００４４】
図７は、クローン簡易結合部１０３によるクローン簡易結合の処理を説明するための図である。ここでは、図７の７０１に示すように、検出テーブルにおいて４つのトークン列について区間情報が登録されている場合を例示している。即ち、検出テーブルにおいて、４つのファイル４〜７にトークン列V$(I%)[L%=の区間情報が登録され、４つのファイル４〜７にトークン列(I%)[L%=&;の区間情報が登録されている。また、３つのファイル４〜６にトークン列$(I%)[L%=&の区間情報が登録され、３つのファイル４〜６にトークン列I%)[L%=&;%の区間情報が登録されている。
【００４５】
図７の例では、トークン列V$(I%)[L%=の区間情報として、ファイル４、ファイル５、ファイル６、ファイル７について夫々、（２，１）−（３，３）、（３，２）−（４，４）、（４，５）−（５，７）、（６，２）−（７，４）が登録され、トークン列(I%)[L%=&;の区間情報として、（２，２）−（３，４）、（３，３）−（４，５）、（４，６）−（５，８）、（６，３）−（７，５）が登録されている。比較する区間情報は全て同じオフセット（横軸方向の１座標分）を有する。従って、この場合には区間情報の結合が行われる。即ち、検出テーブル作成部１０２は、比較したトークン列のうちの前段のトークン列の始端から後段のトークン列の終端までを結合した区間情報を生成する。このとき、クローン簡易結合部１０３は、分類毎に分けられたレコードのうちの１つのレコードのトークン列を結合後のトークン列に更新するとともに、当該レコードの各区間情報を結合後の区間情報に更新する。そして、クローン簡易結合部１０３は、当該分類に属する他のレコードを全て削除する。このようにクローン簡易結合処理の後は、図７の７０２に示す検出テーブルが生成される。
【００４６】
ファイル毎に各区間情報を結合させた場合、結合後の区間情報に該当するトークン列は複数のファイル間に亘って同一のトークン列であると看做せる。従って、上述したクローン簡易結合処理は、レコード間において、複数のファイルに亘って或るトークン列の区間情報が同じ数だけ登録され、且つ同一分類のレコード間において、夫々のトークン列の区間情報が複数のファイルに亘って同じオフセットで登録されている場合に行われる。
【００４７】
続いて、クローン結合部１０４は、クローン結合処理を行う（ステップＳ３１４）。即ち、クローン結合部１０４は、クローン簡易結合部１０３により生成された検出テーブルから、ファイル毎に区間情報を取得する。そして、クローン結合部１０４は、前段のトークン列の区間情報の終端と後段のトークン列の区間情報の始端とが重なる、又は、前段のトークン列の区間情報の終端と後段のトークン列の区間情報の始端とが接続される場合、それらの区間情報を結合した区間情報を新検出テーブルに登録する。これにより、n-gram化されたトークン列を結合させた一連のトークン列に対応する区間情報が登録された新検出テーブルが作成される。
【００４８】
図８は、クローン結合部１０４によるクローン結合処理を説明するための図である。図８の８０１は、検出テーブルであり、図８の８０２は、検出テーブルに対してクローン結合処理を行うことにより生成される新検出テーブルである。検出テーブルは、トークン列$();(L%=N;のファイル９の区間情報が（１０，３）−（１１，５）であり、トークン列$();[L%=$(のファイル９の区間情報が（９，５）−（１０，７）である。従って、前段のトークン列の区間情報（（９，５）−（１０，７））の終端と後段のトークン列の区間情報（（１０，３）−（１１，５））の始端とが重なる。よって、それらの区間情報を結合した区間情報（９，５）−（１１，５）が算出される。
【００４９】
また、トークン列$(%,%,%,%)のファイル９の区間情報が（１１，５）−（１２，７）であるため、トークン列$();(L%=N;のファイル９の区間情報（（１０，３）−（１１，５））の終端と接続する。従って、それらの区間情報を結合した区間情報（１０，３）−（１２，７）が算出される。他のファイル１０〜１２についても同様に区間情報の結合が行われる。なお、ファイル１３については、トークン列$();[L%=N;にのみ区間情報が登録されているため、区間情報の結合は行われない。
【００５０】
続いて、クローン結合部１０４は、クローン結合処理により結合された区間情報が存在したか否かを判定する（ステップＳ３１５）。クローン結合処理により結合された区間情報が存在する場合、クローン結合部１０４は、新検出テーブルにおいて、結合後のトークン列に結合後の区間情報を対応付けて登録する（ステップＳ３１６）。一方、クローン結合処理により結合された区間情報が存在しない場合、処理はステップＳ３１６を実行せずに図３−３のステップＳ３１７に移行する。
【００５１】
続いて、クローン結合部１０４は、新検出テーブルにおいてファイル間で１つの区間情報の登録しかないレコードが存在するか否かを判定する（ステップＳ３１７）。新検出テーブルにおいてファイル間で１つの区間情報の登録しかないレコードが存在する場合、クローン結合部１０４は、該当するレコードを削除する（ステップＳ３１８）。これは、ファイル間で１つの区間情報しか登録されていないトークン列はクローンではないためである。図８の例では、トークン列$();[L%=$();[L%=$(のレコードが削除されることになる。一方、新検出テーブルにおいてファイル間で１つの区間情報の登録しかないレコードが存在しない場合、処理はステップＳ３１８を実行せずにステップＳ３１９に移行する。上述したステップＳ３１４〜Ｓ３１８の処理によって、図８の８０１に示す検出テーブルから図８の８０２に示す新検出テーブルが生成される。
【００５２】
図９及び図１０は、包含クローン削除部１０５の動作を説明するための図である。包含クローン削除部１０５は、検出テーブルに登録されるファイルをグループに分離するとともに、新検出テーブルに登録されるファイルをグループに分離する（ステップＳ３１９）。このグループ分けは、同一のトークン列で区間情報が登録されているファイルを同じグループにする。このようにグループ分けするのは、後述するクローンの過検出処理をファイル毎に行うより、より高くクローンの可能性を有するグループ毎に過検出処理を行った方が処理量を軽減させることができるためである。図９の９０１は、検出テーブルのグループ分けの状況を示し、図９の９０２は、新検出テーブルのグループ分けの状況を示している。検出テーブル及び新検出テーブルはともに、ファイル９とファイル１０のグループＡ、ファイル１１とファイル１２のグループＢに分けられる。
【００５３】
続いて、包含クローン削除部１０５は、検出テーブルと新検出テーブルとの間でグループ毎に区間情報を比較し、結合テーブルの区間情報が新結合テーブルの区間情報に完全に包含されているか否かを判定する（ステップＳ３２０）。即ち、ステップＳ３２０では、検出テーブル内に過検出となっている区間情報が存在するか否かを判定している。例えば、新検出テーブル内にトークン列ABABAが登録され、検出テーブル内にトークン列BABがトークン列ABABAの区間情報に包含される区間情報で登録されているような場合、最長のトークン列ABABAだけを検出すればよく、そのトークン列に含まれるトークン列BABは検出する必要はない。このような場合、トークン列BABを検出することは過検出であり、ステップＳ３２０ではこの過検出の判定を行っている。
【００５４】
結合テーブルの区間情報が新結合テーブルの区間情報に完全に包含されている場合、包含クローン削除部１０５は、結合テーブルの該当するレコードを削除する（ステップＳ３２１）。即ち、包含クローン削除部１０５は、結合テーブルにおける過検出の区間情報が登録されているレコードを削除する。
【００５５】
図１０の１００１に示すように、結合テーブルのトークン列$(%,%,%,%)のファイル９の区間情報が（１１，５）−（１２，７）、同じく結合テーブルのトークン列$(%,%,%,%)のファイル１０の区間情報が（１２，５）−（１３，７）である。また、図１０の１００２に示すように、新結合テーブルのトークン列$();[L%=N;$(%,%,%,%)のファイル９の区間情報が（１０，３）−（１２，７）、同じく新結合テーブルのトークン列$();[L%=N;$(%,%,%,%)のファイル１０の区間情報が（１１，３）−（１３，７）である。このように、結合テーブルのトークン$(%,%,%,%)の区間情報は、新結合テーブルのトークン$();[L%=N;$(%,%,%,%)の区間情報に完全に包含されているため、結合テーブルのトークン$(%,%,%,%)のレコードは削除される。一方、新結合テーブルの区間情報に結合テーブルの区間情報が完全に包含されていない場合、処理はステップＳ３２１を実行せずにステップＳ３２２に移行する。
【００５６】
続いて、包含クローン削除部１０５は、検出テーブルの全レコードを抽出し、クローンテーブルを生成する（ステップＳ３２２）。従って、図１０の１００１に示すように、クローンテーブルは、トークン列$();[L%=N;のレコード、及び、トークン列$();[L%=$(のレコードで構成されることになる。
【００５７】
続いて、包含クローン削除部１０５は、新検出テーブルが生成されたか否かを判定する（ステップＳ３２３）。図１０の例では、新検出テーブルが生成されたため、処理は図３−２のステップＳ３２４に移行する。クローン簡易結合部１０３は、新検出テーブルを検出テーブルに置き換える（ステップＳ３２４）。一方、新検出テーブルが生成されなかった場合、処理は終了する。
【００５８】
包含クローン削除部１０５は、包含クローン削除部１０５で新検出テーブルから置き替えられた検出テーブルに対してステップＳ３１３のクローン簡易結合処理を実行する。即ち、図１１の１１０１に示す新検出テーブルから置き替えられた検出テーブルは、ファイル９、ファイル１０について、トークン列$();[L%=$();[L%=N;の区間情報として（９，５）−（１１，５）、（１０，５）−（１２，５）が登録され、トークン列$();[L%=N;$(%,%,%,%)の区間情報として（１０，３）−（１２，７）、（１１，３）−（１３，７）が登録されている。従って、比較する区間情報は、全て同じオフセット（縦軸方向の１座標分、横軸方向の２座標分）を有することになり、区間情報の結合が行われる。図１１の１１０２に示すように、区間情報の結合が行われた後の検出テーブルは、トークン列$();[L%=$();[L%=N;$(%,%,%,%)のレコードには、ファイル９について（９、５）−（１２，７）の区間情報が登録され、ファイル１０について（１０，５）−（１３，７）の区間情報が登録される。
【００５９】
続いて、クローン結合部１０４は、図１１の１１０２に示す検出テーブルに対してステップＳ３１４のクローン結合処理を実行するが、図１１の１１０２に示す検出テーブルでは、前段のトークン列の区間情報と後段のトークン列の区間情報の始端とが重なっておらず、また、前段のトークン列の区間情報の終端と後段のトークン列の区間情報の始端とが接続されていない。従って、今回のクローン結合処理では、区間情報の結合は行われず、新検出テーブルへのレコードの登録は行われない。このように新検出テーブルが生成されなかった場合、処理はステップＳ３１６、Ｓ３１８及びＳ３２１をスキップし、ステップＳ３２２に移行する。
【００６０】
ステップＳ３２２では、包含クローン削除部１０５は、検出テーブルの全レコードを抽出し、クローンテーブルに追加する。即ち、図１１の１１０２に示す検出テーブルの全レコードが抽出され、図１０の１００１に示すクローンテーブルに追加される。その結果、図１２に示すクローンテーブルが生成される。図１２に示すクローンテーブルには、最終的なクローンコードの検出結果が登録される。即ち、トークン列$();[L%=N;、$();[L%=$(、$();[L%=$();[L%=N;$(%,%,%,%)のクローンコードがファイル９、１０の間で存在し、トークン列$();[L%=N;$();[L%=$(のクローンコードがファイル１１、１２の間で存在する。クローンテーブルに登録される区間情報はクローン簡易結合部１０３及びクローン結合部１０４による区間情報の結合処理によって最長一致の区間情報となっている。
【００６１】
続いて、包含クローン削除部１０５は、新検出テーブルが生成されたか否かを判定する（ステップＳ３２３）。今回、新検出テーブルは生成されなかったため、処理は終了する。
【００６２】
上述した実施形態においては、クローンコード検出対象のファイルと当該ファイルの比較対象となるファイル（本実施形態では、最後にクローンコード検出が行われた時点のファイル）との間の区間情報をファイル毎に結合し、結合した区間情報をクローンテーブルに登録するように構成している。従って、検出するクローンコードの最長一致を図ることが可能となり、クローンコードの過検出を防ぐことができる。
【００６３】
なお、図５に示した例では、n=10でn-gram化を行っているが、実際の処理においては計算の効率化の観点からn=56前後でn-gram化を行うことが好ましい。
【図面の簡単な説明】
【００６４】
【図１】本発明の実施形態に係るクローンコード検出装置の機能的な構成を示すブロック図である。
【図２】本発明の実施形態に係るクローンコード検出装置のハードウェア構成を示す図である。
【図３−１】本発明の実施形態に係るクローンコード検出装置の動作の流れを示すフローチャートである。
【図３−２】本発明の実施形態に係るクローンコード検出装置の動作の流れを示すフローチャートである。
【図３−３】本発明の実施形態に係るクローンコード検出装置の動作の流れを示すフローチャートである。
【図４】リポジトリにおける各ファイルの各バージョンの格納状況とともにバージョンの更新状況を示す図である。
【図５】ソースコードからトークン列への変換例と基底テーブルの構成例とを示す図である。
【図６】検出テーブル作成部による検出テーブルの作成処理を説明するための図である。
【図７】クローン簡易結合処理を説明するための図である。
【図８】クローン結合処理を説明するための図である。
【図９】包含クローン削除部の動作を説明するための図である。
【図１０】包含クローン削除部の動作を説明するための図である。
【図１１】クローン簡易結合処理を説明するための図である。
【図１２】クローンテーブルの構成例を示す図である。
【符号の説明】
【００６５】
１００  クローン検出装置
１０１  検出テーブル作成部
１０２  クローン簡易結合部
１０３  クローン結合部
１０４  包含クローン削除部
【図１】
2010061301.tif 000003
【図２】
2010061301.tif 000004
【図３−１】
2010061301.tif 000005
【図３−２】
2010061301.tif 000006
【図３−３】
2010061301.tif 000007
【図４】
2010061301.tif 000008
【図５】
2010061301.tif 000009
【図６】
2010061301.tif 000010
【図７】
2010061301.tif 000011
【図８】
2010061301.tif 000012
【図９】
2010061301.tif 000013
【図１０】
2010061301.tif 000014
【図１１】
2010061301.tif 000015
【図１２】
2010061301.tif 000016