(57)【特許請求の範囲】
【請求項１】
バージョン毎のソースコードから、それぞれ所定基準により同一であると判定されるコードであるコードクローンを抽出して、当該コードクローン毎に各バージョンにおける抽出結果を記憶装置に記憶するコードクローン抽出管理部と、
ソースコードのバージョンの変化に伴う、当該バージョン毎における前記コードクローン毎の抽出数の変化に基づいて、当該コードクローンの信頼性を判定するコードクローン判定部と、
を備えた情報処理装置。
【請求項２】
請求項１に記載の情報処理装置であって、
前記コードクローン抽出管理部は、対象となるバージョン毎のソースコードから、前記記憶装置に記憶されている前記コードクローンと所定基準により同一であると判定される新たなコードクローンを抽出し、
前記コードクローン判定部は、新たに抽出された前記コードクローンについて、前記記憶装置に記憶されているソースコードのバージョンの変化に伴う当該バージョン毎における抽出数の変化を調べ、当該抽出数の変化に基づいて、当該コードクローンの信頼性を判定する、
情報処理装置。
【請求項３】
請求項１又は２に記載の情報処理装置であって、
前記コードクローン判定部は、ソースコードのバージョンが新しく変化するに伴い前記コードクローンの抽出数が減少している当該コードクローンを、信頼性が低いコードとして判定する、
情報処理装置。
【請求項４】
請求項１乃至３のいずれかに記載の情報処理装置であって、
前記コードクローン判定部は、ソースコードのバージョンが新しく変化するに伴い前記コードクローンの抽出数が増加している当該コードクローンを、信頼性が高いコードとして判定する、
情報処理装置。
【請求項５】
請求項１乃至４のいずれかに記載の情報処理装置であって、
前記コードクローン判定部は、ソースコードのバージョンが新しく変化するに伴い前記コードクローンの抽出数が変化しない当該コードクローンを、信頼性が高いコードとして判定する、
情報処理装置。
【請求項６】
請求項１乃至３のいずれかに記載の情報処理装置であって、
前記コードクローン判定部は、前記コードクローンの抽出数が所定値以上である当該コードクローンを、信頼性が高いコードとして判定する、
情報処理装置。
【請求項７】
請求項１乃至６のいずれかに記載の情報処理装置であって、
前記コードクローン判定部は、前記コードクローンに対する信頼性の判定結果を、当該コードクローンのコードと共に出力する、
情報処理装置。
【請求項８】
情報処理装置に、
バージョン毎のソースコードから、それぞれ所定基準により同一であると判定されるコードであるコードクローンを抽出して、当該コードクローン毎に各バージョンにおける抽出結果を記憶装置に記憶するコードクローン抽出管理部と、
ソースコードのバージョンの変化に伴う、当該バージョン毎における前記コードクローン毎の抽出数の変化に基づいて、当該コードクローンの信頼性を判定するコードクローン判定部と、
を実現させるためのプログラム。
【請求項９】
情報処理装置が、
バージョン毎のソースコードから、それぞれ所定基準により同一であると判定されるコードであるコードクローンを抽出して、当該コードクローン毎に各バージョンにおける抽出結果を記憶装置に記憶し、
ソースコードのバージョンの変化に伴う、当該バージョン毎における前記コードクローン毎の抽出数の変化に基づいて、当該コードクローンの信頼性を判定する、
コードクローン判定方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置にかかり、特に、ソフトウェア開発や改修を支援する情報処理装置に関する。
【背景技術】
【０００２】
既存ソフトウェアは、バグ改修や改良、最適化、機能追加、機能変更を行うことで、大規模化・複雑化している。しかし、ソースコードは改修されるが、様々な理由により仕様書が未修正・未整備のままの状態となり、形骸化してしまうことがある。そのため、ソースコードを修正した意図や目的を知るためには、その該当箇所を修正した保守担当者などの有識者に確認する必要がある。
【０００３】
ところが、ソフトウェアの修正等の確認作業は、口頭で行われ、仕様書に反映されないことが多い。このため、保守担当者が変更すると、それまでに培った技術及び知識が引き継ぎされず、また、職場変更や離職などの理由で有識者が現場から離れてしまった場合、後任の保守担当者はソフトウェアの理解（「大局的な流れ」及び「詳細な処理・動作」の理解）を行うことが困難となる。
【０００４】
以上のことから、既存ソフトウェアを改修する場合、その改修による新たなバグの作りこみや類似バグの修正漏れが発生する、という問題が生じる。
【０００５】
ここで、新たなバグの作りこみや類似バグの修正漏れなど、ソフトウェアの保守を困難にしている要因の１つとして、コードクローンが挙げられる。コードクローンとは、ソースコード中のある一部分（コード片）のうち、他のコード片と同一または類似しているものを指す。例えば、コードクローンは、図１に示すように、コピーアンドペースト（Ｃ＆Ｐ）による処理の再利用や定型的な処理など、様々な理由によりソースコード中に作りこまれる。このため、あるコード片にバグが含まれていた場合には、そのコード片のコードクローン全てについて修正の是非を考慮する必要が生じる。なお、本願では、図１に示すように、同じソースコードをコピーアンドペーストした一群のコード片をクローンセットと呼び、そのパターンをクローンパターン、同一のコード片をクローンペア、と呼ぶことを示している。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００８−２６９０２０号公報
【特許文献２】特開２０１２−２２０９７９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
一方で、近年では、コードクローン検出方法についての研究が進み、CCFinderを代表とするコードクローン検出ツールが開発されている。これらのツールにより、バグ修正時にコードクローンを検出し、類似コード片の修正を行うことにより、バグ修正漏れのリスクは低減している。しかしながら、バグが混在しているコード片（バグ混在コード片）を修正したにも関わらず、その経緯・情報が後の保守担当者に引き継ぎができていないことにより、次回以降のバグ修正が過去のバグ混在コード片と同じ内容で修正してしまうという問題があった。
【０００８】
また、特許文献１，２では、新たにバグ修正を行う際、既知のバグを作りこまないようにするための仕組みが発案されている。例えば、ソースコードの差分情報あるいはコピーの履歴を保持し、修正コードが「差分と合致、かつ、その差分にバグが潜在している」あるいは「履歴と合致、かつ、その履歴にバグが潜在している」と判断した場合に、ユーザへ通知するような仕組みが発案されている。
【０００９】
しかしながら、上述した技術では、各バージョンのソースコード・ビルド環境は残っているが、各バージョン間の変更の履歴は残っていないことが多い。つまり、過去にバージョン毎の変更履歴を蓄積してこなかった既存のシステムの改修には適用することができない。また、各バージョンからソースコードの差分情報を採取することは可能であるが、ロック処理やファイルI/Oのように、同じ処理内容だが変数名が異なることが多く、差分情報だけではソースコード改修時にこれまでの改修と同内容へ改修し、既知のバグを埋め込んでしまう問題が生じる可能性がある。
【００１０】
例えば、図２では、バージョンごとに担当者が変更され、コピーアンドペーストによってコードが改修されるような例を示している。ここでは、「コードＥ」が「コードＢ」のコピーにより作成されたものであるが、後のバージョンで「コードＢ」にバグが存在することが判明した際に、それぞれ異なる担当者が、「コードＢ」をコピーすることで「コードＢ’」さらには「コードＢ”」に改修したとする。すると、「コードＥ」にはバグが残ってしまい、また、これを改修する際に既知のバグが改善しない可能性がある、という問題が生じる。
【００１１】
このため、本発明の目的は、上述した課題である、ソフトウェア開発・改修時に既知のバグが改善しない、ということを解決することにある。
【課題を解決するための手段】
【００１２】
本発明の一形態である情報処理装置は、
バージョン毎のソースコードから、それぞれ所定基準により同一であると判定されるコードであるコードクローンを抽出して、当該コードクローン毎に各バージョンにおける抽出結果を記憶装置に記憶するコードクローン抽出管理部と、
ソースコードのバージョンの変化に伴う、当該バージョン毎の前記コードクローン毎の抽出数の変化に基づいて、当該コードクローンの信頼性を判定するコードクローン判定部と、
を備えた、
という構成をとる。
【００１３】
また、本発明の一形態であるプログラムは、
情報処理装置に、
バージョン毎のソースコードから、それぞれ所定基準により同一であると判定されるコードであるコードクローンを抽出して、当該コードクローン毎に各バージョンにおける抽出結果を記憶装置に記憶するコードクローン抽出管理部と、
ソースコードのバージョンの変化に伴う、当該バージョン毎の前記コードクローン毎の抽出数の変化に基づいて、当該コードクローンの信頼性を判定するコードクローン判定部と、
を実現させる、
という構成をとる。
【００１４】
本発明の一形態であるコードクローン判定方法は、
バージョン毎のソースコードから、それぞれ所定基準により同一であると判定されるコードであるコードクローンを抽出して、当該コードクローン毎に各バージョンにおける抽出結果を記憶装置に記憶し、
ソースコードのバージョンの変化に伴う、当該バージョン毎の前記コードクローン毎の抽出数の変化に基づいて、当該コードクローンの信頼性を判定する、
という構成をとる。
【発明の効果】
【００１５】
本発明は、以上のように構成されることにより、ソフトウェア開発・改修時に既知のバグを改善させることができる。
【図面の簡単な説明】
【００１６】
【図１】コードクローンを説明するための図である。
【図２】コードクローンの問題点を説明するための図である。
【図３】コードクローンの一例を示す図である。
【図４】本発明の実施形態１における情報処理装置の構成を示すブロック図である。
【図５】図４に開示したコードクローン情報管理リポジトリに記憶されているデータの一例を示す図である。
【図６】実施形態１における情報処理装置の処理内容を説明するための図である。
【図７】実施形態１における情報処理装置の動作を示すフローチャートである。
【図８】実施形態１における情報処理装置の動作を示すフローチャートである。
【図９】実施形態１における情報処理装置の動作を示すフローチャートである。
【図１０】実施形態１における情報処理装置の動作を示すフローチャートである。
【図１１】実施形態１における情報処理装置の処理内容を説明するための図である。
【図１２】実施形態１における情報処理装置の処理内容を説明するための図である。
【図１３】本発明の付記１における情報処理装置の構成を示すブロック図である。
【発明を実施するための形態】
【００１７】
＜実施形態１＞
本発明の第１の実施形態を、図３乃至図１２を参照して説明する。図３は、コードクローンを説明するための図である。図４乃至図５は、情報処理装置の構成を説明するための図である。図６乃至図１２は、情報処理装置の処理内容や動作を説明するための図である。
【００１８】
［構成］
本発明の情報処理装置は、プログラムのソースコードからコードクローンを検出して、そのコードクローンの信頼性を判定するものである。ここで、まず、コードクローンについて、図３を参照して説明する。
【００１９】
図３に、プログラムのソースコードの一例を示す。ソースコード内（別ソースファイルや別バージョン間も含む）には、コピーアンドペーストなどの再利用などにより、同一又は類似するコード片が存在することとなる。このような同一又は類似のコード片が、予め設定された同一のパターンを有する場合には、これらをコードクローンと判断することとしている。つまり、図３で示すクローンパターンとは、ソースコード内のコード片を、コードクローンであると判断する基準と定義する。例えば、クローンパターンは、トークン単位でのコードクローン検出を行う場合には、予約語や括弧以外のユーザ固有名詞（変数名や関数名）を機能内部で定めたルールに従って変換（正規化）したコード片のことを指す（例を図３に示す）。以降の説明では、変換後のコード片をクローンパターンと呼ぶ。
【００２０】
本発明の情報処理装置は、演算装置や記憶装置を備えた一般的な情報処理装置である。そして、図４に示すように、情報処理装置１は、演算装置がプログラムを実行することで実現された、コードクローンバージョン単位抽出機能１１と、コードクローンマッピング機能１２と、警告表示機能１３と、を備えている。また、情報処理装置１は、記憶装置に形成されたコードクローン情報管理リポジトリ１０を備えている。
【００２１】
上記コードクローンバージョン単位抽出機能１１（コードクローン抽出管理部）は、各バージョンのソースコードから、同一のコードパターンを有すると判定されるコードクローンを抽出する。例えば、コードクローンバージョン単位抽出機能１１は、ソースコードから適当な長さのコード片を抽出し、コードクローンの検出を行う。
【００２２】
このとき、コードクローンバージョン単位抽出機能１１は、外部システムであるコードクローン検出機能２０（OSS等のコードクローン検出ツール）を利用したり、コードクローンの検出位置（開始／終了位置）を抽出可能な機能、検出したコードクローンのパターンを抽出可能機能、を実装する。また、コードクローンバージョン単位抽出機能１１は、外部ツールとして、２ファイル間の差分を抽出するファイル差分検出機能３０も利用したり、あるいは、かかる機能を実装する。例えば、ファイル差分検出機能３０は、Unixのdiffコマンドと同様、どこにファイル差分が存在するかを検出する。なお、コードクローンバージョン単位抽出機能１１は、本実施形態では、トークン単位でコードクローンを検出する機能を利用（あるいは実装）しているものとする。
【００２３】
また、コードクローンバージョン単位抽出機能１１は、後述するように、既存のソースコードのコードクローンに関する情報を分析して蓄積する環境構築処理時に限らず、修正あるいは新規開発のソースコードに対する信頼性の判定や通知を行う判定時にも、コードクローンの検出を行う。
【００２４】
そして、コードクローンバージョン単位抽出機能１１は、検出したコードクローンの抽出結果を表す情報を、ソースコード後のバージョン毎に、コードクローン情報管理リポジトリ１０に記憶して保持する。コードクローン情報管理リポジトリ１０は、図５に示すように、「ソースコード情報管理テーブル」、「クローンセットバージョン情報管理テーブル」、「コードクローン情報管理テーブル」を保持している。
【００２５】
「ソースコード情報管理テーブル」は、各バージョンのソースコードが格納されているディレクトリパスを保持する。「クローンセットバージョン情報管理テーブル」は、「クローンID」と「ファイル名」「開始位置」「終了位置」を、ソースコードのバージョンごとに保持する。「開始位置」は、コードクローンであると検出された最初のトークンの行番号、列番号を表している。「終了位置」は、コードクローンであると検出された最後のトークンの行番号、列番号を表している。「コードクローン情報管理テーブル」は、「クローンID」と「クローンパターン」、「トークン数」の情報を保持する。「クローンセットバージョン情報管理テーブル」と「コードクローン情報管理テーブル」が持つ「クローンID」は紐づけられる。「クローンパターン」は、コードクローン検出作業を行った際に、検出したコードクローンのパターンを保持することとなる。「トークン数」は「クローンパターン」のトークン数を表す。
【００２６】
コードクローンマッピング機能１２（コードクローン抽出部）は、検出したコードクローンとクローンセットバージョン情報管理テーブル１０内で管理しているコードクローンとを比較し、同じコードクローンか否かを判定する機能である。このため、コードクローンマッピング機能１２は、ソースコードから検出されたコードクローンがクローンセットバージョン情報管理テーブル１０に登録されている場合には、その登録されたコードクローンに対応付けて、バージョン毎に、検出されたコードクローンのファイル名や位置などの情報を追加登録する。また、コードクローンマッピング機能１２は、信頼性の判定対象となる修正あるいは新規開発のソースコードからコードクローンを検出した際にも、当該コードクローンがクローンセットバージョン情報管理テーブル１０に登録されているか否かの判定を行い、判定結果を警告表示機能に通知する。
【００２７】
警告表示機能１３（コードクローン判定部）は、信頼性の判定対象となる修正あるいは新規開発のソースコードから検出されたコードクローンの信頼性を判定して、ユーザに通知を出力する機能である。このとき、警告表示機能１３は、ソースコードのバージョンの変化に対して、クローンセットバージョン情報管理テーブル１０内における、検出されたコードクローンの抽出数がどのように変化しているか、によって、判定結果やユーザに通知する内容が変わる。例えば、バージョンが上がるにつれてコードクローンのクローンセット数が低下している場合には、信頼性の低いコードであるとして判定してユーザに通知する。一方、バージョンが上がるにつれてコードクローンのクローンセット数が増加したり、一定値であったり、さらには、変化に関係なく所定値以上の数である場合には、信頼性の高いコードであるとして判定してユーザに通知する。
【００２８】
［動作］
次に、上述した情報処理装置１の動作を、図６乃至図１２を参照して説明する。このとき、特に、図７乃至図１０のフローチャートを参照して、動作を１つずつ順を追って説明する。
【００２９】
まず、既存のソースコードからコードクローンに関する情報を分析して蓄積する環境構築処理時の動作を説明する。はじめに、ユーザは、コードクローン検出を行う既存の各ソースコードが格納されているディレクトリパスを、図５に示すように、コードクローン情報管理リポジトリ１０内のソースコード情報管理テーブルに登録する（図７のステップＳ１）。
【００３０】
続いて、コードクローンバージョン単位抽出機能１１は、ソースコード情報管理テーブル内に登録されている各バージョンの中から、コードクローン検出を行っていない一番古いバージョンを選択し、コードクローン検出対象とする（図７のステップＳ２）。
【００３１】
最も古いバージョンを検出対象とした場合（図７のステップＳ３でＹｅｓ）、そのバージョン内での全てのソースコードを対象に、コードクローン検出を行う（図７のステップＳ４）。そして、検出された全コードクローンについての情報を、ソースコードのバージョン毎に、コードクローン情報管理リポジトリ１０に登録する（図７のステップＳ５）。具体的には、クローンＩＤ、コードパターン、トークン数をコードクローン情報管理テーブルに登録し、該当するバージョンの列に、クローンＩＤ、ファイル名、開始位置、終了位置を、クローンセットバージョン情報管理テーブルに登録する。
【００３２】
その後、確認していないバージョンのソースコードが存在する場合には（図７のステップＳ６でＹｅｓ）、他のバージョンを検出対象とする。
【００３３】
続いて、コードクローンバージョン単位抽出機能１１は、最も古いバージョン以外のバージョンが検出対象である場合（図７のステップＳ３でＮｏ，Ｓ６でＹｅｓ）、未作業の全ファイルを作業対象とする（図８のステップＳ７）。そして、作業対象となる１ファイルずつ、前バージョンとの差分を求め、コードクローン情報の変化を確認する。具体的には、１ファイルを選択して、ファイル差分検出機能を利用して前バージョンの同名ファイルとの差分情報を取得する（図８のステップＳ８）。このとき、該当バージョンで新規に作成されたファイル（前バージョンで存在しないファイル）である場合には（図８のステップＳ９でＹｅｓ）、ファイル内のソースコード全てを対象にファイル内及び他ファイル間でのコードクローンの検出を行う（図８のステップＳ１０）。
【００３４】
ここで検出されたコードクローン全てについて、コードクローンマッピング機能１２は、コードクローン情報管理リポジトリ１０に既に登録されているコードクローンかどうかを確認する（図８のステップＳ１１）。既に登録されているコードクローンである場合（図８のステップＳ１２でＹｅｓ）、当該コードクローンが検出されたファイル名、開始位置、終了位置の情報を、コードクローン情報管理リポジトリ１０内のクローンセットバージョン情報管理テーブルに、作業対象として該当するバージョンの列に登録する（図８のステップＳ１３）。未登録である場合（図８のステップＳ１２でＮｏ）、クローンパターン情報も含め、コードクローン情報管理リポジトリ１０に登録する（図８のステップＳ１４）。つまり、クローンＩＤ、コードパターン、トークン数をコードクローン情報管理テーブルに登録し、該当するバージョンの列に、クローンＩＤ、ファイル名、開始位置、終了位置を、クローンセットバージョン情報管理テーブルに登録する。
【００３５】
その後は、確認していないコードクローンや、確認していないファイル、バージョンがなくなるまで、上述した処理が繰り返される（図８のステップＳ１５，Ｓ１６，図７のステップＳ６）。
【００３６】
一方、選択したファイルが前バージョンに存在する場合（図８のステップＳ９でＮｏ）、ファイル差分検出機能で差分情報を取得する（図９のステップＳ１７）。差分がない場合は（図９のステップＳ１８でＹｅｓ）、そのファイルは処理済みとして次のファイルを選択する。この時、そのファイルが持つコードクローンの情報として、クローンセットバージョン情報管理テーブルに記憶されている前バージョンから情報を抽出し、該当する作業対象バージョンの列に登録する（図９のステップＳ１９）。つまり、作業対象となっているバージョンのファイルには、前バージョンと同一のコードクローンが存在することとして、前バージョンと同一のコードクローンの情報を登録する。
【００３７】
作業対象のファイルにおいて、前バージョンとの差分が存在する場合には（図９のステップＳ１８でＮｏ）、差分箇所の前後のソースコードから（図９のステップＳ２０）、コードクローンを検出する（図９のステップＳ２１）。具体的には、まずは差分が存在する箇所の行番号をキーとして、クローンセットバージョン情報管理テーブルの前バージョンからの差分のトークン数を抽出する。そして、コードクローン検出の閾値数から差分トークン数を減算した数のトークン数分、差分箇所の前後のソースコードを切り取り、この切り取ったソースコードからコードクローン検出を行う。つまり、図６の点線で囲った箇所のように、差分箇所の上下箇所に対して、コードクローンの検出を行う。
【００３８】
続いて、検出されたコードクローンについて、上述同様に、既に登録されているコードクローンであるかを確認する（図９のステップＳ２２）。既に登録されているコードクローンである場合（図９のステップＳ２３でＹｅｓ）、当該コードクローンが検出されたファイル名、開始位置、終了位置の情報を、コードクローン情報管理リポジトリ１０内のクローンセットバージョン情報管理テーブルに、作業対象として該当するバージョンの列に登録する（図９のステップＳ２４）。
【００３９】
なお、前バージョンで差分箇所を含むコードクローンが修正によりコードクローンとして認識されなくなる場合は、作業対象である該当バージョンでは登録しないようにする。差分箇所を含まないコードクローンについては、前バージョンから変更されていないと判断し、前バージョンのコードクローン情報を作業対象バージョンへ登録する。この時、差分箇所の開始位置、終了位置情報にズレが生じるため、差分箇所以降の開始位置、終了位置情報については、差分箇所が追記・削除・修正のいずれであるかを確認する。差分箇所が追加された場合は、その分の行数・列数を開始位置、終了位置に加算し、削除された場合は減算し、修正の場合は加算あるいは減算を行い、コードクローン情報管理テーブルの作業対象バージョンへ登録する。
【００４０】
また、検出されたコードクローンが未登録である場合（図９のステップＳ２３でＮｏ）、上述同様に、クローンパターン情報も含め、コードクローン情報管理リポジトリ１０に登録する（図９のステップＳ２５）。
【００４１】
その後は、確認していないコードクローンや、確認していないファイル、バージョンがなくなるまで、上述した処理が繰り返される（図９のステップＳ２６，図８のステップＳ１６，図７のステップＳ６）。このようにして、既存のソースコードに対するコードクローン情報管理テーブルの環境構築を行う。
【００４２】
次に、修正あるいは新規開発のソースコードに対する信頼性の判定や通知を行うコードクローン判定処理について説明する。
【００４３】
ソースコード修正や新規開発後、まず、上記環境構築処理と同様に、対象となるソースコードについて、前バージョンとの差分箇所を抽出する（図１０のステップＳ３１）。差分箇所を抽出後、上記同様、その差分箇所を含む適当な長さのソースコードを対象に、コードクローンを検出する（図１０のステップＳ３２）。
【００４４】
そして、コードクローンマッピング機能１２は、図１１に示すように、検出したコードクローンが、コードクローン情報管理テーブルに既に登録済みであるかどうかを確認する（図１０のステップＳ３３）。登録済みである場合には（図１０のステップＳ３４でＹｅｓ）、警告表示機能１３は、バージョン遷移に伴うクローンセット数の増減を確認する（図１０のステップＳ３５）。このとき、クローンセット数が、最も古いバージョンから修正バージョンに至るまでの間に、一度でも減少している場合は、このコードクローンは「低品質なコードクローンの可能性あり」と認識し、「減らすべきコードクローン」として、ユーザに警告を提示する（図１０のステップＳ３６）。つまり、信頼性の低いコードクローンであると判定し、そのような通知を行うよう出力する。このとき、警告表示機能１３は、通知と共に、検出されたコードクローンやクローンパターンをユーザに出力してもよい。
【００４５】
以上のように、本発明では、ソースファイルのバージョンごとのコードクローン情報を保持し、コードクローンのクローンセット数が減少していくコードクローンを、危険なコードクローン（削除すべきコードクローン）と見なし、バグ修正時にそのコードクローンが埋め込まれた場合にユーザへ警告を発することができる。これにより、ユーザは修正箇所が「既存バグを含む修正であるかもしれない」と認識することで、知らずに既知のバグを埋め込まないようにすることが可能である。
【００４６】
なお、本発明において、クローンセットとは、コードクローン検出を行った結果、一致あるいは類似したコード片の集合のことを指し、クローンセット数とは、クローンセット内の要素数のことを指す。
【００４７】
ここで、上述した危険な（信頼性の低い）コードクローンについて、さらに説明する。あるバージョンでのコードクローンについて、クローンセット数が前バージョンよりも減少している場合、（１）バグ修正によりクローンセット数が減少する場合、（２）「機能追加・変更を行うためコードクローン箇所を修正」「機能を利用しなくなったため、コードクローン箇所をコメントアウトや削除」など、バグに関係しない修正のためにクローンセット数が減少する場合、の大きく２種類のパターンが存在する。バグ修正時では、コードクローン検出を行い、バグが潜在している箇所は同様に修正を行うことから、クローンセット数が0となる可能性が高い。また、クローンセットのそれぞれのソースコードについて同様の修正を行うため、新しいコードクローンが生成され、修正前のコードクローンに登録されていたコード片の情報が新しいコードクローンに登録される。そのため、あるコードクローンについて、クローンセット数が減少し、減少したクローンセットの類似箇所が別コードクローンのクローンセットに追加された場合（別コードクローンのクローンセットが増加した場合）、減少したコードクローンは品質のリスクがある（危険なコードクローン）ということができる。コードクローン検出ツールが存在しない時代のソース修正時には、クローンセットを全て取り除くことができなかった場合もあり、クローンセット数は減少するが、0にならない場合も存在する。そのため、本発明では、クローンセット数が減少した場合はバグ修正である可能性を考慮し、クローンセット数が減少した場合は危険なコードクローンであると判断する。
【００４８】
つまり、これまでのバージョンについて、クローンセット数が減少していく、あるいは既に一つもクローンセットが存在しないコードクローンのパターンについて、修正箇所が上記コードクローンパターンの実装を行うと判断した場合（危険な修正だと判断した場合）、ユーザに修正を促す警告を出力する。
【００４９】
また、本発明では、上述したように、ユーザに対して、信頼性の低いコードクローンを通知するだけでなく、信頼性の高い、つまり、安全である可能性が高いコードクローンも判定して通知する。つまり、上述したように、修正ソースから検出したコードクローンが既に登録済みである場合に（図１０のステップＳ３４でＹｅｓ）、警告表示機能１３は、バージョン遷移に伴うクローンセット数の増減を確認するが（図１０のステップＳ３５）、このクローンセット数の変化に応じて信頼性が高いものも判定する。
【００５０】
具体的に、バージョンが新しくなるにつれてクローンセット数が増加傾向にあるコードクローンは、安全である可能性が高い（信頼性が高い）と判定する。また、バージョンが変化してもコードクローンのクローンセット数が変化しないものも信頼性が高いと判定する。さらには、バージョンの変化に関係なく、現時点でコードクローンのクローンセット数が予め設定された閾値よりも多いものは、信頼性が高いと判定する。上述したように判定した理由は、例えば、ソースコード修正を行う際には、信頼性が高いと思われるソースコードをコピー＆ペーストし修正することがよくあるためである。
【００５１】
そして、警告表示機能１３は、「安全なコードクローンの可能性あり」と認識したコードクローンについて、そのコードクローンの情報やコードパターンと共に、ユーザに通知を提示する（図１０のステップＳ３６）。これにより、ユーザは、安心してコードクローンを利用することができる。
【００５２】
なお、上記では、コードクローンとして検出されたコードを対象として信頼性の判定を行っているが、コードクローンとして検出が漏れたコードに対しても、信頼性の判定を行ってもよい。具体的には、まず、コードクローンマッピング機能１２が、クローンセットバージョン情報管理テーブルに登録されている各クローン情報について、バージョンの経過に伴いクローンセット数が増加あるいは変化なしのクローンIDを取得する。そのクローンIDをキーとして、コードクローン情報管理テーブルからクローンパターンを取得する。取得したクローンパターンと修正ソースコード内のコード片との類似度を確認し、類似度が高い（事前に閾値を設定しておき、それ以上の値であれば高いとみなす）クローンパターンであるクローンID情報を、警告表示機能１３へ出力する（類似の判定については後述）。つまり、この例では、対象となる修正コード内に存在するコードのうち、コードクローン情報管理テーブルに登録されているコードを、コードクローンとして検出する。
【００５３】
警告表示機能１３は、入力されたクローンIDをキーとして、クローンセットバージョン情報管理テーブルから該当バージョンのクローンセット情報を採取する。採取したクローンセット情報のファイル名、開始位置、終了位置情報を取得し、類似するコードをユーザに提示することにより、ユーザはそのコードクローンにマッチするようコードを修正することができる。このようにすることで、コードクローンとして認識されないことにより、後にコードクローンを修正する際の修正漏れを防ぐことが可能となる。つまり、クローンセットとすることにより、まとめて修正可能となるため保守性も高まる。
【００５４】
ここで、上述した類似度を計測する方法の一例について、図１２を参照して説明する。修正コード片Ｔのトークン数がクローンパターンのトークン数より少ない場合、適切にコードクローン検出が行えない。そのため、修正コード片Ｔ１のトークン数がクローンパターンのトークン数より少ない場合、コードクローン検出範囲の補正を行い、再度コードクローン検出を行う。コードクローン検出を行った結果、クローンパターン側でコードクローンと認識されたコード片の内、先頭のコード片よりも前の部分のトークン数Ｅ１（先頭未確認クローンパターントークン数）を算出する。そして、修正ソース側で検出されたコードクローンの先頭より未確認クローンパターントークン数分だけ前のコード片を、検出範囲Ｄ２として再設定する。また、検出された最後のクローンペアよりも後ろのコード片についても同様の方法で、最終未確認クローンパターントークン数Ｅ２を算出し、修正ソース側でコードクローン検出範囲Ｄ２として再設定する。この時、未確認クローンパターントークン数よりも修正ソース側のトークン数が多い場合は再設定を行わない。上記作業を行い、コードクローン検出範囲を再設定後、再度類似度を計測する。 
【００５５】
＜付記＞
上記実施形態の一部又は全部は、以下の付記のようにも記載されうる。以下、本発明における情報処理装置（図１３参照）、プログラム、コードクローン判定方法の構成の概略を説明する。但し、本発明は、以下の構成に限定されない。
【００５６】
（付記１）
バージョン毎のソースコードから、それぞれ所定基準により同一であると判定されるコードであるコードクローンを抽出して、当該コードクローン毎に各バージョンにおける抽出結果を記憶装置に記憶するコードクローン抽出管理部１０１と、
ソースコードのバージョンの変化に伴う、当該バージョン毎の前記コードクローン毎の抽出数の変化に基づいて、当該コードクローンの信頼性を判定するコードクローン判定部１０２と、
を備えた情報処理装置１００。
【００５７】
（付記２）
付記１に記載の情報処理装置であって、
前記コードクローン抽出管理部は、対象となるソースコードから、前記記憶装置に記憶されている前記コードクローンと所定基準により同一であると判定される新たなコードクローンを抽出し、
前記コードクローン判定部は、新たに抽出された前記コードクローンについて、前記記憶装置に記憶されているソースコードのバージョンの変化に伴う抽出数の変化を調べ、当該抽出数の変化に基づいて、当該コードクローンの信頼性を判定する、
情報処理装置。
【００５８】
（付記３）
付記１又は２に記載の情報処理装置であって、
前記コードクローン判定部は、ソースコードのバージョンが新しく変化するに伴い前記コードクローンの抽出数が減少している当該コードクローンを、信頼性が低いコードとして判定する、
情報処理装置。
【００５９】
（付記４）
付記１乃至３のいずれかに記載の情報処理装置であって、
前記コードクローン判定部は、ソースコードのバージョンが新しく変化するに伴い前記コードクローンの抽出数が増加している当該コードクローンを、信頼性が高いコードとして判定する、
情報処理装置。
【００６０】
（付記５）
付記１乃至４のいずれかに記載の情報処理装置であって、
前記コードクローン判定部は、ソースコードのバージョンが新しく変化するに伴い前記コードクローンの抽出数が変化しない当該コードクローンを、信頼性が高いコードとして判定する、
【００６１】
（付記６）
付記１乃至５のいずれかに記載の情報処理装置であって、
前記コードクローン判定部は、前記コードクローンの抽出数が所定値以上である当該コードクローンを、信頼性が高いコードとして判定する、
情報処理装置。
【００６２】
（付記７）
付記１乃至６のいずれかに記載の情報処理装置であって、
前記コードクローン判定部は、前記コードクローンに対する信頼性の判定結果を、当該コードクローンのコードと共に出力する、
情報処理装置。
【００６３】
（付記８）
情報処理装置に、
バージョン毎のソースコードから、それぞれ所定基準により同一であると判定されるコードであるコードクローンを抽出して、当該コードクローン毎に各バージョンにおける抽出結果を記憶装置に記憶するコードクローン抽出管理部と、
ソースコードのバージョンの変化に伴う、当該バージョン毎の前記コードクローン毎の抽出数の変化に基づいて、当該コードクローンの信頼性を判定するコードクローン判定部と、
を実現させるためのプログラム。
【００６４】
（付記８．１）
付記８に記載のプログラムであって、
前記コードクローン抽出管理部は、対象となるソースコードから、前記記憶装置に記憶されている前記コードクローンと所定基準により同一であると判定される新たなコードクローンを抽出し、
前記コードクローン判定部は、新たに抽出された前記コードクローンについて、前記記憶装置に記憶されているソースコードのバージョンの変化に伴う抽出数の変化を調べ、当該抽出数の変化に基づいて、当該コードクローンの信頼性を判定する、
プログラム。
【００６５】
（付記９）
バージョン毎のソースコードから、それぞれ所定基準により同一であると判定されるコードであるコードクローンを抽出して、当該コードクローン毎に各バージョンにおける抽出結果を記憶装置に記憶し、
ソースコードのバージョンの変化に伴う、当該バージョン毎の前記コードクローン毎の抽出数の変化に基づいて、当該コードクローンの信頼性を判定する、
コードクローン判定方法。
【００６６】
（付記９．１）
付記９に記載のコードクローン判定方法であって、
対象となるソースコードから、前記記憶装置に記憶されている前記コードクローンと所定基準により同一であると判定される新たなコードクローンを抽出し、
新たに抽出された前記コードクローンについて、前記記憶装置に記憶されているソースコードのバージョンの変化に伴う抽出数の変化を調べ、当該抽出数の変化に基づいて、当該コードクローンの信頼性を判定する、
コードクローン判定方法。
【００６７】
なお、上述したプログラムは、記憶装置に記憶されていたり、コンピュータが読み取り可能な記録媒体に記録されている。例えば、記録媒体は、フレキシブルディスク、光ディスク、光磁気ディスク、及び、半導体メモリ等の可搬性を有する媒体である。
【００６８】
以上、上記実施形態等を参照して本願発明を説明したが、本願発明は、上述した実施形態に限定されるものではない。本願発明の構成や詳細には、本願発明の範囲内で当業者が理解しうる様々な変更をすることができる。
【符号の説明】
【００６９】
１  情報処理装置
１０  コードクローン情報リポジトリ
１１  コードクローンバージョン単位抽出機能
１２  コードクローンマッピング機能
１３  警告表示機能
１００  情報処理装置
１０１  コードクローン抽出管理部
１０２  コードクローン判定部
【図１】
0006543990.tif 000002
【図２】
0006543990.tif 000003
【図３】
0006543990.tif 000004
【図４】
0006543990.tif 000005
【図５】
0006543990.tif 000006
【図６】
0006543990.tif 000007
【図７】
0006543990.tif 000008
【図８】
0006543990.tif 000009
【図９】
0006543990.tif 000010
【図１０】
0006543990.tif 000011
【図１１】
0006543990.tif 000012
【図１２】
0006543990.tif 000013
【図１３】
0006543990.tif 000014