(57)【要約】【課題】同じ構文を有する関数のペアだけでなく、異なる構文で処理内容が類似する関数のペアも類似関数として抽出する。【解決手段】複数の関数を含むソースコード１１１から複数の関数の各関数が依存する依存先要素のリストを依存リスト１３１として取得する依存性解析部１２０と、依存リスト１３１を用いて、複数の関数のうち２つの関数の依存先要素同士の類似度を依存先類似度として算出し、算出した依存先類似度を用いて、２つの関数の類似度を依存元類似度として算出する類似度算出部１６１と、依存元類似度が第１閾値以上の場合に２つの関数を互いに類似する類似関数であると判定する類似閾値判定部１６２とを備える。【選択図】図１
2017010476.tif 000002
【特許請求の範囲】
【請求項１】
複数の関数を含むソースコードから前記複数の関数の各関数が依存する依存先要素のリストを依存リストとして取得する依存性解析部と、
前記依存リストを用いて、前記複数の関数のうち２つの関数の依存先要素同士の類似度を依存先類似度として算出し、前記依存先類似度を用いて、前記２つの関数の類似度を依存元類似度として算出する類似度算出部と、
前記依存元類似度が第１閾値以上の場合に前記２つの関数を互いに類似する類似関数であると判定する類似閾値判定部と
を備える類似判定装置。
【請求項２】
前記類似判定装置は、
前記ソースコードから前記複数の関数の各関数の特徴を数値化したメトリクスをメトリクス情報として抽出するメトリクス抽出部を備え、
前記類似度算出部は、
前記メトリクス情報を用いて、前記２つの関数の特徴の類似度をメトリクス類似度として算出し、
前記類似閾値判定部は、
前記依存元類似度が前記第１閾値以上で、かつ、前記メトリクス類似度が第２閾値以上の場合に、前記２つの関数を互いに類似する類似関数であると判定する請求項１に記載の類似判定装置。
【請求項３】
前記メトリクス抽出部は、
前記ソースコードから前記複数の関数の各関数の複雑度と物理行数とを含む前記メトリクス情報を抽出し、
前記類似度算出部は、
前記メトリクス情報を用いて、前記２つの関数の複雑度の類似度と前記２つの関数の物理行数の類似度とを前記メトリクス類似度として算出する請求項２に記載の類似判定装置。
【請求項４】
前記依存性解析部は、
前記複数の関数の各関数が依存する依存先要素と、前記依存先要素の種別を表す依存種別と、前記複数の関数の各関数が前記依存先要素に依存する強度を表す依存強度数とを含む前記依存リストを取得し、
前記類似度算出部は、
前記２つの関数の依存先要素の名称同士が類似するか否かを判定すると共に、前記２つの関数の依存種別が一致するか否かを判定し、判定結果と前記依存強度数とを用いて前記依存先類似度を算出する請求項１から３のいずれか１項に記載の類似判定装置。
【請求項５】
前記類似度算出部は、
前記２つの関数の依存先要素の名称同士が不一致となる文字数が第３閾値以下である場合に、前記２つの関数の依存先要素の名称同士が類似すると判定する請求項４に記載の類似判定装置。
【請求項６】
依存性解析部が、複数の関数を含むソースコードから前記複数の関数の各関数が依存する依存先要素のリストを依存リストとして取得し、
類似度算出部が、前記依存リストを用いて、前記複数の関数のうち２つの関数の依存先要素同士の類似度を依存先類似度として算出し、
前記類似度算出部が、前記依存先類似度を用いて、前記２つの関数の類似度を依存元類似度として算出し、
類似閾値判定部が、前記依存元類似度が第１閾値以上の場合に前記２つの関数を互いに類似する類似関数であると判定する類似判定方法。
【請求項７】
前記類似判定方法は、さらに、
メトリクス抽出部が、前記ソースコードから前記複数の関数の各関数の特徴を数値化したメトリクスをメトリクス情報として抽出し、
前記類似度算出部が、前記メトリクス情報を用いて、前記２つの関数の特徴の類似度をメトリクス類似度として算出し、
前記類似閾値判定部が、前記依存元類似度が前記第１閾値以上で、かつ、前記メトリクス類似度が第２閾値以上の場合に、前記２つの関数を互いに類似する類似関数であると判定する請求項６に記載の類似判定方法。
【請求項８】
複数の関数を含むソースコードから前記複数の関数の各関数が依存する依存先要素のリストを依存リストとして取得する依存性解析処理と、
前記依存リストを用いて、前記複数の関数のうち２つの関数の依存先要素同士の類似度を依存先類似度として算出し、前記依存先類似度を用いて、前記２つの関数の類似度を依存元類似度として算出する類似度算出処理と、
前記依存元類似度が第１閾値以上の場合に前記２つの関数を互いに類似する類似関数であると判定する類似閾値判定処理とをコンピュータに実行させる類似判定プログラム。
【請求項９】
前記類似判定プログラムは、さらに、
前記ソースコードから前記複数の関数の各関数の特徴を数値化したメトリクスをメトリクス情報として抽出するメトリクス抽出処理を備え、
前記類似度算出処理は、前記メトリクス情報を用いて、前記２つの関数の特徴の類似度をメトリクス類似度として算出し、
前記類似閾値判定処理は、前記依存元類似度が前記第１閾値以上で、かつ、前記メトリクス類似度が第２閾値以上の場合に、前記２つの関数を互いに類似する類似関数であると判定する請求項８に記載の類似判定プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムのソースコードから類似する関数を判定する類似判定装置、類似判定方法及び類似判定プログラムに関する。特に、関数の類似性を評価し、類似性に関する情報を定量的に計測する類似判定装置、類似判定方法及び類似判定プログラムに関する。
【背景技術】
【０００２】
大規模なシステム開発において、開発工数削減のために過去のシステムのプログラム部品を再利用して開発を行うケースが多い。再利用するプログラム部品中のソースコードをコピーアンドペーストした結果、完全に一致するコード片のペアが生成される。また、ペースト後にソースコードの一部を変更した結果、類似するコード片のペアが生成される。
このような類似のコード片のペアが存在する場合、ペアの片方のコード片に変更の必要が生じた際には、ペアのもう片方のコード片にも変更が必要となる可能性が高い。そのため、プログラムの変更に際して類似のコード片のペアを求めることが必要とされる。
【０００３】
また、類似のコード片のペアが複数存在するプログラムを改修する場合、類似のコード片それぞれに修正を行うと、修正にかかる時間が大きくなり保守費が増大するという問題がある。この問題を解決するための方法として、ソースコードの内部構造を改善するリファクタリングにより、類似のコード片を単一のコード片に統合する方法がある。この方法では、リファクタリングの対象となる類似のコード片のペアを求めることが必要となる。
【０００４】
しかし、大規模なシステム開発において、大量のソースコードの中から類似のコード片のペアを目視で探索することは非効率的であり、作業工数の増加に繋がる。また、目視による探索では類似のコード片のペアの見落としによる修正漏れが発生し、障害作りこみの要因となる。したがって、大規模なシステム開発の現場では類似のコード片のペアを効率的かつ網羅的に検出することが求められる。
【０００５】
特許文献１、特許文献２、特許文献３及び非特許文献１には、複数のテキストファイルから構成されるソースコードの中から、類似のコード片のペアを自動的に検出する手法あるいはツールが記載されている。
非特許文献１には、類似のコード片のペアの検出ツールであるＣＣＦｉｎｄｅｒが記載されている。ＣＣＦｉｎｄｅｒは、字句解析を用いて類似のコード片のペアの検出を行う。ＣＣＦｉｎｄｅｒは、関数名及び変数名をトークン列に変換し、特定の文字列に置換して解析を実施する。このため、ＣＣＦｉｎｄｅｒは、関数名及び変数名の差異に関わらず、構造が類似のコード片のペアを検出することができる。
特許文献１では、非特許文献１の検出ツールと文字列の比較とを併用して類似のコード片のペアを検出する手法が記載されている。
特許文献２では、非特許文献１あるいは特許文献１に記載の検出手法等を利用して類似のコード片のペアを検出し、さらにリファクタリング対象の選定のための情報提供として、静的解析による複雑度の情報を提示する手法が記載されている。
特許文献３では、字句解析により検出した類似のコード片のペアのうち、各コードが参照するメモリの差異を判別することにより誤検出を減らす手法が記載されている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００３−２１６４２５号公報
【特許文献２】特開２０１２−１６４２１１号公報
【特許文献３】特開２０１１−０９６０８２号公報
【非特許文献】
【０００７】
【非特許文献１】神谷年洋、ＣＣＦｉｎｄｅｒホームページＵＲＬ：ｈｔｔｐ：／／ｗｗｗ．ｃｃｆｉｎｄｅｒ．ｎｅｔ／ｉｎｄｅｘ‐ｊ．ｈｔｍｌ
【発明の概要】
【発明が解決しようとする課題】
【０００８】
特許文献１、特許文献２、特許文献３及び非特許文献１に記載の類似のコード片のペアの検出手法は、字句解析あるいは構文差異を用いて類似のコード片のペアを検出する手法である。そのため、同じ構文を持つ類似のコード片のペアを検出することは可能であるが、異なる構文の類似のコード片のペアを検出することができないという課題がある。
【０００９】
また、従来技術では構文のパターンの一致により類似のコード片を見つける手法を取っている。その際、類似コードとみなす最小のトークン数すなわちパターンの長さを指定する。しかし、利用者が指定したトークン数が小さいと、検出結果に誤りが混入し易くなる。一方、利用者が指定したトークン数が大きいと、短いコード片、あるいは構文のパターンが変わる変更のなされたコード片が検出できないという課題がある。
【００１０】
本発明は、ソースコードから、同じ構文を持つ類似のコード片のペアだけでなく、異なる構文の類似のコード片のペアを検出すること、およびトークン数の調整を行わずに類似のコード片のペアを検出することを目的とする。
【課題を解決するための手段】
【００１１】
本発明に係る類似判定装置は、
複数の関数を含むソースコードから前記複数の関数の各関数が依存する依存先要素のリストを依存リストとして取得する依存性解析部と、
前記依存リストを用いて、前記複数の関数のうち２つの関数の依存先要素同士の類似度を依存先類似度として算出し、前記依存先類似度を用いて、前記２つの関数の類似度を依存元類似度として算出する類似度算出部と、
前記依存元類似度が第１閾値以上の場合に前記２つの関数を互いに類似する類似関数であると判定する類似閾値判定部とを備える。
【発明の効果】
【００１２】
本発明に係る類似判定装置では、類似度算出部が、依存リストを用いて、複数の関数のうち２つの関数の依存先要素同士の類似度を依存先類似度として算出し、依存先類似度を用いて、２つの関数の類似度を依存元類似度として算出する。また、類似閾値判定部が、依存元類似度が第１閾値以上の場合に２つの関数を互いに類似する類似関数であると判定する。よって、本発明に係る類似判定装置によれば、同じ構文の２つの関数だけでなく、異なる構文でも依存先が類似する２つの関数を類似関数と判定することができる。
【図面の簡単な説明】
【００１３】
【図１】実施の形態１に係る類似判定装置１００のブロック構成図。
【図２】実施の形態１に係る類似判定装置１００の類似判定方法９１００、類似判定プログラム９２００の類似判定処理Ｓ１００を示すフロー図。
【図３】実施の形態１に係る類似判定装置１００の処理対象であるソースコード１１１と、ソースコード１１１の特徴１１２と、比較例の手法を用いた検出結果１１３とを表す図。
【図４】実施の形態１に係る依存リスト１３１の例を示す図。
【図５】実施の形態１に係るメトリクス情報１５１の例を示す図。
【図６】実施の形態１に係る類似判定実行部１６０の類似判定実行処理Ｓ１３０を示すフロー図。
【図７】実施の形態１に係る類似判定閾値１７１の例を示す図。
【図８】実施の形態１に係る依存先類似度リスト１６１１の例を示す図。
【図９】実施の形態１に係る類似度算出部１６１の依存先類似計算処理Ｓ１３１を示すフロー図。
【図１０】実施の形態１に係る依存元類似度リスト１６１２の例を示す図。
【図１１】実施の形態１に係る類似度算出部１６１の依存元類似計算処理Ｓ１３２を示すフロー図。
【図１２】実施の形態１に係るメトリクス類似リスト１６１３の例を示す図。
【図１３】実施の形態１に係るメトリクス類似リスト１６１３の例を示す図。
【図１４】実施の形態１に係る類似度算出部１６１のメトリクス類似計算処理Ｓ１３３を示すフロー図。
【図１５】実施の形態１に係る類似関数リスト１８０の例を示す図。
【図１６】実施の形態１に係る類似閾値判定部１６２の類似閾値判定処理Ｓ１３４を示すフロー図。
【図１７】実施の形態２に係る類似判定装置１００ａのブロック構成図。
【図１８】実施の形態２に係る許容不一致数１９１の例を示す図。
【図１９】実施の形態２に係る類似度算出部１６１ａの依存先類似計算処理Ｓ１３１ａを示すフロー図。
【図２０】実施の形態２に係る依存先類似度リスト１６１１の例を示す図。
【図２１】実施の形態２に係る依存元類似度リスト１６１２の例を示す図。
【図２２】実施の形態２に係る類似関数リスト１８０の例を示す図。
【図２３】実施の形態１，２に係る類似判定装置１００，１００ａのハードウェア構成図。
【発明を実施するための形態】
【００１４】
実施の形態１．
＊＊＊構成の説明＊＊＊
図１を用いて、本実施の形態に係る類似判定装置１００のブロック構成について説明する。
図１に示すように、類似判定装置１００は、依存性解析部１２０、メトリクス抽出部１４０、類似判定実行部１６０を備える。また、類似判定装置１００は、ソースコード記憶部１１０、依存リスト記憶部１３０、メトリクス記憶部１５０、類似判定記憶部１７０を備える。
【００１５】
ソースコード記憶部１１０は、類似関数を検出する対象のソースコード１１１を記憶する。依存リスト記憶部１３０は、依存性解析部１２０から出力される依存リスト１３１を記憶する。メトリクス記憶部１５０は、メトリクス抽出部１４０から出力されるメトリクス情報１５１を記憶する。類似判定記憶部１７０は、類似関数の判定に用いられる類似判定閾値１７１を記憶する。
【００１６】
依存性解析部１２０は、複数の関数を含むソースコード１１１から、複数の関数の各関数が依存する依存先要素のリストを依存リスト１３１として取得する。
メトリクス抽出部１４０は、ソースコード１１１から複数の関数の各関数の特徴を数値化したメトリクスをメトリクス情報１５１として抽出する。複数の関数の各関数の特徴を数値化したメトリクスは、実装メトリクスとも称される。
【００１７】
類似判定実行部１６０は、類似度算出部１６１と、類似閾値判定部１６２とを備える。
類似度算出部１６１は、依存リスト１３１を用いて、複数の関数のうち２つの関数の依存先要素同士の類似度を依存先類似度として算出する。類似度算出部１６１は、２つの関数の依存先要素の名称同士が類似するか否かを判定すると共に、２つの関数の依存種別が一致するか否かを判定する。そして、類似度算出部１６１は、その判定結果と依存の強度を表す依存強度数とを用いて依存先類似度を算出する。そして、類似度算出部１６１は、算出した依存先類似度を用いて、２つの関数の類似度を依存元類似度として算出する。
また、類似度算出部１６１は、メトリクス情報１５１を用いて、２つの関数の特徴の類似度をメトリクス類似度として算出する。
【００１８】
類似判定記憶部１７０は、類似判定閾値１７１として、第１閾値１７１１１、第２閾値１７１２１を記憶する。
【００１９】
類似閾値判定部１６２は、依存元類似度が第１閾値１７１１１以上で、かつ、メトリクス類似度が第２閾値１７１２１以上の場合に、２つの関数を互いに類似する類似関数であると判定する。なお、類似閾値判定部１６２は、依存元類似度が第１閾値１７１１１以上の場合に、２つの関数を互いに類似する類似関数であると判定してもよい。また、類似閾値判定部１６２は、メトリクス類似度が第２閾値１７１２１以上の場合に、２つの関数を互いに類似する類似関数であると判定してもよい。
類似閾値判定部１６２は、類似関数であると判定した２つの関数を類似関数リスト１８０に追加する。
【００２０】
類似判定装置１００は、類似関数である２つの関数を検出する類似関数検出装置とも称される。
【００２１】
＊＊＊動作の説明＊＊＊
図２を用いて、本実施の形態に係る類似判定装置１００の類似判定方法９１００、類似判定プログラム９２００の類似判定処理Ｓ１００について説明する。類似判定プログラム９２００は、類似判定処理Ｓ１００をコンピュータである類似判定装置１００に実行させる。
【００２２】
＜依存性解析処理Ｓ１１０＞
依存性解析部１２０は、複数の関数を含むソースコード１１１から複数の関数の各関数が依存する依存先要素のリストを依存リスト１３１として取得する依存性解析処理Ｓ１１０を実行する。
依存性解析部１２０は、ソースコード１１１を用いて、依存リスト１３１を取得する。依存性解析部１２０は、依存元要素、依存先要素、依存種別、依存強度数等を含む依存データを依存リスト１３１として出力する。依存性解析部１２０は、依存リスト１３１を取得するツールを用いて、依存リスト１３１を取得する。具体的には、このツールは、ソースコード１１１が入力されると、入力されたソースコード１１１に応じた依存リスト１３１を出力する。
依存性解析部１２０は、取得した依存リスト１３１を依存リスト記憶部１３０に記憶する。
【００２３】
図３では、本実施の形態に係る類似判定装置１００の処理対象であるソースコード１１１と、そのソースコード１１１の特徴１１２と、本実施の形態と比較するための比較例の手法を用いた検出結果１１３とを表している。
具体例として、図３に示すソースコード１１１が類似判定処理Ｓ１００の処理対象であるものとする。
【００２４】
図４を用いて、本実施の形態に係る依存リスト１３１の例について説明する。
依存リスト１３１は、複数の関数の各関数ｆ０、ｆ１、ｆ２、ｆ３、ｆ４が依存する依存先要素１３１２と、依存先要素１３１２の種別を表す依存種別１３１３と、複数の関数の各関数が依存先要素１３１２に依存する強度を表す依存強度数１３１４とを含む。
図４では、図３に示すソースコード１１１に記述されている複数の関数ｆ０、ｆ１、ｆ２、ｆ３、ｆ４に対する依存性解析部１２０の出力結果である依存リスト１３１を示している。
依存元要素１３１１は、ソースコード１１１に記述されている各関数であり、類似判定処理の処理対象となる関数である。
依存先要素１３１２は、依存元要素１３１１の関数と依存関係にある要素である。
依存種別１３１３は、依存元要素１３１１と依存先要素１３１２との依存関係の種類を示す。具体的には、図３に示すように、依存先が関数である依存元要素ｆ０の依存先要素ｆｕｎｃＡの依存種別は関数呼出しである。また、依存先が変数である依存元要素ｆ０の依存先要素ａの依存種別は変数参照である。
依存強度数１３１４は、依存元要素１３１１から依存先要素１３１２への参照回数である。具体的には、依存元要素ｆ０から依存先要素ｆｕｎｃＡの参照回数は１回であるため、依存強度数は１となり、依存元要素ｆ４から依存先要素ａの参照回数は２回であるため、依存強度数は２となる。
【００２５】
＜メトリクス抽出処理Ｓ１２０＞
メトリクス抽出部１４０は、ソースコード１１１から複数の関数の各関数の特徴を数値化したメトリクスをメトリクス情報１５１として抽出するメトリクス抽出処理Ｓ１２０を実行する。メトリクス抽出部１４０は、ソースコード１１１から複数の関数の各関数の複雑度１５１１と物理行数１５１２とをメトリクスとして含むメトリクス情報１５１を抽出する。なお、複数の関数の各関数の特徴を表すメトリクスは、複雑度１５１１、物理行数１５１２に限らず、その他の数値でもよい。
【００２６】
メトリクス抽出部１４０は、ソースコード１１１に関する情報であるメトリクス情報１５１を取得する。メトリクス抽出部１４０は、ソースコード１１１に含まれる関数毎の複雑度１５１１、物理行数１５１２等の情報をメトリクス情報１５１として出力する。メトリクス抽出部１４０は、メトリクス情報１５１を取得するツールを用いて、メトリクス情報１５１を取得する。具体的には、このツールは、ソースコード１１１が入力されると、入力されたソースコード１１１に応じたメトリクス情報１５１を出力する。
メトリクス抽出部１４０は、取得したメトリクス情報１５１をメトリクス記憶部１５０に記憶する。
【００２７】
図５を用いて、本実施の形態に係るメトリクス情報１５１の例について説明する。図５では、図３に示すソースコード１１１に記述されている複数の関数ｆ０、ｆ１、ｆ２、ｆ３、ｆ４に対するメトリクス情報１５１を示している。
メトリクス情報１５１では、ソースコード１１１に含まれる関数毎に、各種メトリクスが設定される。各種メトリクスは、具体的には、複雑度１５１１、物理行数１５１２である。
【００２８】
＜類似判定処理Ｓ１３０＞
図６を用いて、本実施の形態に係る類似判定実行部１６０の類似判定処理Ｓ１３０の概要について説明する。
類似判定実行部１６０は、依存リスト１３１とメトリクス情報１５１とに基づいて、ソースコード１１１から類似判定閾値１７１を越えた関数のペアを類似関数として類似関数リスト１８０に出力する。なお、複数の関数のうち２つの関数を関数のペアと称する場合がある。
類似判定実行処理Ｓ１３０は、類似度算出処理Ｓ１３０１と類似閾値判定処理Ｓ１３４とを備える。
類似度算出処理Ｓ１３０１は、依存先類似計算処理Ｓ１３１、依存元類似計算処理Ｓ１３２、メトリクス類似計算処理Ｓ１３３を備える。
【００２９】
Ｓ１３１において、類似度算出部１６１は、依存リスト１３１を用いて、複数の関数のうち２つの関数の依存先要素同士の類似度を依存先類似度１６１１１として算出する。
類似度算出部１６１は、依存リスト１３１を用いて依存先類似計算処理Ｓ１３１を実行し、依存先類似度リスト１６１１を出力する。依存先類似度リスト１６１１は異なる依存データの任意の組合せについて依存先類似度１６１１１を算出したものである。
類似度算出部１６１は、２つの関数の依存先要素の名称同士が類似するか否かを判定すると共に、２つの関数の依存種別が一致するか否かを判定し、判定結果と依存強度数とを用いて依存先類似度１６１１１を算出する。
【００３０】
Ｓ１３２において、類似度算出部１６１は、依存先類似度リスト１６１１に含まれる依存先類似度１６１１１を用いて、２つの関数の類似度を依存元類似度１６１２１として算出する。
類似度算出部１６１は、依存先類似度リスト１６１１を用いて依存元類似計算処理Ｓ１３２を実行し、依存元類似度リスト１６１２を出力する。依存元類似度リスト１６１２は異なる関数の任意の組合せについて依存元類似度１６１２１を算出したものである。
【００３１】
Ｓ１３３において、類似度算出部１６１は、メトリクス情報１５１を用いて、２つの関数の特徴の類似度をメトリクス類似度１６１３１として算出する。
類似度算出部１６１は、メトリクス情報１５１を用いてメトリクス類似計算処理Ｓ１３３を実行し、メトリクス類似度１６１３１を含むメトリクス類似リスト１６１３を出力する。
【００３２】
類似閾値判定処理Ｓ１３４において、類似閾値判定部１６２は、依存元類似度１６１２１が第１閾値１７１１１以上で、かつ、メトリクス類似度１６１３１が第２閾値１７１２１以上の場合に、２つの関数を互いに類似する類似関数であると判定する。なお、類似閾値判定部１６２は、依存元類似度１６１２１が第１閾値１７１１１以上の場合に、２つの関数を互いに類似する類似関数であると判定してもよい。また、類似閾値判定部１６２は、メトリクス類似度１６１３１が第２閾値１７１２１以上の場合に、２つの関数を互いに類似する類似関数であると判定してもよい。すなわち、類似閾値判定部１６２は、依存元類似度１６１２１とメトリクス類似度１６１３１との両方を用いて類似判定を行ってもよいし、いずれか一方のみを用いて類似判定を行っても構わない。
本実施の形態では、類似閾値判定部１６２は、依存元類似度リスト１６１２とメトリクス類似リスト１６１３と類似判定閾値１７１とを用いて、類似閾値判定処理Ｓ１３４を実行し、類似関数リスト１８０を出力する。
【００３３】
図７を用いて、本実施の形態に係る類似判定閾値１７１の例について説明する。類似判定閾値１７１は、依存元類似度の一致率の閾値である依存元一致率１７１１と、各種メトリクスの一致率の閾値であるメトリクス一致率１７１２，１７１３とで構成される。
依存元類似度１６１２１とは、依存元の関数同士における依存先要素、依存種別、依存強度数の類似度を数値化したものである。
具体的には、図７に示すように、類似判定閾値１７１には、依存元一致率１７１１、複雑度のメトリクス一致率１７１２、物理関数のメトリクス一致率１７１３が設定される。
依存元一致率１７１１は、第１閾値１７１１１の例である。
複雑度のメトリクス一致率１７１２、物理関数のメトリクス一致率１７１３は、第２閾値１７１２１の例である。
【００３４】
次に、類似判定実行部１６０による類似判定実行処理Ｓ１３０について詳しく説明する。
【００３５】
＜依存先類似計算処理Ｓ１３１＞
図８では、本実施の形態に係る依存先類似度リスト１６１１の例について示している。  依存先類似度リスト１６１１には、依存元要素１、依存元要素２、依存先要素１、依存先要素２、依存種別１、依存種別２、依存強度数１、依存強度数２、依存先類似度１６１１１が設定される。
【００３６】
図９を用いて、本実施の形態に係る類似度算出部１６１の依存先類似計算処理Ｓ１３１について説明する。
図９では、依存先類似度計算処理Ｓ１３１の処理の流れを示している。
Ｓ１３１１において、類似度算出部１６１は、依存リスト１３１における依存元要素が異なる依存データの組合せを取得する。具体的には、図８の依存先類似度リスト１６１１では、依存元要素がｆ０とｆ１とで異なる依存先要素１のｆｕｎｃＡと依存先要素２のｆｕｎｃＡとの組合せが取得される。この組み合わせの依存データとして、依存リスト１３１から、依存種別１が関数呼び出し、依存種別２が関数呼び出し、依存強度数１が１、依存強度数２が１と設定される。
【００３７】
類似度算出部１６１は、２つの関数の依存先要素の名称同士が類似するか否かを判定すると共に、２つの関数の依存種別が一致するか否かを判定し、判定結果と依存強度数とを用いて依存先類似度１６１１１を算出する。
【００３８】
Ｓ１３１２において、類似度算出部１６１は、取得した依存データの組合せについて、２個の依存データの依存種別が一致するか否かを判定すると共に、２個の依存データの依存先要素が一致するか否かを判定する。
依存種別あるいは依存先要素が一致しない場合、依存データの組合せは一致が無いことを意味し、処理はＳ１３１３に進む。
依存種別と依存先要素とが共に一致する場合、依存データの組合せは一致であることを意味し、処理はＳ１３１４に進む。
【００３９】
なお、依存先類似度１６１１１は、依存先要素、依存強度数に基づいて算出される。
ここで、図８の依存先類似度リスト１６１１の最終行に、依存元要素１がｆ０、依存元要素２がｆ４、依存先要素１がａ、依存先要素２がａである依存データが設定されている。依存強度数１３１４は、上述したように、依存元要素から依存先要素への参照回数である。具体的には、依存元要素ｆ０から依存先要素ａの参照回数は１回であるため、依存強度数は１となり、依存元要素ｆ４から依存先要素ａの参照回数は２回であるため、依存強度数は２となる。類似度算出部１６１は、一致と判定した場合、以下の式１により依存先類似度を算出する。
式１：依存先類似度＝最小依存強度数／最大依存強度数
【００４０】
Ｓ１３１３では一致が無いことから、類似度算出部１６１は、依存先類似度リスト１６１１において、依存先類似度１６１１１に０を設定する。
【００４１】
Ｓ１３１４では一致であることから、類似度算出部１６１は、依存先類似度リスト１６１１において、依存先類似度１６１１１に式１で算出された依存先類似度を設定する。
類似度算出部１６１は、Ｓ１３１１からＳ１３１４の処理を依存リスト１３１における依存元要素が異なる依存データの組合せの全てについて実行する。
【００４２】
図８の依存先類似度リスト１６１１の最終行では、依存先要素と依存種別とが共に一致する。そこで、類似度算出部１６１は、式１を用いて、依存先類似度＝１／２＝０．５０を算出する。そして、類似度算出部１６１は、依存先類似度１６１１１に０．５０を設定する。
一方、図８の依存先類似度リスト１６１１の下から４番めの行には、依存元要素１がｆ０、依存元要素２がｆ４、依存先要素１がａ、依存先要素２がｆｕｎｃＡである依存データが設定されている。この依存データにおいては、依存先要素と依存種別とが共に一致しないため、依存先類似度１６１１１は０．００と設定される。
【００４３】
＜依存元類似計算処理Ｓ１３２＞
図１０では、本実施の形態に係る依存元類似度リスト１６１２の例を示している。
依存元類似度リスト１６１２には、依存元要素１、依存元要素２、依存先要素１、依存先要素２が設定される。また、依存元類似度リスト１６１２には、依存先類似度１６１１１、依存元類似度１６１２１が設定される。依存元類似度１６１２１は、複数の関数のうち２つの関数の類似度を表す。
【００４４】
図１１を用いて、本実施の形態に係る類似度算出部１６１の依存元類似計算処理Ｓ１３２について説明する。
Ｓ１３２１において、類似度算出部１６１は、依存先類似度リスト１６１１における任意の依存元要素１の任意の依存元要素２を取得する。
Ｓ１３２２において、類似度算出部１６１は、依存元要素１の依存先数が依存元要素２の依存先数よりも少ないか否かを判定する。
依存元要素１の依存先数が依存元要素２の依存先数以上の場合（Ｓ１３２２でＮＯ）、処理はＳ１３２４に進む。
依存元要素１の依存先数が依存元要素２の依存先よりも少ない場合（Ｓ１３２２でＹＥＳ）、処理はＳ１３２３に進む。
【００４５】
Ｓ１３２３において、類似度算出部１６１は、依存元類似度の最大値を１．００とするために、依存データ１と依存データ２とを交換し、依存データ１の依存先数を必ず依存データ２の依存先数よりも大きくする。具体的には、図８において依存元要素１がｆ０、依存元要素２がｆ４であった依存データは、ｆ０が依存先要素数３、ｆ４が依存先要素数４である。ｆ４の依存先要素数の方が大きいため、図１０においては依存データ１と依存データ２を交換している。一方、依存元要素１がｆ０、依存元要素２がｆ１であった依存データは、ｆ０、ｆ１ともに依存先要素数が３であるため、依存データ１と依存データ２の交換は行わない。
【００４６】
Ｓ１３２４において、類似度算出部１６１は、依存先要素１について、最大依存先類似度の平均値を依存元類似度として算出し、依存元類似度リストに追加する。
依存元類似度は、依存元における依存先要素毎の依存先類似度から算出される類似度である。
具体例として、依存元要素１がｆ４、依存元要素２がｆ０である依存元類似度１６１２１について説明する。この依存元類似度１６１２１は、依存元要素１の依存先要素ｆｕｎｃＡ、ｆｕｎｃＢ、ｆｕｎｃＣ、ａの最大依存先類似度がそれぞれ１．００、１．００、０．００、０．５０であり、これらの平均値により０．６２５と算出される。
【００４７】
＜メトリクス類似計算処理Ｓ１３３＞
図１２及び図１３は、本実施の形態に係るメトリクス類似リスト１６１３の例を示している。
メトリクス類似リスト１６１３は、異なる関数の組合せである関数ペアと、各関数のメトリクス値と、メトリクス類似度とで構成される。メトリクス類似リスト１６１３には、関数１、関数１のメトリクス値、関数２、関数２のメトリクス値、メトリクス類似度１６１３１が設定される。
図１２は、メトリクスが関数の複雑度である場合を示している。図１３は、メトリクスが関数の物理行数である場合を示している。本実施の形態では、複雑度と物理行数との２つの種類のメトリクスについて、メトリクス類似リスト１６１３を生成するものとする。
【００４８】
図１４は、本実施の形態に係る類似度算出部１６１のメトリクス類似計算処理Ｓ１３３を示すフロー図である。
類似度算出部１６１は、メトリクス情報１５１を用いて、関数ペア１１１１の複雑度の類似度と関数ペア１１１１の物理行数の類似度とをメトリクス類似度１６１３１として算出する。
【００４９】
Ｓ１３３１において、類似度算出部１６１は、任意の種類のメトリクスと、異なる関数の組合せである関数ペア１１１１とを取得する。
Ｓ１３３２において、類似度算出部１６１は、関数ペア１１１１におけるメトリクス類似度１６１３１を以下の式２で算出する。
式２：メトリクス類似度＝関数ペアにおける最小メトリクス／関数ペアにおける最大メトリクス。
Ｓ１３３３において、類似度算出部１６１は、算出したメトリクス類似度１６１３１を、その種類のメトリクスの類似度としてメトリクス類似リスト１６１３に設定する。
【００５０】
以上のように、メトリクス類似度は関数ペア１１１１のメトリクス同士から算出される。具体的には、図１２において、関数１がｆ０であり、かつ、関数２がｆ２である関数ペアにおいて、メトリクスである複雑度の類似度は、式２より、１．００と算出される。関数１がｆ０であり、かつ、関数２がｆ２である関数ペアにおいて、メトリクスである物理行数の類似度は、式２より、０．６０と算出される。
【００５１】
＜類似閾値判定処理Ｓ１３４＞
図１５は、本実施の形態に係る類似関数リスト１８０の例を示している。
図１６を用いて、本実施の形態に係る類似判定実行部１６０の類似閾値判定処理Ｓ１３４について説明する。
Ｓ１３４１において、類似判定実行部１６０は、図１０の依存元類似度リスト１６１２から任意の関数ペア１１１１、すなわち依存元要素１と依存元要素２との組合せを取得する。
Ｓ１３４２において、類似判定実行部１６０は、Ｓ１３４１において取得した関数ペア１１１１の依存元類似度１６１２１が類似判定閾値１７１の依存元一致率１７１１より小さいか否かについて判定する。
依存元類似度１６１２１が依存元一致率１７１１より小さい場合（Ｓ１３４２でＹＥＳ）、類似判定実行部１６０は、処理をＳ１３４１に戻し、別の関数ペア１１１１を取得する。
依存元類似度１６１２１が依存元一致率１７１１以上の場合（Ｓ１３４２でＮＯ）、類似判定実行部１６０は、処理をＳ１３４３に進める。
【００５２】
Ｓ１３４３において、類似判定実行部１６０は、メトリクス類似リスト１６１３における任意の種類のメトリクス類似度１６１３１を対象メトリクス類似度として取得する。ここでは、複雑度のメトリクス類似度１６１３１を対象メトリクス類似度として取得したものとする。
Ｓ１３４４において、類似判定実行部１６０は、Ｓ１３４１において取得した関数ペア１１１１における対象メトリクス類似度が類似判定閾値１７１のメトリクス一致率１７１２より小さいか否かについて判定する。
対象メトリクス類似度がメトリクス一致率１７１２より小さい場合（Ｓ１３４４でＹＥＳ）、類似判定実行部１６０は、処理をＳ１３４１に戻し、別の関数ペア１１１１を取得する。
対象メトリクス類似度がメトリクス一致率１７１２以上（Ｓ１３４４でＮＯ）で、かつ、未処理の種類のメトリクスの類似度がある場合、類似判定実行部１６０は、そのメトリクス類似度を対象メトリクス類似度として取得し（Ｓ１３４３）、処理を繰り返す。類似判定実行部１６０は、未処理の種類のメトリクスの類似度が無くなると、処理をＳ１３４５に進める。
Ｓ１３４５において、類似判定実行部１６０は、Ｓ１３４１において取得した関数ペア１１１１を類似関数リスト１８０に出力する。
【００５３】
図１５に示すように、類似関数リスト１８０には、関数ペア１１１１、依存元類似度１６１２１、メトリクス類似度１６１３１が設定される。関数ペア１１１１として依存元要素１及び依存元要素２が設定される。メトリクス類似度１６１３１としてメトリクス類似度＿複雑度及びメトリクス類似度＿物理行数が設定される。
【００５４】
具体的に、関数ペアｆ４とｆ０について説明する。
図１０から、関数ペアｆ４とｆ０の依存元類似度１６１２１は０．６２５である。また、メトリクス類似度＿複雑度は、１．００、メトリクス類似度＿物理行数は０．８６である。これらの値を、図７の類似判定閾値１７１と比較すると、いずれの値も閾値以上であるため、関数ペアｆ４とｆ０は類似関数であると判定される。よって、図１５に示すように、関数ペアｆ４及びｆ０は、類似関数リスト１８０に出力される。
【００５５】
＊＊＊本実施の形態に係る効果の説明＊＊＊
以上のように、本実施の形態に係る類似判定装置は、ソースコードから依存関係を調べて依存リストを抽出する依存性解析部と、ソースコードからソースコードの情報を調べてメトリクス情報を抽出するメトリクス抽出部を備える。また、本実施の形態に係る類似判定装置は、依存リストおよびメトリクス情報と、類似判定閾値とを比較して類似関数リストを抽出する類似判定実行部を備える。よって、依存先要素が完全に一致する類似関数を抽出することができる。
【００５６】
図３では、本実施の形態に係る類似判定装置による手法と、比較例の手法との判定結果を比較している。
関数ｆ０、ｆ１、ｆ２、ｆ３、ｆ４に対し、比較例の構文のパターンの一致を判定する構文差異の手法では、関数ｆ０とｆ１は一致と判定されるものの、ｆ０とｆ２は構文が異なるため、不一致と判定される。
一方、本実施の形態では、依存リストの差異を依存元類似度として算出し、この依存元類似度で類似判定するため、関数ｆ０とｆ２を一致として判定することが可能となる。
また、依存リストの差異である依存元類似度のみでは、条件分岐のある関数ｆ０と条件分岐のない関数ｆ３が一致と判定される。これを防ぐため、本実施の形態では、各関数のメトリクスの差異をメトリクス類似度として算出し、このメトリクス類似度で類似判定するため、関数ｆ０とｆ３を不一致として判定することが可能となる。
【００５７】
本実施の形態に係る類似判定装置では、依存元類似度とメトリクス類似度を組み合わせて類似判定するため、異なる構文で処理内容が類似の関数を抽出することが可能となる。
以上のように、本実施の形態に係る類似判定装置では、ソースコード内の同じ構文を持つ類似のコード片のペアだけでなく異なる構文の類似のコード片のペアを検出すること、およびトークン数の調整を行わずに類似のコード片のペアを検出することができる。
【００５８】
＊＊＊他の構成＊＊＊
なお、本実施の形態では、類似判定装置１００が、ソースコード記憶部１１０、依存リスト記憶部１３０、メトリクス記憶部１５０、類似判定記憶部１７０を備えるとした。しかし、類似判定装置１００が、これらの４つの記憶部の全てを備える構成でなくてもよい。他の例として、類似判定装置１００は、これらの４つの記憶部のうち一部の記憶部を備え、一部以外の記憶部は外部の記憶装置に備える構成でもよい。また、類似判定装置１００は、これらの４つの記憶部の全てを外部の記憶装置に備えていてもよい。また、類似判定装置１００は、少なくとも一部の記憶部が記憶された記憶装置とネットワークを介して接続されていてもよい。
【００５９】
実施の形態２．
本実施の形態では、主に、実施の形態１と異なる点について説明する。
本実施の形態において、実施の形態１で説明した構成と同様の構成については同一の符号を付し、その説明を省略する場合がある。
【００６０】
プログラムのソースコードにおいて、関数名あるいは変数名は、ソフトウェア開発後の保守性を考慮して、機能あるいは役割を類推できるようにつけることが慣例となっている。そこで、類似した機能あるいは役割を持つ関数あるいは変数は、類似した名前となることが多い。
実施の形態１では、依存先の関数名あるいは変数名が完全に一致している関数のみについて、類似性情報を定量的に計測する手法であった。このため、関数名あるいは変数名の一部が異なるが類似する依存先を持つ関数ペアは、類似度が低下し、類似関数として検出することができなかった。
本実施の形態では、レーベンシュタイン距離などによる文字列の部分一致を検出する手法を用いて、一部名前が異なるが類似の処理を行う関数ペアを類似関数として検出することができる類似判定装置１００ａについて説明する。
【００６１】
図１７は、本実施の形態に係る類似判定装置１００ａのブロック構成を示す図である。
図１７に示すように、類似判定装置１００ａは、実施の形態１で説明した類似判定装置１００のブロック構成に加え、許容不一致数記憶部１９０を備える。許容不一致数記憶部１９０は、類似であることを許容する文字数を許容不一致数１９１として記憶する。許容不一致数１９１は、第３閾値１９１１の例である。
なお、許容不一致数記憶部１９０についても、類似判定装置１００ａが備える構成でなくてもよく、類似判定装置１００ａの外部の記憶装置に備えられていてもよい。
【００６２】
実施の形態１では、類似度算出部１６１は、依存先要素の依存種別が一致するか否かを判定すると共に、依存先要素の名前が一致するか否かを判定していた。
しかし、本実施の形態では、類似度算出部１６１ａは、２つの関数の依存先要素の名称同士が不一致となる文字数が許容不一致数１９１以下である場合に、２つの関数の依存先要素の名称同士が類似すると判定する。すなわち、類似度算出部１６１ａは、依存先要素の依存種別が一致するか否かを判定すると共に、依存先要素の名前の不一致数が許容範囲内であるか否かを判定する。
【００６３】
図１８は、本実施の形態に係る許容不一致数１９１の例を示す図である。許容不一致数１９１には、依存先要素において部分一致しない文字数を指定する。
【００６４】
＊＊＊動作の説明＊＊＊
図１８は、本実施の形態に係る許容不一致数１９１の例を示している。図１８の許容不一致数１９１は、不一致文字数が１文字までであれば、類似と判定することを意味している。
図１９を用いて、本実施の形態に係る類似度算出部１６１ａの依存先類似計算処理Ｓ１３１ａについて説明する。
図１９は、実施の形態１で説明した図９に対応する図であり、図９と異なる点はＳ１３１２ａの処理である。
【００６５】
Ｓ１３１２ａにおいて、類似度算出部１６１ａは、取得した依存データの組合せについて、２個の依存データの依存種別が一致するか否かを判定すると共に、２個の依存データの依存先要素の名前の不一致数が許容不一致数１９１以下であるか否かを判定する。
依存種別が一致せず、または、依存先要素の不一致数が許容不一致数１９１より多い場合、依存データの組合せは一致が無く類似しないことを意味し、処理はＳ１３１３に進む。
依存種別が一致し、かつ、依存先要素の不一致数が許容不一致数１９１以下の場合、依存データの組合せは完全一致であることを意味し、処理はＳ１３１４に進む。
【００６６】
類似度算出部１６１ａは、依存リスト１３１における依存元要素が異なる依存データの任意の組合せに対して、２個の依存データの依存種別が一致し、かつ、依存先要素の不一致数が許容不一致数１９１以下である場合、式１から依存先類似度１６１１１を求める（Ｓ１３１４）。類似度算出部１６１ａは、そうでなければ０を依存先類似度１６１１１として依存先類似度リスト１６１１に追加する（Ｓ１３１３）。
【００６７】
図２０は、本実施の形態に係る依存先類似度リスト１６１１を示す図である。
図２０の依存先類似度リスト１６１１を用いて、具体的に説明する。図２０の下から１１番目の行は、依存元要素１がｆ０、依存元要素２がｆ４、依存先要素１がｆｕｎｃＡ、依存先要素２がｆｕｎｃＢである依存データが設定されている。この依存データにおいては依存種別１および依存種別２が関数呼出しと一致し、ｆｕｎｃＡとｆｕｎｃＢとの不一致文字数が１であるため、式１により、依存先類似度１６１１１が１．００と算出される。
一方、図２０の下から４番目の行は、依存元要素１がｆ０、依存元要素２がｆ４、依存先要素１がａ、依存先要素２がｆｕｎｃＡである依存データが設定されている。この依存データにおいては依存種別１が変数参照、依存先要素２が関数呼出しと一致しないため、依存先類似度１６１１１が０．００と算出される。
【００６８】
図２１では、本実施の形態に係る依存元類似度リスト１６１２の例を示している。
図２１の依存元類似度リスト１６１２を用いて本実施の形態を適用した場合の、依存元類似度１６１２１について説明する。
依存元要素１がｆ４、依存元要素２がｆ０である依存元類似度１６１２１は、依存元要素１の依存先要素ｆｕｎｃＡ、ｆｕｎｃＢ、ｆｕｎｃＣ、ａの最大依存先類似度がそれぞれ１．００、１．００、１．００、０．５０となる。実施の形態１では、依存先要素ｆｕｎｃＣの最大依存先類似度は０．００であったが、本実施の形態では、１．００となるためである。よって、これらの平均値により０．８７５と算出され、実施の形態１の依存元類似度１６１２１の０．６２５に比べ、類似度を高くできる。
【００６９】
図２２は、本実施の形態に係る類似関数リスト１８０の例を示している。
図２２から、関数ペアｆ４とｆ０の依存元類似度１６１２１は０．８７５である。また、メトリクス類似度＿複雑度は、１．００、メトリクス類似度＿物理行数は０．８６である。これらの値を、図７の類似判定閾値１７１と比較すると、いずれの値も閾値以上であるため、関数ペアｆ４とｆ０は類似関数であると判定される。よって、図２２に示すように、関数ペアｆ４及びｆ０は、類似関数リスト１８０に出力される。
【００７０】
＊＊＊本実施の形態に係る効果の説明＊＊＊
以上のように、本実施の形態に係る類似判定装置によれば、一部名前が異なるが類似の処理を行う関数ペアを類似関数として検出することができる。
【００７１】
次に、図２３を用いて、実施の形態１に係る類似判定装置１００，１００ａのハードウェア構成の一例について説明する。
【００７２】
類似判定装置１００，１００ａはコンピュータである。
類似判定装置１００，１００ａは、プロセッサ９０１、補助記憶装置９０２、メモリ９０３、通信装置９０４、入力インタフェース９０５、ディスプレイインタフェース９０６といったハードウェアを備える。
プロセッサ９０１は、信号線９１０を介して他のハードウェアと接続され、これら他のハードウェアを制御する。
入力インタフェース９０５は、入力装置９０７に接続されている。
ディスプレイインタフェース９０６は、ディスプレイ９０８に接続されている。
【００７３】
プロセッサ９０１は、プロセッシングを行うＩＣ（Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）である。
プロセッサ９０１は、具体的には、ＣＰＵ、ＤＳＰ（Ｄｉｇｉｔａｌ  Ｓｉｇｎａｌ  Ｐｒｏｃｅｓｓｏｒ）、ＧＰＵである。
補助記憶装置９０２は、具体的には、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、フラッシュメモリ、ＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）である。
メモリ９０３は、具体的には、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）である。
通信装置９０４は、データを受信するレシーバー９０４１及びデータを送信するトランスミッター９０４２を含む。
通信装置９０４は、具体的には、通信チップ又はＮＩＣ（Ｎｅｔｗｏｒｋ  Ｉｎｔｅｒｆａｃｅ  Ｃａｒｄ）である。
入力インタフェース９０５は、入力装置９０７のケーブル９１１が接続されるポートである。
入力インタフェース９０５は、具体的には、ＵＳＢ（Ｕｎｉｖｅｒｓａｌ  Ｓｅｒｉａｌ  Ｂｕｓ）端子である。
ディスプレイインタフェース９０６は、ディスプレイ９０８のケーブル９１２が接続されるポートである。
ディスプレイインタフェース９０６は、具体的には、ＵＳＢ端子又はＨＤＭＩ（登録商標）（Ｈｉｇｈ  Ｄｅｆｉｎｉｔｉｏｎ  Ｍｕｌｔｉｍｅｄｉａ  Ｉｎｔｅｒｆａｃｅ）端子である。
入力装置９０７は、具体的には、マウス、キーボード又はタッチパネルである。
ディスプレイ９０８は、具体的には、ＬＣＤ（Ｌｉｑｕｉｄ  Ｃｒｙｓｔａｌ  Ｄｉｓｐｌａｙ）である。
【００７４】
補助記憶装置９０２には、図１及び図１７に示す依存性解析部、メトリクス抽出部、類似度算出部、類似判定実行部の機能を実現するプログラムが記憶されている。以下、依存性解析部、メトリクス抽出部、類似度算出部、類似判定実行部をまとめて「部」と表記する。
【００７５】
上述した「部」の機能を実現するプログラムは、類似判定プログラム９２００とも称される。「部」の機能を実現するプログラムは、１つのプログラムであってもよいし、複数のプログラムから構成されていてもよい。また、「部」の機能を実現するプログラムは、磁気ディスク、フレキシブルディスク、光ディスク、コンパクトディスク、ブルーレイ（登録商標）ディスク、ＤＶＤ等の記憶媒体に記憶される。
このプログラムは、メモリ９０３にロードされ、プロセッサ９０１に読み込まれ、プロセッサ９０１によって実行される。
【００７６】
更に、補助記憶装置９０２には、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）も記憶されている。
そして、ＯＳの少なくとも一部がメモリ９０３にロードされ、プロセッサ９０１はＯＳを実行しながら、「部」の機能を実現するプログラムを実行する。
【００７７】
図２３では、１つのプロセッサ９０１が図示されているが、類似判定装置１００が複数のプロセッサ９０１を備えていてもよい。
そして、複数のプロセッサ９０１が「部」の機能を実現するプログラムを連携して実行してもよい。
【００７８】
また、「部」の処理の結果を示す情報とデータと信号値と変数値が、メモリ９０３、補助記憶装置９０２、又は、プロセッサ９０１内のレジスタ又はキャッシュメモリにファイルとして記憶される。
【００７９】
「部」を「プロセッシングサーキットリー」で提供してもよい。
また、「部」を「回路」又は「工程」又は「手順」又は「処理」に読み替えてもよい。また、「処理」を「回路」又は「工程」又は「手順」又は「部」に読み替えてもよい。
「回路」及び「プロセッシングサーキットリー」は、プロセッサ９０１だけでなく、ロジックＩＣ又はＧＡ（Ｇａｔｅ  Ａｒｒａｙ）又はＡＳＩＣ（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）又はＦＰＧＡ（Ｆｉｅｌｄ−Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）といった他の種類の処理回路をも包含する概念である。
【００８０】
なお、プログラムプロダクトと称されるものは、「部」として説明している機能を実現するプログラムが記録された記憶媒体及び記憶装置であり、見た目の形式に関わらず、コンピュータ読み取り可能なプログラムをロードしているものである。
【００８１】
上記の実施の形態では、「部」のそれぞれが独立した機能ブロックとして類似判定装置１００を構成している。しかし、類似判定装置１００は上記のような構成でなくてもよく、類似判定装置１００の構成は任意である。
依存性解析部とメトリクス抽出部とを１つの機能ブロックとしてもよい。また、類似度算出部と類似判定実行部とを１つの機能ブロックとしてもよい。類似判定装置１００の機能ブロックは、上記の実施の形態で説明した機能を実現することができれば、任意である。これらの機能ブロックを、他のどのような組み合わせ、あるいは任意のブロック構成で類似判定装置を構成しても構わない。
また、類似判定装置は、１つの装置でなく、複数の装置から構成された類似判定システムでもよい。
【００８２】
また、実施の形態１から２について説明したが、これらの２つの実施の形態のうち、複数を部分的に組み合わせて実施しても構わない。あるいは、これらの２つの実施の形態のうち、１つの実施の形態を部分的に実施しても構わない。その他、これらの２つの実施の形態を、全体としてあるいは部分的に、どのように組み合わせて実施しても構わない。
なお、上記の実施の形態は、本質的に好ましい例示であって、本発明、その適用物及び用途の範囲を制限することを意図するものではなく、必要に応じて種々の変更が可能である。
【符号の説明】
【００８３】
１００，１００ａ  類似判定装置、１１０  ソースコード記憶部、１１１  ソースコード、１１１１  関数ペア、１１２  特徴、１１３  検出結果、１２０  依存性解析部、１３０  依存リスト記憶部、１３１  依存リスト、１３１１  依存元要素、１３１２  依存先要素、１３１３  依存種別、１３１４  依存強度数、１４０  メトリクス抽出部、１５０  メトリクス記憶部、１５１  メトリクス情報、１５１１  複雑度、１５１２  物理行数、１６０  類似判定実行部、１６１，１６１ａ  類似度算出部、１６１１  依存先類似度リスト、１６１２  依存元類似度リスト、１６１３  メトリクス類似リスト、１６１１１  依存先類似度、１６１２１  依存元類似度、１６１３１  メトリクス類似度、１６２  類似閾値判定部、１７０  類似判定記憶部、１７１  類似判定閾値、１７１１  依存元一致率、１７１２，１７１３  メトリクス一致率、１７１１１  第１閾値、１７１２１  第２閾値、１９０  許容不一致数記憶部、１９１  許容不一致数、１９１１  第３閾値、１８０  類似関数リスト、９０１  プロセッサ、９０２  補助記憶装置、９０３  メモリ、９０４  通信装置、９０５  入力インタフェース、９０６  ディスプレイインタフェース、９０７  入力装置、９０８  ディスプレイ、９１０  信号線、９１１，９１２  ケーブル、９０４１  レシーバー、９０４２  トランスミッター、９１００  類似判定方法、９２００  類似判定プログラム、Ｓ１００  類似判定処理、Ｓ１１０  依存性解析処理、Ｓ１２０  メトリクス抽出処理、Ｓ１３０  類似判定実行処理、Ｓ１３０１  類似度算出処理、Ｓ１３４  類似閾値判定処理。
【図１】
2017010476.tif 000003
【図２】
2017010476.tif 000004
【図３】
2017010476.tif 000005
【図４】
2017010476.tif 000006
【図５】
2017010476.tif 000007
【図６】
2017010476.tif 000008
【図７】
2017010476.tif 000009
【図８】
2017010476.tif 000010
【図９】
2017010476.tif 000011
【図１０】
2017010476.tif 000012
【図１１】
2017010476.tif 000013
【図１２】
2017010476.tif 000014
【図１３】
2017010476.tif 000015
【図１４】
2017010476.tif 000016
【図１５】
2017010476.tif 000017
【図１６】
2017010476.tif 000018
【図１７】
2017010476.tif 000019
【図１８】
2017010476.tif 000020
【図１９】
2017010476.tif 000021
【図２０】
2017010476.tif 000022
【図２１】
2017010476.tif 000023
【図２２】
2017010476.tif 000024
【図２３】
2017010476.tif 000025