(57)【特許請求の範囲】
【請求項１】
ソースコード分析手段により、複数のソースプログラムの間の類似性を検出し評価するソフトウェアの類似性評価方法であって、
前記ソースコード分析手段は、前記複数のソースプログラムが格納される記憶装置部と、表示部を含む入出力装置とを備えており、
前記類似性評価方法は、
分析の条件として、前記複数のソースプログラムの間の類似性の解析条件、及び、該類似性以外の解析条件を取得する解析条件取得工程と、
前記類似性の解析条件に基づき、前記複数のソースプログラムから、前記類似性に関わる情報を取得する類似性検出工程と、
前記類似性以外の解析条件に基づき、前記複数のソースプログラムから、前記類似性以外の解析情報を取得する静的解析情報取得工程と、
前記各ソースプログラムにおける前記類似性に関わる情報から得られた類似性を有するコード領域と前記類似性以外の解析情報とを対応づける領域照合工程と、
前記類似性を有するコード領域における、前記類似性以外の解析情報を評価する評価工程と、
前記評価結果に基づき、前記類似性を有するコード領域に関わる情報と前記類似性以外の解析情報とを関連付けて、前記表示部へ表示する表示工程とを有する
ことを特徴とするソフトウェアの類似性評価方法。
【請求項２】
請求項１において、
前記類似性の解析条件が、前記類似性の検出法と、類似度合とである
ことを特徴とするソフトウェアの類似性評価方法。
【請求項３】
請求項１において、
前記類似性検出工程において、複数の前記解析条件で前記類似性の検出を実施し、該解析条件の相違を反映して内容が相違する第一の類似性情報と第二の類似性情報とを生成し、
前記領域照合工程において、前記類似性以外の解析情報との対応づけを前記第一の類似性情報と前記第二の類似性情報の双方に対して実施する
ことを特徴とするソフトウェアの類似性評価方法。
【請求項４】
請求項１において、
前記類似性以外の解析条件が、前記ソースプログラム内の関数の開始位置である
ことを特徴とするソフトウェアの類似性評価方法。
【請求項５】
請求項１において、
前記類似性以外の解析条件が、前記ソースプログラムの複雑度である
ことを特徴とするソフトウェアの類似性評価方法。
【請求項６】
請求項４において、
前記評価結果の表示工程における前記表示部への表示形態が、前記関数のインターフェースが同一か否か、及びソースコードの中身が一致するか否かで分類されたものである
ことを特徴とするソフトウェアの類似性評価方法。
【請求項７】
請求項５において、
前記評価結果の表示工程における前記表示部への表示形態が、
前記複雑度の大小と、前記類似性を有するペアの所在の分散の大小で分類されたものである
ことを特徴とするソフトウェアの類似性評価方法。
【請求項８】
請求項１において、
前記類似性の検出工程と前記静的解析情報の取得工程とが直列に処理され、これらの処理結果に基づき前記領域照合工程が処理される
ことを特徴とするソフトウェアの類似性評価方法。
【請求項９】
請求項１において、
前記類似性の検出工程と前記静的解析情報の取得工程とが並列に処理され、これらの処理結果を統合して前記領域照合工程が処理される
ことを特徴とするソフトウェアの類似性評価方法。
【請求項１０】
ソースコード分析手段により、複数のソースプログラムの間のコードクローンの類似性を検出し評価するソフトウェアの類似性評価方法であって、
前記ソースコード分析手段は、前記複数のソースプログラムが格納される記憶装置部と、表示部を含む入出力装置とを備えており、
前記類似性評価方法は、
分析の条件として、前記複数のソースプログラムの間の前記コードクローンの類似性の解析条件、及び、前記ソースプログラムの間の該類似性以外の解析条件を取得する解析条件取得工程と、
前記類似性の解析条件に基づき、前記複数のソースプログラムから、前記コードクローンの類似性に関わる情報を取得する類似性検出工程と、
前記類似性以外の解析条件に基づき、前記複数のソースプログラムから、前記コードクローンの類似性以外の解析情報を取得する静的解析情報取得工程と、
前記各ソースプログラムにおける前記コードクローンの類似性を有するコード領域と前記類似性以外の解析情報とを対応づける領域照合工程と、
前記コードクローンの類似性を有するコード領域における、前記類似性以外の解析情報を評価する評価工程と、
前記評価結果に基づき、前記コードクローンの類似性を有するコード領域に関わる情報と前記類似性以外の解析情報とを関連付けて、前記表示部へ表示する表示工程とを有する
ことを特徴とするソフトウェアの類似性評価方法。
【請求項１１】
請求項１０において、
前記類似性に関わる情報が、前記コードクローンの検出方法と、該コードクローンの類似度合に関する情報である
ことを特徴とするソフトウェアの類似性評価方法。
【請求項１２】
請求項１０において、
前記類似性以外の解析条件が、前記ソースプログラム内の関数の開始位置であり、
前記評価結果の表示工程における前記表示部への前記類似性情報の表示形態が、前記関数の位置情報の範囲内で前記コードクローン検出を行った結果を対応付けたものである
ことを特徴とするソフトウェアの類似性評価方法。
【請求項１３】
請求項１０において、
前記評価結果の表示工程において、前記ソースプログラムの類似度と、前記類似性以外の解析情報をマージした前記コードクローン情報とを生成し、可視化して前記表示部へ表示する
ことを特徴とするソフトウェアの類似性評価方法。
【請求項１４】
請求項１３において、
前記類似性以外の解析条件が、前記ソースプログラムの複雑度であり、
前記評価結果の表示工程における前記表示部への表示形態が、
前記複雑度の大小と、前記類似性を有する前記コードクローンの広がりの大小とに基づく、処理の優先度で分類されたものである
ことを特徴とするソフトウェアの類似性評価方法。
【請求項１５】
ソースコード分析手段により、複数のソースプログラムの間の類似性を検出し評価するソフトウェアの類似性評価方法であって、
前記ソースコード分析手段は、前記複数のソースプログラムが格納される記憶装置部と、入力装置、及び出力装置とを備えており、
前記類似性評価方法は、
分析の条件として前記入力装置から入力される、前記複数のソースプログラムの間の類似性に関する少なくとも１つの解析条件を第一の解析条件、及び、前記複数のソースプログラムに関する前記類似性以外の少なくとも１つの解析条件を第二の解析条件、として取得する解析条件取得工程と、
前記第一の解析条件に基づき、前記複数のソースプログラムから、前記類似性に関わる情報を取得する類似性検出工程と、
前記第二の解析条件に基づき、前記複数のソースプログラムに関して、前記第二の解析条件を満たす解析情報を取得する静的解析情報取得工程と、
前記各ソースプログラムにおける前記類似性を有するコード領域と前記第二の解析条件を満たす解析情報とを対応づける領域照合工程と、
前記類似性を有するコード領域における、前記第二の解析条件を満たす解析情報を評価する評価工程と、
前記評価結果に基づき、前記類似性を有するコード領域に関わる情報と前記第二の解析条件を満たす解析情報とを関連付けて、前記出力装置に出力する工程とを有する
ことを特徴とするソフトウェアの類似性評価方法。
【請求項１６】
請求項１５において、
前記第一の解析条件が、前記ソースプログラム間の前記類似性の検出法と、類似度合である
ことを特徴とするソフトウェアの類似性評価方法。
【請求項１７】
請求項１６において、
前記類似性検出工程において、複数の前記解析条件で前記類似性の検出を実施し、該解析条件の相違を反映して内容が相違する第一の類似性情報と第二の類似性情報とを生成し、
前記領域照合工程において、前記第二の解析条件を満たす解析情報との対応づけを前記第一の類似性情報と前記第二の類似性情報の双方に対して実施する
ことを特徴とするソフトウェアの類似性評価方法。
【請求項１８】
請求項１５において、
前記第二の解析条件が、前記ソースプログラムのソースコードの記述に関する解析条件と、該ソースコードの記述内容以外のソースコードの属性情報とを含む
ことを特徴とするソフトウェアの類似性評価方法。
【請求項１９】
請求項１８において、
前記第二の解析条件が、ハードウェアへの依存性に関する解析条件を含む
ことを特徴とするソフトウェアの類似性評価方法。
【請求項２０】
請求項１８において、
前記第二の解析条件が、ＯＳへの依存性に関する解析条件を含む
ことを特徴とするソフトウェアの類似性評価方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェアの類似性評価方法に係り、特に、複数のソースプログラムの間の類似性情報を評価基準に利用するソフトウェアの評価方法に関する。
【背景技術】
【０００２】
複数のファイルで構成された２つのテキストすなわちソースコードあるいはソースプログラム間の類似を計測する類似度計測の手法が、特許文献１、特許文献２に開示されている。また、非特許文献１にも、同様なツールが開示されている。
【０００３】
重複したコード、すなわち、ソースコード中の「全く同一のコード片」あるいは、「類似したコード片」のことを「コードクローン」と呼ぶことがある（非特許文献２、非特許文献３）。
【０００４】
非特許文献２では、コードクローンをタイプ１（Exactクローン）、タイプ２（Parameterizedクローン）、タイプ３（Gappedクローン）の３つのタイプに分類している。タイプ１は、完全に一致したコード片であり、ただし空白、改行、コメントなどの違いは考慮しない。タイプ２は、変数名、クラス名などのユーザ定義名の違いを除き一致しているコード片のことである。タイプ３は、構文的に一致しない不一致コード（ギャップ（Gap））を部分的に含むコード片のことである。タイプ３はコピー・アンド・ペーストによって既存のコード片を再利用する場合、挿入や削除、変更でコード片の修正が加えられることにより生じる。
【０００５】
類似のソースコードのペア（コードクローン）は、主にソースコードを再利用する際に生じるが、元のソースコードがそのまま使用される（コピー・アンド・ペーストされる）結果、完全に一致した（重複した）コード片のペアが生じる場合に加え、変数名・関数名の変更や構造の変更などの改変が行われた結果、相互に微小な差分を含む類似したコード片のペア（完全なる一致（重複）ではないが相互に類似性を有するコード片のペア）が数多く発生することもある。このような構造の微小な変更も含む類似コードのペアの検出にも対応させるために、文字列の比較（行単位の比較）だけでなく、コードクローン検出技術には多様なアルゴリズムが提案されている。
【０００６】
非特許文献３では、これまでに提案されているコードクローン検出技術を５つ（（１）行単位の検出、（２）字句単位の検出、（３）抽象構文木を用いた検出、（４）プログラム依存グラフを用いた検出、（５）メトリクスやフィンガープリントなど、その他技術を用いた検出）に分類している。
【０００７】
いずれのアルゴリズムにおいても、どの程度の相違までを互いに「類似」として認定するか、という閾値が調整可能である場合が多い。この調整は、出力され分析者に提示される情報量の多寡に影響する。
【０００８】
また、ソフトウェアシステム間の相違の度合いを調べることによって、システムの保守の様子や進化の度合いを知ることができる。非特許文献４には、重複したコードの有無が、リファクタリング（ソースコードの内部構造の改善）等の判断基準として重要であることが記載されている。非特許文献５には、ソフトウェアシステム間の違いがどれくらいあるか、客観的に分析する手法が開示されている。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特開２００３-２１６４２５号公報
【特許文献２】特開２００８-４６６９５号公報
【非特許文献】
【００１０】
【非特許文献１】CCFinderホームページ＜URL:http://www．ccfinder．net/ccfinderx-j．html＞
【非特許文献２】Stefan Bellon, Rainer Koschke, Giuliano Antoniol, Jens Krinke, and Ettore Melro, “Comparision and Evaluation of Clone Detection Tools”, IEEE TRANSACTIONS ON SOFTWARE ENGINERING,VOL．33, NO．9, SEPTEMBER 2007, 577-591
【非特許文献３】肥後  芳樹、楠本  信二、井上  克郎、「コードクローン検出とその関連技術」、電子情報通信学会論文誌、D Vol． J91-D、No．6、2008年、pp．1465-1481
【非特許文献４】マーチン・ファウラー（児玉公信  他訳）、「リファクタリング  プログラミングの体質改善テクニック」、ピアソン・エデュケーション、2000年、pp．76
【非特許文献５】吉村健太郎，ダルマリンガムガネサン，ディルクムーティック: プロダクトライン導入に向けたレガシーソフトウェアの共通性・可変性分析法，情報処理学会論文誌，Vol．48, No．8, pp．2482-2491 (Aug． 2007)
【発明の概要】
【発明が解決しようとする課題】
【００１１】
重複したコード（コードクローンと呼称する場合もあるがそれに限定されない）の検出と解析は、ソフトウェア開発・保守の信頼性、使用性、あるいは保守性といった品質特性の向上に対して有用な情報を与える分析方法として認知されてきており、利用事例が増えている。
【００１２】
近年、ハードウェア価格低下とハードウェアの機能の向上にともない、ソフトウェアシステムは年々大規模化、複雑化している。ソフトウェアシステムの大規模化により、ソフトウェアの構築や保守にかかるコストが増大し、多くの労力が必要となる。
【００１３】
システムが小規模の場合、そのシステムの個々の構成要素を人間が調べ値を出すことも可能だが、構造が複雑で大規模なシステムでは、何らかの機械的な処理により、自動的に求めることが望ましい。たとえば、不具合の原因を持つコード片に対しては、他の箇所に存在する同等のコード片も改修することが必要であるが、同等のコード片（クローン）を手作業で探すことは、ソフトウェアが大規模であればある程困難となってくる。従って、他の箇所に存在する同等の不具合を漏れなく発見し改修することが難しく，品質面および作業コストの面で問題となりやすい。
【００１４】
重複したコードの検出の際の閾値の調整の結果、類似度の高い（完全一致のコード片）のみを抽出対象とすると短いクローン片が検出される傾向にある。ある程度の類似性を有する領域であっても、完全に一致する複数の部分領域に分割されて検出されるためである。たとえば、「Gappedクローン」の形状に類するコードの類似領域は、短いクローン片に分割されて、複数の別のクローンのペアとして検出される。
【００１５】
このように従来の技術では、類似性の検出条件の設定において、多少の差分を無視して広い類似領域（長いクローン片）を検出する設定では、類似度の精度の面で不十分な場合がある。一方で、短いクローン片を多く検出させる設定では、それにより数多く生成する傾向にあるクローンの中から目的とするコードクローンを探し出すのに分析者の労力や分析に要する時間を多く費やしてしまう。分析者に分析の目的に応じた精度の検出情報を、効率よく提示することが課題になる。
【００１６】
本発明の課題は、ソフトウェアの類似性の検出における上記従来技術の問題点を解決し、分析者（ユーザ）に分析の目的に応じた精度の検出情報を、効率よく提示することができる、ソフトウェアの類似性評価方法を提供することにある。
【課題を解決するための手段】
【００１７】
上記課題を解決するための、本発明の代表的なものの一例を示すと、次の通りである。すなわち、ソースコード分析手段により、複数のソースプログラムの間の類似性を検出し評価するソフトウェアの類似性評価方法であって、前記ソースコード分析手段は、前記複数のソースプログラムが格納される記憶装置部と、表示部を含む入出力装置とを備えており、前記類似性評価方法は、分析の条件として、前記複数のソースプログラムの間の類似性の解析条件、及び、該類似性以外の解析条件を取得する解析条件取得工程と、前記類似性の解析条件に基づき、前記複数のソースプログラムから、前記類似性に関わる情報を取得する類似性検出工程と、前記類似性以外の解析条件に基づき、前記複数のソースプログラムから、前記類似性以外の解析情報を取得する静的解析情報取得工程と、前記各ソースプログラムにおける前記類似性に関わる情報から得られた類似性を有するコード領域と前記類似性以外の解析情報とを対応づける領域照合工程と、前記類似性を有するコード領域における、前記類似性以外の解析情報を評価する評価工程と、前記評価結果に基づき、前記類似性を有するコード領域に関わる情報と前記類似性以外の解析情報とを関連付けて、前記表示部へ表示する表示工程とを有することを特徴とする。
【発明の効果】
【００１８】
本発明によれば、ソフトウェアの類似性に関して必要な情報を探しやすくし、分析者（ユーザ）の労力を軽減し、分析に要する時間を短縮できる。また、複雑度、類似度、関数位置情報など複数の解析情報をマージしたコードクローン情報をユーザに図や表として可視化し提供することは、ユーザによる精査ポイントの効率的な把握、フォーカスを容易にする。これにより、各ユーザは、ソフトウェアの開発に関して、効率的に正確な改善指針を共有できるようになる。
【図面の簡単な説明】
【００１９】
【図１Ａ】本発明の実施形態に係わるソフトウェアの類似性評価システムのハードウェアの構成例を示す図である。
【図１Ｂ】図１Ａの類似性評価システムにおける、ソースコード分析手段の機能ブロックを示す図である。
【図２】本発明の実施形態に係わるソースコード分析手段の作用、効果を示す図である。
【図３】本発明の実施例１によるソフトウェアの類似性評価方法の処理の流れを示すフローチャートである。
【図４】実施例１の選択画面のサンプル図である。
【図５】静的解析出力結果表のデータ構造を概念的に示した例である。
【図６Ａ】コードクローンの検出処理の詳細を示す図である。
【図６Ｂ】コードクローン出力結果表のデータ構造を概念的に示した例である。
【図７】コードクロー出力結果統合表のデータ構造を概念的に示した例である。
【図８】func１のソースコードを示した例である。
【図９】関数位置情報の追加の処理を具体的に示した図である。
【図１０】条件１による出力結果表のデータ構造を概念的に示した図である。
【図１１】クローン解析対象の関数情報表のデータ構造を概念的に示した図である。
【図１２】実施例１において、関数とコードクローン統合情報の出力結果をユーザに提供するための可視化図である。
【図１３】本発明の実施例２による、ソフトウェアの類似性評価方法の処理の流れを示したフローチャートである。
【図１４】実施例２における選択画面のサンプル図である。
【図１５】実施例２のコードクローン出力結果表のデータ構造を概念的に示した例である。
【図１６】実施例２の複雑度出力結果表のデータ構造を概念的に示した例である。
【図１７】検出したコードクローン出力結果とコードクローン複雑度結果をマージする処理のフローチャートを示す図である。
【図１８】静的解析出力結果とファイル間の類似度結果を統合した表のデータ構造を概念的に示した図である。
【図１９】静的解析出力結果とファイル間の類似度結果を統合した表を評価する処理のフローチャートを示す図である。
【図２０】実施例２において、静的解析出力結果とファイル間の類似度結果を統合した表の評価結果を、可視化した図である。
【図２１】本発明の実施例３に係わる類似性評価システムにおける、ソースコード分析手段の機能ブロックを示す図である。
【図２２】実施例３による、ソフトウェアの類似性評価方法の処理の流れを示すフローチャートである。
【図２３】実施例３における、各ファイルパス名に対しての特定のハードウェアに依存性があるか無いかの情報を示した表である。
【図２４】実施例３により、静的解析情報に、ハードウェアの依存性を統合した表である。
【図２５】図２４の表の評価結果を、可視化的に示した図である。
【発明を実施するための形態】
【００２０】
本発明では、分析の目的に応じて、類似領域（クローン片）を含むソースプログラムの部分領域の静的解析情報（複雑度等）を算出する。静的解析とは、プログラムを動作させずに、そのプログラムの品質を改善、評価するために行うものである。類似度とそれ以外の静的解析情報とを関連付けて評価し、分析の目的に応じて類似度情報を選別し分析者に情報提供する。
【００２１】
また、特定の複数プログラム（関数あるいはファイル等）に対して、複数の条件で類似領域（クローン片）の位置情報を、検出する。検出条件の相違を反映した複数の異なる検出結果を比較参照することで、分析の目的に応じた類似度情報の選別に活用する。  
以下、本発明の最良の実施の形態を、図面を参照して説明する。
［システム構成］
本発明のソフトウェアの類似性評価方法を実施するのに適したソースコード分析手段のシステムの例を、図１Ａ、図１Ｂを参照しながら説明する。  
本発明におけるフトウェアの類似性評価方法は、図１Ａに示すような一般的なコンピュータ上で実行される。すなわち、ソースコード分析手段は、ＣＰＵ１００と主記憶部１０１と、HDD等の外部記憶装置１０２と、CD-ROMやDVD-ROM等の可搬性を有する可搬型記憶媒体１０３から情報を読み出す読取装置１０４と、ディスプレイ（表示装置）やキーボードやマウス等の入出力装置１０５と、通信ネットワークに接続するためのNIC（Network Interface Card）等の通信装置１０６と、バス１０７とを備えた一般的なコンピュータ上で、所定のコンピュータプログラムを実行することで実現される。ソースコード分析手段（コンピュータプログラム）は、単体のコンピュータで構成しても良く、あるいは、また、サーバとこのサーバにネットワークを介して接続された少なくとも１つのコンピュータとで構成しても良い。また、入出力装置は、ユーザインターフェース機能を有するディスプレイ（表示装置）のように、入出力機能の一部が、一体的に構成されたものであっても良く、あるいはまた、入力装置と出力装置が独立して構成されたものであっても良い。
【００２２】
次に、本実施形態に係るソースコード分析手段の構成について説明する。図１Ｂは、本実施形態に係るソースコード類似性検出を行うソースコード分析手段の機能ブロック図である。ソースコード分析手段は、外部記憶装置部１０２と主記憶装置部１０１を備える。
【００２３】
外部記憶装置部１０２は、ソースコード格納部３Ａと、分析関連情報及び出力ファイル格納部３Ｂを備える。ソースコード格納部３Ａには、類似性検出を行うソースコードなど、分析に必要なソースコードが格納される。
【００２４】
分析関連情報及び出力ファイル格納部３Ｂには、類似度合の検出方法（例えばコードクローンを行単位で検出する等）に関する情報、類似度合以外の検出方法（関数の開始位置等）、ソースコード静的解析を行う場合に利用可能な外部ツールの情報など、本実施形態の実施に必要な分析関連情報が格納されている。また、以下で説明する完全一致コードクローン出力結果表、一部一致コードクローン出力結果表、複雑度出力結果表、出力結果統合表、出力結果表等も格納される。
【００２５】
主記憶装置部１０１は、コンピュータプログラムを保有しており、このプログラムに基づく所定の処理手順をＣＰＵで実行することにより得られる機能（ユニット）として、条件設定部４、類似性検出部５、静的解析部６、照合・統合部７、評価部８、評価結果表示部９を備える。
【００２６】
条件設定部４は、ソースコードの類似性検出を類似性検出部５で実行する際、あるいは静的解析部６でソースコードの複雑度や関数の位置情報などの静的解析を実行する際に、必要となる条件設定を行う。すなわち、条件設定部４では、類似性検出部５における解析で必要な、複数のソースプログラムの間の類似性に関する第１の設定条件を選定し、静的解析部６における解析で必要な、複数のソースプログラムの前記類似性以外の記述の解析に関する第２の設定条件を選定する。
【００２７】
照合・統合部７は、類似性検出部５、および静的解析部６で得られた結果を照合・統合を行う。  
評価部８は、照合・統合部７で処理した結果をユーザの目的に応じ結果を評価する。  
評価結果表示部９は、評価部８で評価した結果を、ユーザにわかりやすく可視化し表示する。
【００２８】
図２は、本発明に係わるソースコード分析手段の基本的な作用、効果を示す図である。本発明のソースコード分析手段では、格納部に格納されているソースコードファイルを入力として、（１）ソースコードの類似性検出、（２）ソースコードの関数の位置情報や複雑度などの意味分けに基づく静的解析を行う。この２つの解析（１），（２）を行う際、ユーザが目的に応じて、ソースコードの類似性検出、およびソースコードに関して類似性以外の条件の、少なくとも２つの解析条件の設定を行うことができる。
【００２９】
この条件設定に際してユーザは、分析関連情報及び出力ファイル格納部３Ｂなどの情報を利用可能である。ソースコード分析手段は設定された条件に従って、複数のソースコードの解析処理（３）を行う。そして、この解析処理で得られたソースコードの類似性とソースコードに関する類似性以外の条件の解析の結果とを照合・統合（４）し、ユーザの目的に応じて照合・統合した結果のタイプ分け（５）などを行い、評価する。さらに、評価した結果（６）を可視化し、出力表示する。これにより、ユーザ（分析者）は、ソースコード分析手段を用いて、ソースコードの分析に関して、その目的に応じた類似度合情報及び類似性以外の条件で解析を行い、解析された結果の情報を得ることができる。  
以下、より具体的な本発明の実施例について説明する。
【実施例１】
【００３０】
本発明のソフトウェアの類似性評価方法の第一の実施例を、図３乃至図１２を参照しながら説明する。この例は、ソースコードの類似性に関する情報と対応づける（照合させる）静的解析情報が関数の位置情報であり、かつ、これらを直列に処理する場合の一実施の形態である。
【００３１】
図３は、本発明の実施例１の全体の流れを示すフローチャートである。まず、最初に、ユーザにより、ソースコード分析手段に対して、ソフトウェアの類似性評価のために必要な分析条件の設定がなされる（ステップStep １）。
【００３２】
ソースコード分析手段は、ユーザが選択した少なくとも２つのプログラム（関数及びファイルなど）について文字コード変換など前処理（ステップStep ２）し、前処理したものをユーザにより指定された条件で、静的解析によって関数の位置情報を解析する（ステップStep ３）。この工程は、静的解析情報の取得工程に相当する。
【００３３】
次に、一つあるいは複数条件でコードクローン検出条件を設定し（ステップStep ４）、関数の位置情報の範囲で一つあるいは複数条件でコードクローン検出を行う（ステップStep ５）。これは類似性検出工程である。
【００３４】
コードクローンの検出条件の設定は、完全一致のコードクローンを検出したいか、あるいは一部が異なるコードクローンを検出したいかなど、ユーザがどのような類似性のコードクローンを検出したいかによって条件を設定し（ステップStep ４）、コードクローンを検出することができる。
【００３５】
すなわち、ソースコードの類似度条件は、ユーザにより指定される。「コードクローン検出類似度条件設定」欄の「１００％一致」、「一部一致」には、「９０％以上」、「８０％以上」、・・・「５０％以上」、・・・の検出したい類似度条件を押下し、チェック印を入れる。例えば「５０％以上」の類似度のコードクローンを検出したい場合は、「５０％以上」を選択することで、５０％以上から１００％の類似度のコードクローンを検出できる。また完全一致のコードクローンを検出したい場合は、「１００％一致」を選択する。
【００３６】
ソースコード分析手段は、コードクローン検出結果と関数の位置情報の出力結果を対応づけ統合する（ステップStep ６）。この工程は、領域照合工程に相当する。統合した結果からユーザの目的に応じて、コードクローン情報と関数の位置情報の統合結果の評価を行う（ステップStep ７）。この工程は、評価工程に相当する。
【００３７】
ここで得られたコードクローン情報を、例えばコードクローンと関数の内のクローンが一致しているかいないかなどで評価し、タイプ別に分類し、可視化した結果を出力する（ステップStep ８）。この工程は、評価結果表示工程に相当する。この可視化した分類は、ユーザに精査ポイントを提供できる。
【００３８】
以下、ソースコードの分析が終了するまで、同様な処理が繰り返される。（ステップStep ９）
図４は、実施例１のソースコード分析手段における設定画面１０５０の一例を示す図である。設定画面１０５０は、入力項目として、「ソースプログラムの選定」４００、「モード選択・設定」４１０、「処理方式」４２０、「出力方式」４３０を含んでいる。なお、この設定画面１０５０は、複数の画面で構成してもよい。また、表示項目やその形式も任意に構成することができる。
【００３９】
ユーザは、設定画面１０５０の「ソースプログラムの選定」４００の欄で、解析の対象となる少なくとも２つのプログラム（関数及びファイルなど）を選定する。より具体的には、ユーザが、例えば、対象のソースコードを含むフォルダのパス名を指定する。パス名を指定する際には、設定画面１０５０の「選択ファイルの格納パス」４０１の「参照」ボタンをユーザが押下し、プルダウンメニューで表示される複数のフォルダ名から希望するフォルダ名を選択し、さらに、プルダウンメニューで表示されるパス名を選択することで、フォルダのパス名の指定が可能である。パス名は、例えば、その作成日、作成者名、ファイル数などと共にリスト形式で一覧表示される。指定したフォルダ以下のディレクトリも解析対象にしたい場合は、「サブディレクトリも対象にする」にもチェック印を入れる。
【００４０】
ユーザは、次に、「モード選択・設定」４１０において、ソースプログラム間の類似性に関わる情報を取得するために、「類似性検出法」４１１を入力する。ユーザが「参照」を押下すると、プルダウンメニューで複数の類似性検出法が表示される。類似性を検出する手法としては、背景技術の欄で述べたような、例えば「コードクローン」の検出や、「重複したコード」の検出等がある。
【００４１】
さらに、コードクローンの検出に関しては、例えば、コードクローンの代表的なアルゴリズムを非特許文献３の分類に沿って「行単位の検出」、「字句単位の検出」、「抽象構文木を用いた検出」、「プログラム依存グラフを用いた検出」、「その他の検出技術を用いた検出」に分類し、さらに、応じて、必要にプルダウンメニューでより具体的なアルゴリズムを指定できるようにする。
【００４２】
行単位で検出する手法では、ソースコードを行単位で比較し、閾値以上の行数を連続して一致している部分を重複コードとして検出する。字句単位での検出する手法でも、ソースコードを字句の列に変換し、閾値以上連続して一致する部分列を類似したコード片（コードクローン）として検出する。
【００４３】
同様に、抽象構文木を用いた検出手法では、閾値以上の大きさを持つ同形の部分木を類似したコード片（コードクローン）として検出する。メトリクスやフィンガープリントを用いる手法でも、ソースコード内のモジュール単位でメトリクスを計算し、メトリクス値がある閾値以上に類似しているモジュールをコードクローンとして検出する。
【００４４】
ここでは、「類似性検出法」４１１として、ユーザが「コードクローンの行単位の検出」を指定したものとする。
【００４５】
また、「類似度合」４１２に関して、１００％一致と部分一致を選択でき、部分一致の場合には、さらに、プルダウンメニューで表示される複数の一致率の中から１つを選定できる。ここでは、「類似性検出法」４１１として、ユーザが、類似度５０％以上の部分一致を設定したものとする。
【００４６】
ユーザは、さらに、「解析条件」４１３に関して、例えば、「参照」を押下し、「ソースプログラムの選定」で選択した複数のソースコードに関して、「類似性検出法」４１１で選択した類似性検出法における類似性以外の記述の解析情報を取得する。類似性以外の記述の解析情報としては、「関数の開始位置」、「技術分野や製品もしくはシステムを特定する字句」、「作成者」、「作成日」そのソースコード内の記述、及びそのソースコードの属性として得られる情報が挙げられる。ユーザは、プルダウンメニューで表示される上記複数の解析条件から１つもしくは複数の解析条件を選択する。ここでは、「解析条件」４１３として、ユーザが「関数の開始位置」を選定したものとする。
【００４７】
また、「処理方式」４２０の項目４２１によって分析処理を直列で行うか、並列で行うかを指定する。なお、「処理方式」に関しては、分析の他の条件に応じてソースコード分析手段が自動的に判定し、ユーザの入力は求めないようにしても良い。「出力方式」４３０では、ユーザが分析の目的に応じて項目４３１を選択し、表示形式を設定できる。
【００４８】
また、図５の静的解析出力表３００は、図３のフローチャートのステップStep ３の静的解析の関数位置情報解析を行った後の出力表である。表の表記項目は、関数名欄３０１、ファイルパス名欄３０２、関数Start行欄３０３、関数End行欄３０４と、を備える。各行に一つのファイル情報が格納される。
【００４９】
関数名欄３０１は、静的解析によって同じ行のファイルパス名欄３０２対応したファイルパス名に対しファイル内に含まれる関数名が縦列に格納される。
ファイルパス名欄３０２は、縦列にファイルの格納先とファイル名を示したパス名で格納される。
【００５０】
関数Start行欄３０３と関数End行欄３０４には、静的解析によって関数名欄３０１に示された関数名に対しての関数のStart行とEnd行がそれぞれ格納される。なお、図中に入力されている値やファイルパス名は一例であり、検出された各コードクローンのファイル名と位置情報の値やファイル名がそれぞれ格納されるので、この例以外の数値であっても本発明の趣旨を逸脱しないことは言うまでもない。以下の図面の値やファイル名に関しても同様である。
【００５１】
図６Ａは、図３のコードクローン検出（ステップStep ５）の詳細を示したフローチャートである。コードクローン検出においては、予め少なくとも２つのプログラム（関数及びファイルなど）を文字コード変換など前処理し、前処理したものを一つあるいは複数条件のコードクローンの検出条件でコードクローン検出を行う。
【００５２】
図６Ａに示すように、まず、条件判定を行う（ステップS１０３１）。コードクローンの検出条件には、完全一致のコードクローンを検出したいか、あるいは一部が異なるコードクローンを検出したいか等、どのような類似性のコードクローンを検出したいか、一つあるいは複数、検出条件が設定されている。図６Ａでは２つの検出条件を例に説明している。すなわち、一つは前処理したものから設定条件に完全に一致したコード片のコードクローンの検出を行い（ステップS１０３２）、もう一つは、一部が異なるコードクローン検出を行うものである（ステップS１０３３）。
【００５３】
図６Ｂのコードクローン出力結果表２００は、図５の表３００に示した関数位置情報範囲内で、コードクローン検出の条件として、「一部一致」、すなわち「５０%以上」の類似度のコードクローンの検出を行った場合（図３のステップStep ５）の、検出結果を例として示す。
【００５４】
なお、静的解析情報取得工程と類似性検出工程の直列処理は、いずれを先に処理しても差し支えない（後の実施例でも同じ）。
【００５５】
図７のコードクローン出力結果統合表４００は、コードクローン検出結果と、関数の位置情報の結果を対応付けた（図３のステップStep ６）、結果として得られた表を示したものである。
【００５６】
表４００の表記項目には、図５の表３００の表記項目に、図６Ｂの出力結果表２００の表記項目、すなわち、クローン番号欄４０１、コードクローンStart行欄４０４、コードクローンEnd行欄４０５、類似度（%）欄４０６が追加される。
【００５７】
クローン番号欄４０１には、縦列にコードクローン検出で出力したクローン番号が格納され、同じ番号のものが同じコードクローンであることを示している。
【００５８】
各コードクローンがソースコードのどの位置に存在しているかの情報を、開始行（図中では、「コードクローンStart行」と示す）と終了行（図中では、「コードクローンEnd行」と示す）とで示し、下記のコードクローンStart行とコードクローンEnd行が格納される。コードクローンStart行欄４０４とコードクローンEnd行欄４０５は、検出されたコードクローンのStart行とEnd行がそれぞれ格納される。
【００５９】
類似度（%）欄４０６は、検出されたコードクローンのクローン番号のクローンに対する類似度が格納される。図中に入力されている値やファイル名は一例である。
【００６０】
次に、図７のコードクローン出力結果統合表４００で得られた結果を、評価する評価処理（図３のStep ７）の一例について説明する。
【００６１】
まず、関数の位置情報の範囲内で複数の条件で類似領域（クローン片）の位置情報を、検出する。検出条件の相違を反映した複数の異なる検出結果を比較参照することで、分析の目的に応じた類似度情報の効率的な選別に活用する。
【００６２】
具体的には、タイプ１〜タイプ４までの４つに分類する形態を示し、４つの分類を効率的に行う実施の形態を示す。この分類は、ソースコードの再利用の指針として想定されるものである。
【００６３】
このような評価を行う理由としては、例えば、複数製品間のソースコードの類似性を比較することで製品の再利用可能なソースコードの共通性と可変性の候補を効率的に抽出するためである。
【００６４】
製品の再利用可能な共通性と可変性のソースコードは、開発資産となり、この開発資産のソースコードを再利用することによって、生産性を向上させることが狙いである。また、検証済みの開発資産であるソースコードを再利用することで、品質の向上にもつながる。
タイプ１：関数のインターフェースが同一で、ソースコードの中身が一致する。
タイプ２：関数のインターフェースが同一で、ソースコードの一部が異なる。
タイプ３：関数のインターフェースは異なるが、ソースコードの中身が一致する。
タイプ４：関数のインターフェースは異なるが、ソースコードに重複がある（一部が異なる）。
【００６５】
関数のインターフェースとは、変数名、引数、戻り値のことであるとここでは定義する。タイプ１は開発資産の共通部分であると評価される。タイプ２と３は開発資産の可変部分であると評価される。タイプ２と３は共通部分と可変部分が混在した関数であると評価される。タイプ４は個別に判断が必要な関数であると評価される。
【００６６】
ここでソースコードの「ソースコードの中身が一致する」と「異なる」との区別は、本実施の形態では、ソースコードを行単位で比較し、分析対象の関数のサイズの６０%以上の長さが一致する場合に「一致する」と判定するものとし、以下説明する。そして、分析対象の関数（func１とする）を検出条件１と検出条件２という２通りの検出条件で類似性を検出するものとする。
【００６７】
func１のソースコードの例を図８に示す。図８には、ファイル名「AAA」と「BBB」の２つのファイルがあり、各々のファイル内でファイル「AAA」はStart行が１０行目から開始し、ファイル「BBB」はStart行が２２行目から開始する。両方のファイルを比較すると１行目から５行目まで同じであり、その同じ箇所を四角で囲ってある。
【００６８】
検出条件１の典型的な実施の形態としては、ソースコードを行単位で比較し、最低３行が連続して一致している部分のみを重複コードとして検出する。条件１による検出結果を以下、結果１と呼ぶ。検出条件２の典型的な実施の形態としては、ソースコードを行単位で比較し、前記「一致」に該当する場合のみ、すなわち、func１のサイズの６０%以上の長さの行数(６行)が連続して一致している部分のみを、重複コードとして検出する。条件２による検出結果を以下、結果２と呼ぶ。
【００６９】
図９を使って、関数位置情報追加の処理フローを詳細に説明する。まず、処理１００１で、結果１（表７００）と関数の情報（表８００）を比較する。具体的にはクローン片のStart行と関数のStart行との比較を行なう。次に、条件判定処理１００２で、不一致かを調べ、この条件が成立するときは、処理１００３以下の一連の処理を行なう。まず、処理１００３で、タイプ３かタイプ４に分類される。図８のソースコードで説明すると、図８の二つのファイルはStart行から３行目までに関数定義の情報が書かれている。処理１００２で不一致であるということは、関数のStart行から３行目までに記載されている関数定義の情報（関数のインターフェース）が同一でないことを意味するためである。
【００７０】
次に、処理１００５で、結果２と関数の情報（表８００）を比較する。具体的にはクローン片のStart行と関数のStart行の比較を行なう。最後に、条件判定処理１００６で、一致かを調べ、この条件が成立するときは、処理１００７で、タイプ１であるとして分類を特定できる。判定処理１００６で条件が成立しないときには、処理１００８で、タイプ２であるとして分類を特定できる（本実施の形態のようにクローン片自体が存在しない場合も条件判定処理１００６で「不一致」と判断し処理１００８を行う）。図８の二つのソースコードは、処理１００１により、関数定義の情報が一致しているので処理１００５に進む。重複コードとして検出する条件は、func１のサイズの６０%以上の長さの行数(６行)が連続して一致している部分のみを、重複コードとして検出するので、設定した６行を満たさないため、クローン片は検出されない。よって処理１００６では、関数とクローン片が不一致となり、処理１００８以下の一連の処理を行なう。図８の二つのソースコードはタイプ２に分類される。
【００７１】
図１０は、func１の類似性情報を検出条件１で検出した結果(結果１）７００を示す表である。
【００７２】
一方、func１の類似性情報を検出条件２で検出されるクローン片は存在しない。クローン片の行数が最大５行であり、閾値として設定した最短６行を満たさないためである。
【００７３】
図１１は、クローン解析対象の関数情報表８００のデータ構造を概念的に示した図である。
【００７４】
図１２は、関数とコードクローン統合情報の出力結果を診断出力結果ユーザに対して簡便に判断できる情報を提供するための可視化図である。図１２では、コードクローンと関数のStart行が同一であり、関数内のコードクローンが関数のソースコードと同一であるという結果を四角の枠で表示した、可視化図１０５１の一例を示している。
【００７５】
図１２の縦軸は、コードクローンと関数のStart行が同一であるかで判断し、上側をコードクローンと関数のStart行が同一である場合（図９の処理１００２でYES）を示し、下側をコードクローンと関数のStart行が同一でない場合を示す（図９の処理１００２でNO）。
【００７６】
また、横軸は関数内のコードクローンが関数のソースコードと同一であるかを判断し、右側を関数内のコードクローンが関数のソースコードと同一であることを示し（図９の処理１００６でYES）、左側は関数内のコードクローンが関数のソースコードと同一でないことを示す（図９の処理１００６でNO）。
【００７７】
図１２の可視化図１０５１によれば、ユーザは、選択した二つのソースコードの類似関係にある各コードクローンが、タイプ１〜４のいずれに属するかを、一目で把握することができる。
【００７８】
このように、本実施例によれば、ソフトウェアの類似性に関して必要な情報を探しやすくし、分析者の労力を軽減し、分析に要する時間を短縮できる。また、類似度、関数位置情報など複数の解析情報をマージしたコードクローン情報をユーザに図や表として可視化し提供することは、ユーザが精査ポイントを、効率的かつ実証的に把握し、あるいは容易にフォーカスできるようになる。これにより、各ユーザは、ソフトウェアの開発に関して、効率的に正確な改善指針を共有できるようになる。
【実施例２】
【００７９】
次に，本発明における第二の実施の形態を、図１３乃至図２０を参照しながら説明する。この実施例では、ソースコードの類似性に関する情報と対応づける（照合させる）静的解析情報が複雑度の情報であり、かつ、これらを並列に処理する場合の一実施の形態について、説明する。
【００８０】
ここで、「複雑度」とは、ソースコードのモジュール内の分岐の数やループの数など、ソースコードが実現する処理の複雑さに関係する要素が含まれる度合いを示す指標である。  
この実施例では、特に，類似性を有するコード片（類似コード片）のペアの所在（分散の仕方等）と各ペアの複雑度とを対応づけて、以下に述べるタイプA〜タイプDに分類する形の評価を行い、その結果をソースコードの解析情報として出力する形態で示す。
【００８１】
タイプAとは、複雑度が大きく、類似性を有するペアの所在の分散が大きいものであり、タイプAで講ずると想定される施策はソースコードのリファクタリングなどの対策が優先度１として必須なものである。
【００８２】
タイプBとは、複雑度が小さく、類似性を有するペアの所在の分散が小さいものであり、タイプBで講ずると想定される施策はソースコードのリファクタリングなどの対策が優先度３として分類され、緊急度は高くない。
【００８３】
タイプC、タイプDはソースコードのリファクタリングなどの対策が優先度２としてどちらも分類される。タイプCは、複雑度が小さく、類似性を有するペアの所在の分散が大きいものである。
【００８４】
タイプDは、複雑度が大きく、類似性を有するペアの所在の分散が小さいものである。
【００８５】
このような評価を行う理由としては、タイプごとに分析者が講じる施策やその優先度が異なることが想定されるからである。たとえば，複雑度が大きくかつ類似コード片の所在の分散が大きい場合、もっとも注意を喚起する必要があると考えられる。一般に複雑度が大きいと品質確保等の面でリスクが高く望ましくないとされている。複雑度は１０以下であれば良い構造とされ、３０を超えるとモジュール構造に問題があると考えられ、複雑度が小さくなるようにソースコードを修正する必要がある。
【００８６】
一方、類似性コード片のペアの所在の分散が大きい事例として類似性コード片ペアがアーキテクチャの階層定義をまたがって存在する場合を想定するならば，このような状況は一般に望ましくない。よって双方の性質を兼ね備える類似コード片ペアの存在（次に示す「タイプA」に相当する）は優先的に注意を喚起するための施策を講じるべきと想定される。
【００８７】
図１３は、第二の実施の形態の全体の処理の流れ、すなわち、類似性検出にコードクローン検出を選択し、これと静的解析の処理を並列に実施する場合、を示したフローチャートである。
【００８８】
まず、最初に、ユーザにより、ソースコード分析手段に対するソフトウェアの類似性評価のために必要な、類似性と類似性以外の２種類の分析条件の設定がなされる（ステップStep １）。
【００８９】
ソースコード分析手段では、ユーザにより選定された少なくとも２つのプログラム（関数及びファイルなど）を文字コード変換など前処理（ステップStep２）し、図１４の選択画面１０５０のモード選択欄４１０でモード選択することで（ステップStep１０２）、コードクローン検出（ステップStep１０３、Step１０４）と静的解析（ステップStep１０５、Step１０６）とを並列に実施することが可能である。
【００９０】
すなわち、コードクローン検出と静的解析を並列で行う場合には、例えば、図１４のモード選択欄４１０の「類似性検出法」４１１で「コードクローン」の行単位検出を設定する。さらに、「類似度」４１２に関して、必要な条件を入力または選択押下し、チェック印を入れる。さらに、「静的解析条件」４１３の欄の「静的解析として外部ツールを利用」の前のボックスを必要に応じて押下しチェック印を入れ、ツールのパス名を選択する。また、処理方式４２０の欄で並列処理を選択する。これは、静的解析の一実施の形態を説明したものである。
【００９１】
次に、この並列の処理フローで得られたコードクローン結果と静的解析の結果である複雑度の情報とが、対応付けられる（図１３のステップStep１０７）。図１３では、静的解析に複雑度の解析を行った場合を示している。ステップStep１０７で対応付け統合した結果を、ユーザの目的に応じて複雑度の情報とコードクローンの類似性の評価をする（ステップStep１０８）。評価した結果を可視化した結果とし出力する（ステップStep１０９）。
【００９２】
なお、コードクローン検出の処理（ステップStep１０３、Step１０４）では、ユーザが選択した少なくとも２つのプログラム（関数及びファイルなど）について文字コード変換など前処理（ステップStep ２）したソースコードについて、ユーザにより指定された条件で、コードクローン検出を行う。
【００９３】
図１５は、コードクローン検出の処理により得られた、コードクローンの類似度の解析結果表２５０のデータ構造を、概念的に示した例である。解析結果表２５０は、ファイルパス名欄２５１と類似度欄２５０とで構成されている。
【００９４】
また、図１６に示す複雑度出力結果表５００は、図１７の処理フローを用いて実現される。以下、図１６、図１７を説明する。図１６は、静的解析情報取得工程に相当するものである。図１６の複雑度出力結果表５００は、図１３のStep１０５、１０６の複雑度の解析出力結果の一例を示したものである。
【００９５】
複雑度出力結果表５００は、ファイルパス名欄５０１と、複雑度欄５０２とを備える。各行に一つのファイル情報が格納される。ファイルパス名欄５０１は、縦列にファイルの格納先とファイル名を示したパス名で格納される。複雑度欄５０２は、図１３のStep２で前処理されたファイルあるいは個々のコードクローンを含む関数、あるいはコードクローン領域ごとの複雑度の測定結果（複雑度のスコア）が格納されるものである。なお、図中に入力されている値やファイルパス名は一例である。
【００９６】
図１７は、コードクローン出力結果にコードクローン複雑度出力結果を統合する流れ（図１３のStep１０７）を、詳細に示したフローチャートである。図１７は、領域照合工程に相当するものである。まず、検出したコードクローン出力結果と複雑度出力結果の情報がソースコード分析手段に入力される（ステップS２０１）。次に、ソースコード分析手段において、コードクローン検出出力結果の１行目のクローンの位置情報と複雑度出力結果の１行目の複雑度測定対象の位置情報を比較する。複雑度測定対象の位置情報としては、複雑度をファイル単位で測定した場合にはファイルパス名、関数単位で測定した場合には、関数名やファイルのなかでの位置情報（行番号情報等）が適当であると考えられる。以下、これがファイルパス名であるものとして説明する。すなわち、コードクローン出力結果の１行目のファイルパス名と複雑度出力結果の１行目のファイルパス名を比較する（ステップS２０４）。比較したファイルパス名が同じかどうか確認し（ステップS２０５）、ファイルパス名が同じである場合、コードクローン出力結果の右端の列に同じファイルパス名の複雑度を追加する（ステップS２０６）。
【００９７】
コードクローンの複雑度出力結果の１行目に同じファイルパス名が無い場合は、複雑度出力結果のファイルパス名を一つ下の行へ移動し（ステップS２１０）、同じファイルパス名があるか確認し（ステップS２１１）、同じファイルパス名があるところの複雑度をコードクローン出力結果の右端に追加する（ステップS２１２）。
【００９８】
次に、コードクローン出力結果のファイルパス名を一つ下の行に移動する（ステップS２０７）。同様にステップS２０５、ステップS２０６、ステップS２１０ステップS２１１、ステップS２１２繰り返し行い、コードクローン出力結果のファイルパス名を全部確認する（ステップS２０８）。最後にコードクローン出力結果に複雑度を追加した結果を出力する（ステップS２０９）。
【００９９】
この出力が，図１８の静的解析出力結果とファイル間の類似度結果を統合した表６００に相当する。
【０１００】
次に、図１８の静的解析出力結果とファイル間の類似度結果を統合した表６００をもとに、図１３のStep１０８をタイプ別に評価する方法を説明する。
【０１０１】
図１９は、図１８の出力した結果をユーザに可視化し簡便に判断できる情報として提供するためのフローチャートである。図１９は、評価結果表示工程に相当するものである。
【０１０２】
図１９において、まず、図１８で出力した表６００を入力し（ステップS７０１）、入力ファイルの複雑度情報を確認する（ステップS７０２）。クローンの複雑度情報が大きい場合（ステップS７０３）、図２０の可視化図の右半分全部を囲み（ステップS７０４）、さらにクローンの広がり度の値が大きい場合には（ステップS７０５）、図２０の可視化図の右上の部分を囲み直し、優先度１として分類する（ステップS７０６）。図２０のソースコードをリファクタリングや共通化するなどの優先度として優先度１（共通化候補）の囲まれた部分を結果として出力する（ステップS７０７）。これをタイプAと分類する。
【０１０３】
またクローンの複雑度情報が小さい場合は、図２０の可視化図の左半分全部を囲み（ステップS７０９）、 クローンの広がり度の値が大きければ（ステップS７１０）、図２０の可視化図の左上の部分を囲み直し、優先度２とする（ステップS７１１）。これをタイプCと分類する。図２０の優先度２の可視化図の囲まれた部分を結果として出力する（ステップS７０７）。コードクローンの複雑度が小さい場合は、図２０の可視化図の左半分を囲み（ステップS７０９）、コードクローンの広がり度が小さい時、図２０の可視化図の左下部分を囲み直し、優先度３とする（ステップS７１２）。これをタイプBと分類する。図２０の優先度３の可視化図の囲まれた部分を結果として出力する（ステップS７０７）。
【０１０４】
図２０は、図１９のフローチャートから得られた出力結果を、ユーザに対して簡便に判断できる情報として提供するための可視化図１０５２である。
【０１０５】
ここでは例として、横軸をコードクローンの複雑度の大きさで示し、縦軸をコードクローンの広がりの大きさで示している。コードクローンの広がりとは、コードクローンがサブシステム階層を超えて存在する場合、コードクローンの広がりが大きい。またサブシステム階層内にコードクローンが存在する場合は、コードクローンの広がりは小さい。
【０１０６】
例えばコードクローンの広がりが大きく、コードクローンの複雑度が大きい場合は、図２０の右上の場所になり、ソースコード改善箇所として優先度が１番目であり、「ソースコードの共通化の候補になるコードクローンである」という情報をユーザに提供できる。
【０１０７】
図１８の出力表６００は、ファイル間の類似性を示しており、この場合を図２０の可視化図に対応させた場合、縦軸のコードクローンの広がりは、類似度が同じファイル同士の広がりとして評価できる。例えば、同じ類似度のファイル間で、リファクタリングの優先順位づけをつけることができる。
【０１０８】
図１８の出力表６００の中で類似度が７０％のファイル群は３つ存在し、このファイル群のファイルパス名を見ると同階層以外に存在するファイルパス名「c:￥data￥test￥test５」がある。このファイルは、類似度が７０％のファイル同士中で位置関係に広がりが見られ、しかも複雑度も高い。よって、図１８のファイルパス名「c:￥data￥test￥test５」は、タイプAに分類され、ソースコードのリファクタリングやソースコードの共通化などの、対策処理の優先度が同じ類似度のファイル間で最も高いもの（優先度１）であると評価できる。
【０１０９】
なお、ソースコードの類似性に関する情報と対応づける「類似性以外の解析情報」を複数にすることもできる。例えば、ソースコードの静的解析情報に加えて、さらに、ソースコードの属性情報、例えば、ソースコードの作成者や、作成日等のソースコードに関係した解析情報を含めても良い。この場合、設定画面１０５０の「選択ファイルの格納パス」４０１の「参照」ボタンをユーザが押下し、プルダウンメニューからソースコードの記述内容以外の属性情報、例えばソースコードの作成者を選択することで、ソースコードの類似性に関する情報と対応づける解析情報として、「複雑度」＋「ソースコードの作成者」の２つの解析条件を設定することもできる。これによって、例えば、図２０の可視化図１０５２を、さらに、「ソースコードの作成者」単位で作成したものを、表示することもできる。
【０１１０】
このように、本実施例によれば、ソフトウェアの類似性とこの類似性に関する情報と対応づける「類似性以外の解析情報」とに関して必要な情報を探しやすくし、分析者の労力を軽減し、分析に要する時間を短縮できる。また、類似度、複雑度など複数の解析情報をマージしたコードクローン情報をユーザに図や表として可視化し提供することは、ユーザが精査ポイントを、効率的かつ実証的に把握し、あるいは容易にフォーカスできるようになる。これにより、各ユーザは、ソフトウェアの開発に関して、効率的に正確な改善指針を共有できるようになる。
【実施例３】
【０１１１】
次に、本発明の第三の実施の形態を、図２１から図２５を参照しながら説明する。  
本発明において、ソースコードの類似性に関する情報と対応づける「類似性以外の解析情報」を、複数にできることは、既に述べたとおりである。この場合、「類似性以外の解析情報」には、ソースコードの静的解析情報に加えて、さらに、ソースコードの記述以外のソースコードに関する属性情報、例えば、ソースコードの「ハードウェアへの依存性」、「ＯＳ（オペーレーティングシステム）への依存性」等の、ソースコードに関係した解析情報を含めても良い。ここでは、「類似性以外の解析情報」として、「ハードウェアへの依存性」の解析条件を加えた実施例について述べる。
【０１１２】
実施例３のソフトウェアの類似性評価方法は、実施例１や実施例２と同様に処理して出力されたコードクローンの位置情報や、類似度、静的解析で得られた複雑度、関数位置情報などの結果を利用し、さらに、それらの結果に、ソースコードに関係する属性情報として、特定のハードウェアに依存性があるかどうかの情報を追加し、総合的に評価した出力結果を提供するものである。
【０１１３】
本実施の形態において、ソースコードに関する「ハードウェアへの依存性」とは、あるハードウェアAとハードウェアBに依存性がない場合（ハードウェアに非依存）、ハードウェアAとBの両方に同じソフトウェアが利用できる性質を意味する。あるいは、あるハードウェアAとハードウェアBに依存性が有る場合（ハードウェアに依存有り）、同じソフトウェアが利用できない性質を意味する。ハードウェア依存性を有する場合には、ハードウェアAあるいはBのどちらかだけであるソフトウェアが利用できる。
【０１１４】
ここで、ソフトウェアが複数のソースコードで構成される状況を想定すると、ソフトウェアの移植の際に、特定のハードウェアに非依存なソースコードは、改造不要なソースコードに相当する（本実施の形態では、ある特定のハードウェア環境で動作するソフトウェアを別のハードウェア環境で動作するように改造する作業をソフトウェアの「移植」と称する）。
【０１１５】
個々のソースコードが特定のハードウェアに依存か非依存かは、ソースコード作成完了段階で作成者等は一般に識別しており、移植性を高め保守容易にする目的で、双方を分離してソースコードをファイル化し、さらには格納フォルダを分けて配置する施策がしばしば講ぜられる。移植の際に、改造不要なソースコードと改造が必要なソースコードが、識別容易になり、移植作業を正確かつ速く行いやすくなるためである。
【０１１６】
しかし、ハードウェア依存性があると作業者等が識別したソースコードにも、作業ミス等の理由で、部分的にハードウェアに非依存のコード断片が誤混入した状態が起こりえる。その可能性を有するのは、たとえば、「ハードウェア非依存」と称するファイルと「ハードウェア依存有り」と称するファイルとの間でクローンが存在する場合である。「ハードウェア依存」と称するファイルに含まれるクローンに、ハードウェア依存性が実は存在しない、すなわち、クローンに該当するコード断片が正しくはハードウェア非依存であった可能性がある。このような場合には、クローンに相当するコード断片を「ハードウェア依存（有り）」と称するファイルから分離して、「ハード非依存」のファイル等に移動して、正しく配置しなおす修正が望まれる。
【０１１７】
本実施の形態は、上述のようなコード断片の誤混入の検出を支援する用途を想定するものである。
【０１１８】
図２１は、実施例３に係わる類似性評価システムにおける、ソースコード分析手段の機能ブロックを示す図である。基本的な構成は、図１Ｂのソースコード分析手段と同じである。外部記憶装置部１０２のソースコード格納部３Ａには、類似性検出を行うソースコードなど、分析に必要なソースコードが、「ハードウェア依存」のファイル、「ハード非依存」のファイルとして個別に格納されている。
【０１１９】
主記憶装置部１０１の分析条件設定部４０では、ソースコードの類似性検出を第一の条件（類似性）検出部５０で実行する際の解析で必要な、複数のソースプログラムの間の類似性に関する「第１の設定条件」を選定し、第二の条件（類似性以外）解析部６０でソースプログラムの前記類似性以外の記述の解析に関する「第２の設定条件」を選定する。
【０１２０】
図２２は、第三の実施形態の全体の処理の流れを示したフローチャートである。全体としては、図３に示した実施例１のフローチャートと同じである。最初に、ユーザにより、ソースコード分析手段に対するソフトウェアの類似性評価のために必要な分析条件の設定がなされる。ここでは、「ハードウェアへの依存性」の解析条件も設定される。（ステップStep １０）。
【０１２１】
図２３は、ソースコード格納部３Ａ等に保持された各ファイルパス名に対して、特定のハードウェアに依存性があるか無いかの情報の一例を示した、ハードウェア依存の情報を示す表１０００である。
【０１２２】
以下、実施例１と同様に、ステップStep ２〜６の処理がなされる。その後、ステップStep６で得られた出力結果から必要な解析結果を利用し、さらにハードウェアの依存情報をStep６で検出されたコードクローンに対応付ける（ステップStep １１）。
【０１２３】
さらに、検出コードクローン情報と関数の位置情報、及びハードウェアの依存情報の統合結果の評価を行い（ステップStep １２）、その結果を可視化した図を出力表示する（ステップStep ８）。
【０１２４】
図２４は、コードクローン位置情報および複雑度などの静的解析情報に、ハードウェアの依存性を統合したハードウェア依存性統合表１１００を示す。ここでは、各ファイルパス名が、クローン番号（１，２，３，−）の順にリストアップされている。また、同じクローン番号を有する複数のファイルパス名は、枝番号で区別されている。
【０１２５】
図２５は、ハードウェア依存性統合表１１００を評価した結果を、可視化的に示した結果である。本評価は、図２４の類似度５０％以上のコードクローンを対象とし、縦軸に複雑度の大小を示し、横軸はハードウェアの依存性の有無を示し、クローン番号がどこの座標に分布されるか示している。図２４のハードウェア依存性統合表１１００で示されている各クローン番号に対する全クローンについても表示されている。
【０１２６】
図２５で、「特定のハードウェアに依存あり」とは、同一のクローン番号のコード断片が、特定のハードウェアに依存すると称するファイルに１つでも存在する状態をさし示すものとする。このような状態は、一例として、ハードウェア依存性があると判定したソースコードに、作業ミス等の理由で、部分的にハードウェアに非依存のコードが混入したこと想定しうる状態である。この状況を検出した作業者等は、優先的にこのクローンの内容を確認し、その結果、実際にハード非依存であることが認定されれば、然るべきファイルやフォルダに当該コード断片を移動する。
【０１２７】
図２４を参照することによって、クローン番号３の２つのクローン（３−１，３−２）は、これに（「特定のハードウェアに依存あり」）該当することが確認できるので、図２５において「特定のハードウェアに依存あり」に相当する左上の象限にマッピングされている。
【０１２８】
本評価では、図２４より、クローン番号１（１−１〜１−３）は複雑度が高く、ある特定のハードウェアAに非依存である。そのため、クローン番号１の３つのクローンは図２５の右上に分布される。
【０１２９】
クローン番号２の１つのクローン（２−１）は、複雑度が高いクローンに分布され、特定のハードウェアAに非依存であるので、図２５の右上に分布される。
【０１３０】
クローン番号２の残りの１つのクローン（２−２）は、複雑度が低いクローンに分布され、特定のハードウェアAに非依存であるので、図２５の右下に分布される。
【０１３１】
クローン番号３の２つのクローン（３−１，３−２）は、いずれも複雑度が高く、特定のハードウェアAに依存があるので図２５の左上に分布される。
【０１３２】
なお、ここでは、コードクローンが５０％以上の類似度情報の結果を例として出力しているが、類似度が７０％以上、あるいは類似度が８０％以上などのように図２５の出力情報を、類似度毎に複数の選択可能な画面で出力することが可能である。あるいはまた、依存性及び複雑度に、類似度も含めた情報を、Ｘ，Ｙ，Ｚの３軸に展開し、１つの画面で表示するようにしても良い。
【０１３３】
分析者は、これらの画面から、正確な改善指針をえることができる。例えば、クローン番号３のクローン群のように特定のハードウェアに依存性が有るコード断片を含む場合には、コードクローン部分を抽出して、移植の際に改造不要なソースコードとして特定のフォルダ等に集中的に格納しておくよう修正する。これにより移植性を高めることができる。さらに、同程度の複雑度を有するクローン番号２のクローン群よりも修正を優先的に行うといった作業の優先順位づけの指針を得ることができる。このことは、複雑度と類似度だけを優先順位づけの指針に用いる第二の実施の形態の様態に加えて、新たに第三の尺度を加えた情報提示を行うことで新たな作業指針を導く効果の発現を意味するものである。
【０１３４】
なお、静的解析情報取得工程と類似性検出工程の直列処理に代えて、これらを実施例２のように並列処理し、それらの処理で得られた出力結果から必要な解析結果を利用し、さらにハードウェアの依存情報を対応付け、出力した結果を評価し、可視化した図を出力表示するようにしても良い。
【０１３５】
このように、本実施例によれば、ソフトウェアの類似性と、この類似性に関する情報と対応づける複数の「類似性以外の情報」とに関して必要な情報を探しやすくし、分析者の労力を軽減し、分析に要する時間を短縮できる。また、類似度、複雑度、ハードウェアの依存情報など複数の解析情報をマージしたコードクローン情報をユーザに図や表として可視化し提供することは、ユーザが精査ポイントを、効率的かつ実証的に把握し、あるいは容易にフォーカスできるようになる。これにより、各ユーザは、ソフトウェアの開発に関して、効率的に正確な改善指針を共有できるようになる。
【符号の説明】
【０１３６】
３A…ソースコード格納部、３Ｂ…分析関連情報及び出力ファイル格納部、４…条件設定部、５…類似性検出部、６…静的解析部、７…照合・統合部、８…評価部、９…評価結果表示部、１００…ＣＰＵ、１０１…主記憶装置、１０２…外部記憶装置、１０３…可搬型記憶媒体、１０４…読取装置、１０５…入出力装置、１０６…通信装置、２００…完全一致コードクローン出力結果表、３００…一部一致コードクローン出力結果表、４００…複雑度出力結果表、５００…出力結果統合表、６００…コードクローン位置情報の重なりをまとめた出力結果表、７００…条件１による出力結果表、８００…クローン解析対象の関数情報表、１０５０…設定画面、１０５１…可視化図。
【図１Ａ】
0005564448.tif 000002
【図１Ｂ】
0005564448.tif 000003
【図２】
0005564448.tif 000004
【図３】
0005564448.tif 000005
【図４】
0005564448.tif 000006
【図５】
0005564448.tif 000007
【図６Ａ】
0005564448.tif 000008
【図６Ｂ】
0005564448.tif 000009
【図７】
0005564448.tif 000010
【図８】
0005564448.tif 000011
【図９】
0005564448.tif 000012
【図１０】
0005564448.tif 000013
【図１１】
0005564448.tif 000014
【図１２】
0005564448.tif 000015
【図１３】
0005564448.tif 000016
【図１４】
0005564448.tif 000017
【図１５】
0005564448.tif 000018
【図１６】
0005564448.tif 000019
【図１７】
0005564448.tif 000020
【図１８】
0005564448.tif 000021
【図１９】
0005564448.tif 000022
【図２０】
0005564448.tif 000023
【図２１】
0005564448.tif 000024
【図２２】
0005564448.tif 000025
【図２３】
0005564448.tif 000026
【図２４】
0005564448.tif 000027
【図２５】
0005564448.tif 000028