(57)【要約】【課題】ソースコードのコードクローンに含まれる変更ミスの検出精度を向上させる。【解決手段】本発明の１つの態様では、ソースコード間で類似する処理記述がなされた部分である複数のコードクローンが記憶された記憶部を参照し、当該複数のコードクローン間において対応する位置にそれぞれ出現するトークンの組合せを抽出する。そして、抽出したトークンの組合せごとに、それぞれのトークンを所定規則で文字列単位に分割して、トークン間における文字列の組合せを抽出する。さらに、当該文字列の組合せ同士の比較結果に応じて、当該文字列の組合せを含んだトークンの組合せに含まれるトークンを要確認箇所として検出する。【選択図】  図２
2016040707.tif 000002
【特許請求の範囲】
【請求項１】
ソースコード間で類似する処理記述がなされた部分である複数のコードクローンが記憶された記憶部を参照し、当該複数のコードクローン間において対応する位置にそれぞれ出現するトークンの組合せを抽出し、
前記トークンの組合せごとに、それぞれのトークンを所定規則で文字列単位に分割して、トークン間における文字列の組合せを抽出し、
前記文字列の組合せ同士の比較結果に応じて、前記文字列の組合せを含んだ前記トークンの組合せに含まれるトークンを要確認箇所として検出する
処理をコンピュータに実行させるソフトウェア検証プログラム。
【請求項２】
前記文字列の組合せを抽出する処理は、前記トークンの組合せごとに、それぞれのトークンに共通して含まれる文字列を除いた文字列を特定し、当該文字列を対象としてトークン間における文字列の組合せを抽出する、請求項１に記載のソフトウェア検証プログラム。
【請求項３】
前記文字列の組合せを抽出する処理は、抽出した前記文字列の組合せのそれぞれを、前記複数のコードクローンにおいて１箇所に出現する文字列の組合せと、複数箇所に出現する文字列の組合せとに分類し、
前記要確認箇所として検出する処理は、前記１箇所に出現する文字列の組合せと、前記複数箇所に出現する文字列の組合せとの比較結果に応じて、前記１箇所に出現するトークンの組合せに含まれるトークンを要確認箇所として検出する、請求項１に記載のソフトウェア検証プログラム。
【請求項４】
前記要確認箇所として検出する処理は、前記文字列の組合せ同士において対応する文字列同士を比較して、前記文字列の組合せ同士が類似している度合を示す値を算出し、前記対応する文字列同士の全てが一致している場合でなく、かつ、前記類似している度合を示す値が所定閾値よりも大きいときに、前記文字列の組合せを含んだ前記トークンの組合せに含まれるトークンを要確認箇所として検出する、請求項１〜３のいずれか１項に記載のソフトウェア検証プログラム。
【請求項５】
前記文字列の組合せを抽出する処理は、それぞれの前記トークンの組合せについて、トークン間における文字列に含まれる数字の組合せを検出し、
前記要確認箇所として検出する処理は、前記文字列に含まれる数字の組合せ同士を比較して、当該数字の組合せ同士において対応する数字間における差分を算出し、当該差分に基づいて、前記数字の組合せを含んだ前記トークンの組合せに含まれるトークンを要確認箇所として検出する、請求項１〜４のいずれか１項に記載のソフトウェア検証プログラム。
【請求項６】
前記複数のコードクローンのそれぞれに含まれる、類似する処理記述がなされた複数の繰り返し部分を検出する処理をさらに含み、
前記トークンの組合せを抽出する処理は、前記複数の繰り返し部分間において対応する位置にそれぞれ出現するトークンの組合せをさらに抽出する、請求項１〜５のいずれか１項に記載のソフトウェア検証プログラム。
【請求項７】
ソースコード間で類似する処理記述がなされた部分である複数のコードクローンが記憶された記憶部を参照し、当該複数のコードクローン間において対応する位置にそれぞれ出現するトークンの組合せを抽出し、
前記トークンの組合せごとに、それぞれのトークンを所定規則で文字列単位に分割して、トークン間における文字列の組合せを抽出し、
前記文字列の組合せ同士の比較結果に応じて、前記文字列の組合せを含んだ前記トークンの組合せに含まれるトークンを要確認箇所として検出する
処理をコンピュータが実行するソフトウェア検証方法。
【請求項８】
ソースコード間で類似する処理記述がなされた部分である複数のコードクローンが記憶された記憶部を参照し、当該複数のコードクローン間において対応する位置にそれぞれ出現するトークンの組合せを抽出するトークン抽出部と、
前記トークンの組合せごとに、それぞれのトークンを所定規則で文字列に分割して、トークン間における文字列の組合せを抽出する文字列抽出部と、
前記文字列の組合せ同士の比較結果に応じて、前記文字列の組合せを含んだ前記トークンの組合せに含まれるトークンを要確認箇所として検出する対象箇所検出部と
を備えたソフトウェア検証装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェア開発におけるソースコードの検証を行う技術に関する。
【背景技術】
【０００２】
ソフトウェア開発において作成されるソースコードには、ソースコード間で類似する処理記述がなされた部分であるコードクローンが含まれる場合がある。このようなコードクローンは、一例として、既存のソースコードをコピーし、必要に応じて一部の文字列（例えば、識別子やリテラル等）を変更して利用することにより作成される。そして、このような方法でソースコードを作成した場合には、当該コードクローン部分において、文字列の変更ミス（例えば、変更漏れや、誤った文字列に変更してしまう場合等）が含まれることがある。
【０００３】
そこで、このようなコードクローンにおける変更ミスが発生している可能性がある対象箇所を検出する技術が複数開示されている。
第１の技術例として、ソースコードからコードクローン対を検出し、コードクローン間において対応する位置にある識別子の比較結果に基づいて、対象箇所を検出する技術が開示されている。具体的には、例えば、対応する位置にある識別子の非変化率（識別子の対応箇所において識別子が変化していない回数／識別子の対応箇所の総出現回数)が０より大きく閾値より小さい場合を、対象箇所として検出する。
また、第２の技術例として、第１の技術例における条件を満たしている場合においても、コードクローン対の一方の識別子が、もう一方において３種類以上の識別子に対応する場合には、対象箇所として検出しない技術が開示されている。
さらに、第３の技術例として、パラメータ化マッチ(p-match)を用いたコードクローン検出処理においてはクローンとして検出されないが、非パラメータ化マッチではコードクローンとして検出される識別子を、対象箇所として検出する技術が開示されている。パラメータ化マッチとは、コードクローン部分に出現する同じ識別子を同じ特別なトークンに置き換えてから、コードクローン検出を行う方法である。非パラメータ化マッチとは、コードクローン部分に出現する全ての識別子を同じ特別なトークンに置き換えてから、クローン検出を行う方法である。
【０００４】
なお、ソースコードの作成に関連する技術の他の例として、修正前後のバージョンのプログラムにおける修正前後の差分を取得し、固定の定義として予めシステムに設定した禁止修正条件を用いて誤修正の検知を行う技術が開示されている。また、他の例として、操作者が入力した文字列データを、パターン言語の学習アルゴリズムの入力として引き渡し、当該学習アルゴリズムの出力（文字列のパターン）を利用した編集を可能にする技術が開示されている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００８−２６２３３０号公報
【特許文献２】特開平１０−０７８９５１号公報
【非特許文献１】CP-Miner: Finding Copy-Paste and Related Bugs in Large-Scale Software Code”, IEEE Trans. On Software Engineering, 2006.
【非特許文献２】Token Comparison Approach to Detect Code Clone-related Bugs”, 電子情報通信学会 信学技報 SS2007-64, 2008.
【非特許文献３】Problematic Code Clones Identification using Multiple Detection Results”, APSEC2009, 2009.
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかし、前述した、コードクローンにおける変更ミスが発生している可能性がある箇所を検出する従来技術の第１の例や第２の例において、非変化率を算出するためには、検証対象とする識別子について、コードクローン間における対応箇所が少なくとも２箇所以上に出現する必要がある。このため、例えば、コードクローン間における対応箇所が１箇所しかない識別子については、従来技術を利用した変更漏れの検出を行うことができない。また、第１の例から第３の例のいずれも、識別子のみを対象としているため、他の文字列については検出対象外となる。
【０００７】
そこで、本発明の１つの態様では、ソースコードのコードクローンに含まれる変更ミスの検出精度を向上させることを目的とする。
【課題を解決するための手段】
【０００８】
本発明の１つの態様では、ソースコード間で類似する処理記述がなされた部分である複数のコードクローンが記憶された記憶部を参照し、当該複数のコードクローン間において対応する位置にそれぞれ出現するトークンの組合せを抽出する。そして、抽出したトークンの組合せごとに、それぞれのトークンを所定規則で文字列単位に分割して、トークン間における文字列の組合せを抽出する。さらに、当該文字列の組合せ同士の比較結果に応じて、当該文字列の組合せを含んだトークンの組合せに含まれるトークンを要確認箇所として検出する。
【発明の効果】
【０００９】
本発明の１つの態様によれば、ソースコードのコードクローンに含まれる変更ミスの検出精度を向上させることができる。
【図面の簡単な説明】
【００１０】
【図１】本実施形態についての概要説明で用いるクローン断片の一例を示す図である。
【図２】本実施形態におけるシステム構成の一例（第１実施例）を示す図である。
【図３】本実施形態におけるソースコード群及びクローン断片群の一例を示す図である。
【図４】本実施形態におけるトークン抽出データの一例を示す図である。
【図５】本実施形態におけるパターンテーブルの一例を示す図である。
【図６】本実施形態における分類データの一例を示す図である。
【図７】本実施形態における対象箇所データの一例を示す図である。
【図８】本実施形態におけるソフトウェア検証処理の一例を示すフローチャートである。
【図９】本実施形態におけるパターン抽出処理の一例を示すフローチャートである。
【図１０】本実施形態における対象箇所検出処理の一例を示すフローチャートである。
【図１１】本実施形態における対象箇所検出処理の一例を示すフローチャートである。
【図１２】本実施形態におけるパターン抽出処理の過程におけるデータ具体例を示す図である。
【図１３】本実施形態における差分のヒストグラムのデータ例を示す図である。
【図１４】本実施形態におけるシステム構成の一例（第２実施例）を示す図である。
【図１５】本実施形態におけるソースコード、クローン断片及び繰り返し部分群の一例を示す図である。
【図１６】本実施形態におけるソフトウェア検証処理の一例を示すフローチャートである。
【図１７】本実施形態における繰り返し部分検出処理の一例を示すフローチャートである。
【図１８】本実施形態におけるトークン置換処理後のクローン断片の一例を示す図である。
【図１９】本実施形態における距離ヒストグラムの一例を示す図である。
【図２０】本実施形態における繰り返し部分のトークン列の抽出結果の一例を示す図である。
【図２１】本実施形態におけるコンピュータのハードウェア構成の一例である。
【発明を実施するための形態】
【００１１】
［本実施形態の概要］
本実施形態では、ソースコードのコードクローンにおける変更ミス等の検出を行う技術について説明する。まず、図１を参照し、本実施形態で行う処理の概要について説明する。なお、本実施形態の以下の説明では、コードクローンを単にクローンと略して称する。また、類似するクローン群に含まれる１つ１つのクローンを、クローン断片という。
【００１２】
図１は、ソースコード群及びクローン群の一例を示す。当該クローン群は、クローン断片１、クローン断片２及びクローン断片３を含む。これらのクローン断片間においては、対応する位置に出現するトークンの組合せとして、１行目及び３行目の｛aaMm, aaNn, aaOo｝,１行目及び２行目の｛xxAa, xxBb, xxCc｝及び４行目の｛yyAa, yyBb, yyDd｝の識別子が含まれている。
【００１３】
これらの組合せのうち、例えば｛yyAa, yyBb, yyDd｝に着目すると、これらの識別子は、クローン断片のそれぞれにおいて１箇所しか出現しない。このため、例えば、従来技術で説明した第１の例や第２の例の技術を用いても、変更ミス等がある可能性がある箇所として検出されない。
【００１４】
一方、本実施形態では、一例として、｛aaMm, aaNn, aaOo｝及び｛xxAa, xxBb, xxCc｝,｛yyAa, yyBb, yyDd｝から、それぞれ共通する文字列｛aa, xx, yy｝を除いた｛Mm, Nn, Oo｝,｛Aa, Bb, Cc｝及び｛Aa, Bb, Dd｝に着目する。ここで、｛Aa, Bb, Cc｝は、それぞれのクローン断片における１行目及び２行目の２箇所で出現する。この｛Aa, Bb, Cc｝と、｛Aa, Bb, Dd｝とを比較すると、｛Aa, Bb｝が共通しているが、{Cc}及び{Dd}のみが異なっており、全体として類似しているが一部が異なっていると判別することができる。換言すれば、｛Aa, Bb, Cc｝の組合せの規則性に対し、｛Aa, Bb, Dd｝の組合せは、｛Aa, Bb｝については規則性が共通しているが、{Dd}のみが規則性を逸脱していると判別することができる。すなわち、当該{Dd}は、正しくは{Cc}であるべきではないかということが推測される。したがって、この｛Aa, Bb, Dd｝を含む｛yyAa, yyBb, yyDd｝（より具体的にはyyDd）において変更ミスがある可能性があると推測し、当該箇所を検出することができる。なお、当該具体例は識別子について説明したが、本実施形態では、同様の処理をリテラルのトークンに対しても行うことができる。
【００１５】
また、図１の例では、クローン断片間において対応するリテラルの組合せとして、２行目の｛1, 2, 3｝，３行目の｛10, 11, 10｝及び４行目の｛1, 2, 3｝が出現する。ここで、｛1, 2, 3｝は、それぞれのクローン断片における２行目及び４行目の２箇所で出現する。この｛1, 2, 3｝と、｛10, 11, 10｝とを比較すると、対応するリテラルがそれぞれ異なっているため、単に文字列として着目すると、特に規則性がないようにみえる。しかし、数字（数値）として着目すると、対応する{1}と｛10｝との差分及び{2}と｛11｝との差分がいずれも９である一方で、対応する{3}と｛10｝との差分は７である。すなわち、これらのリテラルは、クローン断片間において全体として同様の規則性で変更がなされている（バイアスがかかっている）という点で類似しているが、一部の規則性が異なっていると判別することができる。換言すれば、｛1, 2, 3｝の組合せの規則性に対し、｛10, 11, 10｝の組合せは、｛10, 11｝については規則性が共通しているが、｛3｝に対応する｛10｝のみが規則性を逸脱していると判別することができる。したがって、この｛10, 11, 10｝において変更ミス等がある可能性があると推測し、当該箇所を検出することができる。なお、当該具体例はリテラルについて説明したが、本実施形態では、同様の処理を、識別子の一部として含まれる数字に対しても行うことができる。
【００１６】
このように、本実施形態によれば、クローン部分において変更ミス等がある可能性がある箇所について、従来技術では検出できなかった箇所まで検出することができ、検出精度を向上させることができる。
【００１７】
以下、本実施形態の具体的内容について詳細に説明する。
［第１実施例］
＜システム構成＞
図２は、第１実施例におけるシステム構成の一例を示す。本システムは、ソフトウェア検証装置１を備える。ソフトウェア検証装置１はコンピュータであり、記憶手段に格納されたプログラムがソフトウェア検証装置１においてインストールされ、プロセッサによって実行されることによってその機能が実現される、クローン検出部１１、トークン抽出部１２、パターン抽出部１３、対象箇所検出部１４及び対象箇所提示部１５を備える。また、ソフトウェア検証装置１は、記憶手段において、ソースコード群２１、クローン断片群２２、トークン抽出データ２３、パターンテーブル２４、分類データ２５及び対象箇所データ２６を備える。なお、記憶手段とは、ソフトウェア検証装置１が備えた記憶手段又はソフトウェア検証装置１に接続された記憶手段のいずれであってもよく、また、ソフトウェア検証装置１による読み取りが可能な記憶媒体であってもよい。
【００１８】
クローン検出部１１は、ソースコード群２１に含まれるそれぞれのソースコードを対象に、クローン検出を行う。そして、検出した複数のクローン断片を含むクローン断片群２２を出力する。
【００１９】
トークン抽出部１２は、クローン断片群２２に含まれるクローン断片のそれぞれに含まれるトークンを先頭から順に並べたトークン抽出データ２３を生成する。そして、トークン抽出部１２は、トークン抽出データ２３から、クローン断片間において対応する位置に出現する識別子又はリテラルのトークンの組合せ（以下、本明細書において「トークンセット」という）を抽出する。
【００２０】
パターン抽出部１３は、トークンセットごとに、それぞれのトークンを所定規則で文字列単位に分割して、トークン間における文字列の組合せ（分割された文字列ごとの組合せであり、それぞれの文字列の出現パターン）及び当該パターンの出現回数等を検出する。そして、パターン抽出部１３は、各クローン断片間で対応する位置に出現するトークン間における文字列の組合せの出現回数を示すパターンテーブル２４を生成する。なお、本明細書における「文字列」は、数字を含んだ意味を有する。なお、パターン抽出部１３は、文字列抽出部の一例である。
【００２１】
対象箇所検出部１４は、パターンテーブル２４に基づき、トークンセットのトークン間における文字列の組合せを、類似するクローン断片群２２において１箇所にしか出現しない組合せと、複数箇所に出現する組合せとに分類した分類データ２５を生成する。さらに、対象箇所検出部１４は、分類データ２５に基づいて、１箇所にしか出現しない文字列の組合せと、複数箇所に出現する文字列の組合せとを比較する。そして、対象箇所検出部１４は、当該比較結果に応じて、ソースコードの変更ミスが発生している可能性の高い要確認箇所として検出し、対象箇所データ２６に格納する。
【００２２】
対象箇所提示部１５は、対象箇所データ２６を参照し、検出されたトークンを、変更ミスの要確認箇所として識別できる態様でユーザに提示する。
【００２３】
ソースコード群２１は、要確認箇所を検出する対象となる複数のソースコードの集合である。図３は、ソースコード群２１の一例であり、ソースコードＡ、ソースコードＢ、ソースコードＣ及びソースコードＤを含む。なお、各ソースコードは、１つのファイルに含まれていてもよいし、別々のファイルに含まれていてもよい。
【００２４】
クローン断片群２２は、ソースコード群２１に含まれるそれぞれのソースコードから検出された複数のクローン断片を示すデータである。図３においてそれぞれのソースコードにおいて破線で囲われた部分が、各ソースコードに含まれるクローン断片の一例であり、クローン断片Ａ、クローン断片Ｂ、クローン断片Ｃ及びクローン断片Ｄを含む。なお、クローン断片群２２のデータは、クローン断片に含まれるコード自体を保持する態様でもよいし、各ソースコードにおけるクローン断片の領域を特定する態様（例えば、ソースコードの何行目から何行目等といった情報）であってもよい。
【００２５】
トークン抽出データ２３は、トークン抽出処理によって抽出された、それぞれのソースコードのクローン断片をトークン単位で分割したデータである。図４は、トークン抽出データ２３の一例であり、クローン断片Ａ、クローン断片Ｂ、クローン断片Ｃ及びクローン断片Ｄのトークンを示している。当該トークン抽出データ２３の例では、各クローン断片において同じ位置に出現するトークンに対し、対応する識別番号を付与している。なお、本実施形態では識別子及びリテラルのトークンを処理対象とするため、当該トークン抽出データ２３も識別子及びリテラルのトークンのみを含んでいればよいが、図４では、図３に示したクローン断片との対応関係を明確にするため、識別子及びリテラル以外の文字列（必ずしもトークン単位に分割していない）も図示している。なお、図４では、識別子及びリテラルに対応する識別番号に網掛けをして図示している。
【００２６】
パターンテーブル２４は、パターン抽出処理によって抽出された、トークンセットに含まれるトークン、すなわち、各クローン断片間で対応する位置に出現するトークンにおける文字列の出現パターンが格納されるテーブルである。パターンテーブル２４は、例えば、図５に示すように、トークンセットに含まれるトークン全てにおいて共通する文字列を示す共通文字列、当該共通文字列以外の文字列を示す独自文字列、これらの共通文字列及び独自文字列のパターンの出現回数の項目を含む。
【００２７】
分類データ２５は、パターン抽出処理によって検出されたパターンに属する文字列の組合せが、各クローン断片において複数箇所に出現するか１箇所にのみ出現するかに応じて分類したデータである。分類データ２５は、例えば、図６に示すように、複数箇所に出現する文字列の組合せを要素とするmulti配列及び１箇所にのみ出現する文字列の組合せを要素とするuniq配列を含む。また、分類データ２５はさらに、文字列のうち数字のみを抽出して同様に分類したデータを含む。具体的には、分類データ２５は、同じく図６に示すように、複数箇所に出現する数字の組合せを要素とするmultiNum配列及び１箇所にのみ出現する数字の組合せを要素とするuniqNum配列を含む。
【００２８】
対象箇所データ２６は、パターン抽出部１３及び対象箇所検出部１４による処理によって検出された、要確認箇所を含むトークンを特定する情報が格納されるデータである。対象箇所データ２６は、例えば、図７に示すように、検出されたトークンの識別番号及び各クローン断片における当該トークンを含む。なお、図７に示す要確認タイプについては後述する。
【００２９】
なお、ソフトウェア検証装置１の記憶手段に格納されるデータは上記データに限定されるものではない。詳細には、上記データの他にも、処理過程において一時的に用いられる各種データ（例えばヒストグラム等）が生成されるが、図２においては図示を省略している。
【００３０】
＜要確認箇所提示処理＞
図８は、クローン検出部１１、トークン抽出部１２、パターン抽出部１３、対象箇所検出部１４及び対象箇所提示部１５が実行するソフトウェア検証処理を示す。
ステップＳ１で、クローン検出部１１は、ソースコード群２１に含まれるそれぞれのソースコードを対象に、クローン検出を実行する。クローン検出処理には、一例として、既存のクローン検出ツールであるCCFinderXを用いることができる。なお、CCFinderXの技術内容の詳細は、例えば、「CCFinder: A Multilinguistic Token-Based Code Clone Detection System for Large Scale Source Code”, IEEE Trans. On Software Engineering, Vol. 28, No. 7, 2002.」に示されている。クローン検出部１１は、類似するクローンのまとまりであるクローンセットごとに、クローン断片群２２のデータを出力する。クローン検出部１１は、例えば、クローンセットを識別するクローンセットＩＤ(ＣＩＤ)、それぞれのクローン断片が含まれるソースコード（ソースコードのファイル名）及びクローン断片の範囲を示す情報等を出力する。
【００３１】
以下のステップＳ２〜ステップＳ５は、ＣＩＤごとに実行する処理（ループ処理Ａ）である。
ステップＳ２で、トークン抽出部１２は、１つのＣＩＤに属する各クローン断片から、クローン断片それぞれに含まれる識別子及びリテラルのトークンを先頭から順に並べたトークン抽出データ２３を生成する。
ステップＳ３で、トークン抽出部１２は、トークン抽出データ２３から、クローン断片それぞれにおいて対応する位置に出現する（すなわちトークン抽出データ２３において同じ識別番号の列に属する）識別子又はリテラルのトークンセットを抽出する。
【００３２】
以下のステップＳ４は、トークンセットごとに実行する処理（ループ処理Ｂ）である。
ステップＳ４で、パターン抽出部１３は、トークンセットの各トークンにおける文字列の組合せ（文字列の出現パターン）を抽出するパターン抽出処理を実行する。パターン抽出処理の詳細については後述する。
ステップＳ５で、対象箇所検出部１４は、パターン抽出処理により抽出したパターンに基づいて、クローン断片間における各トークンの類似性や規則性を特定し、変更ミスが含まれる可能性のある要確認箇所を検出する対象箇所検出処理を実行する。対象箇所検出処理の詳細については後述する。
【００３３】
ステップＳ６で、対象箇所提示部１５は、対象箇所検出処理によって検出され生成された対象箇所データ２６を参照し、検出されたトークンを、変更ミスの要確認箇所として識別できる態様でユーザに提示する。一例として、対象箇所提示部１５は、クローン断片を含んだそれぞれのソースコードを画面表示させ、対象となるトークンの箇所をハイライト表示させる。このとき、対象箇所提示部１５は、一例として、後述する要確認タイプごとに区別可能な態様で表示してもよい。
【００３４】
図９は、パターン抽出部１３が実行するパターン抽出処理（上記ステップＳ４）を示すフローチャートである。
ステップＳ１１で、パターン抽出部１３は、トークンセットに含まれる各クローン断片のトークン全てに共通して含まれる共通文字列を格納するための集合patternsを用意する。
【００３５】
ステップＳ１２で、パターン抽出部１３は、各トークンを、camel case (単語の境界を大文字で区分する方法)とsnake case (単語の境界を‘_’で区分する方法)によって単語単位に分割する。なお、当該camel case 及びsnake caseによる分割は、所定規則で文字列単位に分割することの一例である。
【００３６】
ステップＳ１３で、パターン抽出部１３は、隣接する単語を１個以上結合した文字列(n-gram、n≧1)を生成する。このとき、パターン抽出部１３は、空白も１つの単語として扱い、１個以上の連続する数字も１つの単語として扱う。なお、１つのトークンから生成したn-gramの文字列は重複しないものとする。
【００３７】
ステップＳ１４で、パターン抽出部１３は、トークンセットから生成されたn-gramが、それぞれ何個生成されたかをカウントする。
ステップＳ１５で、パターン抽出部１３は、トークンセットのトークン数（すなわち、クローンセットに含まれるクローン断片数）と等しい個数生成されたn-gram（すなわち、トークンセットに含まれる各クローン断片のトークン全てに共通して含まれるn-gram）のうち、文字列が最も長いものを、文字列strとして選択する。
【００３８】
ステップＳ１６で、パターン抽出部１３は、文字列strが空白か否かを判定し、空白でない場合はステップＳ１７に進み（Ｎｏ）、空白である場合はステップＳ１９に進む（Ｙｅｓ）。
ステップＳ１７で、パターン抽出部１３は、文字列strを、集合patternsに追加する。
ステップＳ１８で、パターン抽出部１３は、トークンセットに含まれる各トークンにおける文字列strを、空白に置換する。パターン抽出部１３は、当該ステップＳ１８の後、再びステップＳ１２に戻って上記処理を繰り返す。
【００３９】
ステップＳ１９で、パターン抽出部１３は、上記処理の結果、トークンセットに残った文字列の組合せ(すなわち、トークンセットにおける、当該トークンセットに含まれる各クローン断片のトークン全てに共通して出現する文字列以外の文字列の組合せであり、以下、独自文字列という)と、集合patternsに含まれる文字列（トークンセットに含まれる各クローン断片のトークン全てに共通して出現する文字列であり、以下、共通文字列という）とを、パターンテーブル２４に格納する。具体的には、パターン抽出部１３は、トークンセットに残った、置換後の文字列の組合せを、パターンテーブル２４の独自文字列の項目のデータとし、集合patternsを、パターンテーブル２４の共通文字列の項目のデータとする。このとき、パターン抽出部１３は、これらの独自文字列及び共通文字列の項目のデータと同じ組合せのデータを有するレコードがパターンテーブル２４に存在しない場合には、これらの独自文字列及び共通文字列の項目のデータを含み、かつ出現回数を１とした新たなレコードを追加する。一方、パターン抽出部１３は、これらの独自文字列及び共通文字列の項目のデータと同じ組合せのデータを有するレコードがすでに存在する場合には、新たにレコードを追加することなく、当該レコードの出現回数の項目に１を加算する。
【００４０】
図１０及び図１１は、対象箇所検出部１４が実行する対象箇所検出処理（上記ステップＳ５）を示すフローチャートである。
【００４１】
ステップＳ２１で、対象箇所検出部１４は、パターン抽出処理により検出された、トークンセットに含まれる文字列の出現パターンを、クローン断片全体における出現回数に応じて分類する。具体的には、対象箇所検出部１４は、それぞれのパターンにおける独自文字列を、複数箇所のトークンセットにおいて出現する場合（multi）と、１箇所のトークンセットにおいてのみ出現する場合（uniq）に分類する。ただし、対象箇所検出部１４は、独自文字列が存在せず共通文字列しか存在しないパターンについては、共通文字列を独自文字列として用いて、当該分類を行う。より具体的には、対象箇所検出部１４は、パターンテーブル２４を参照して、独自文字列が同一のレコードを抽出し、その出現回数を合算する。このとき、独自文字列が無いレコードについては、共通文字列をクローン断片の数だけ展開した文字列の組合せが独自文字列であるものとして処理を行う。そして、出現回数が複数回である独自文字列を抽出し、分類データ２５のmulti配列に格納する。一方、対象箇所検出部１４は、出現回数が１回の独自文字列を抽出し、分類データ２５のuniq配列に格納する。
【００４２】
ステップＳ２２で、対象箇所検出部１４は、独自文字列から数字のみを抽出した独自文字列をさらに生成し、上記ステップＳ２１の処理と同様の処理を、当該数字のみが含まれる独自文字列を対象として行う。具体的には、対象箇所検出部１４は、数字のみを含む独自文字列が、複数箇所のトークンセットにおいて出現する場合（multiNum）と、１箇所のトークンセットにおいてのみ出現する場合（uniqNum）に分類する。より具体的には、対象箇所検出部１４は、パターンテーブル２４を参照して、数字のみを抽出した独自文字列が同一のレコードを抽出し、その出現回数を合算する。そして、出現回数が複数回である数字のみの独自文字列を抽出し、分類データ２５のmultiNum配列に格納する。一方、対象箇所検出部１４は、出現回数が１回の数字のみの独自文字列を抽出し、分類データ２５のuniqNum配列に格納する。独自文字列が存在しない場合の処理は上記ステップＳ２１と同様である。
【００４３】
以下のステップＳ２３〜ステップＳ２５は、uniq配列に含まれる文字列の組合せごと（uniq配列の１要素ごと）に実行する処理（ループ処理Ｃ）である。また、当該ステップＳ２３〜ステップＳ２５は、当該ループ処理の中で、さらに、multi配列に含まれる文字列の組合せごと（multi配列の１要素ごと）に実行する処理（ループ処理Ｄ）である。
【００４４】
ステップＳ２３で、対象箇所検出部１４は、multi配列の文字列の組合せに含まれるそれぞれの文字列と、uniq配列の文字列の組合せに含まれるそれぞれの文字列とを、先頭から文字単位で比較し、文字列の組合せ同士が類似している度合を示す値を算出する。具体的には、対象箇所検出部１４は、まず、これらの文字列間において、同じ文字数countと異なる文字数diffを求める。
【００４５】
ステップＳ２４で、対象箇所検出部１４は、異なる文字数diffが0より大きく、かつ、同じ文字数count及び異なる文字数diffの和で同じ文字数countを除した値が所定閾値以上（count／(count＋diff) ≧ 閾値）であるか否かを判定する。なお、所定閾値は、例えばクローン断片の数等に応じて、予め任意に設定することができる。当該条件に該当する場合とは、すなわち、multi配列の文字列の組合せに含まれるそれぞれの文字列と、uniq配列の文字列の組合せに含まれるそれぞれの文字列とが一致しないが、ある程度以上類似している場合を意味する。このような場合とは、さらに換言すれば、各クローン断片間において１つの箇所のトークンセットにしか存在しない文字列の組合せが、複数箇所のトークンセットにおける文字列の組合せと少しだけ異なっている場合を意味する。これはすなわち、当該１つの箇所のトークンセットに含まれるいずれかのトークンにおいて、文字列の変更ミスが発生している可能性があることを示している。上記条件に該当する場合にはステップＳ２５に進み（Ｙｅｓ）、当該条件に該当しない場合には、次のmulti配列の要素を処理対象とする処理を行う（Ｎｏ）。
【００４６】
ステップＳ２５で、対象箇所検出部１４は、multi配列の文字列の組合せに含まれるそれぞれの文字列と、uniq配列の文字列の組合せに含まれるそれぞれの文字列とがある程度以上類似しているが一致しないと判別し、uniq配列の対象の文字列の組合せが含まれるトークンセットを特定する。そして、対象箇所検出部１４は、特定したトークンセットを識別できる情報の一例として、ソースコードにおける位置を示す情報を対象箇所データ２６に格納する。
【００４７】
以下のステップＳ２６〜ステップＳ３０は、uniqNum配列に含まれる文字列の組合せごと（uniqNum配列の要素ごと）に実行する処理（ループ処理Ｅ）である。また、当該ステップＳ２６〜ステップＳ３０は、当該ループ処理の中で、さらに、multiNum配列に含まれる文字列の組合せごと（multiNum配列の要素ごと）に実行する処理（ループ処理Ｆ）である。
【００４８】
ステップＳ２６で、対象箇所検出部１４は、multiNum配列の数字の組合せに含まれるそれぞれの数字と、uniqNum配列の数字の組合せに含まれるそれぞれの数字との差分を算出し、差分のヒストグラムを生成する。差分のヒストグラムは、差分の値と、当該差分の値となった数字の個数とを示す。
【００４９】
ステップＳ２７で、対象箇所検出部１４は、生成したヒストグラムにおいて、同一の差分となった数字の個数が差分が０以外の数字の個数に占める割合を示す値が所定閾値以上であるか否かを判定する。より具体的には、対象箇所検出部１４は、最も多い個数となった差分の値が０以外で、かつ、同一の差分の値となった数字の個数のうち最も多い個数を、uniqNum配列の数字とmultiNum配列の数字とで値が異なっている（差分が０以外の）個数で除した値が所定閾値以上（(同一の差分で最も多い個数) / (uniqNum配列の数字とmultiNum配列の数字とで値が異なっている個数) ≧ 閾値）であるか否かを判定する。なお、所定閾値は、上記のステップＳ２４で用いた閾値と同様に、予め任意に設定することができ、ステップＳ２４で用いた閾値と同一の値でも異なる値でもよい。当該条件に該当する場合とは、すなわち、multiNum配列の数字の組合せに含まれるそれぞれの数字と、uniqNum配列の数字の組合せに含まれるそれぞれの数字との多くの差分が一致するが、両者の数字が異なっている場合を意味する。このような場合とは、さらに換言すれば、各クローン断片間において１つの箇所のトークンセットにしか存在しない数字の組合せが、複数箇所のトークンセットにおける数字の組合せに対してほぼ一様にバイアスがかかっているが異なっている場合を意味する。これはすなわち、当該１つの箇所のトークンセットに含まれるいずれかのトークンにおいて、ソースコードの変更ミスが発生している可能性があることを示している。上記条件に該当する場合にはステップＳ２８に進み（Ｙｅｓ）、当該条件に該当しない場合にはステップＳ２９に進む（Ｎｏ）。
【００５０】
ステップＳ２８で、対象箇所検出部１４は、uniqNum配列の数字はmultiNum配列の数字に対してほぼ一様にバイアスがかかっているが異なっているものと判別し、uniqNum配列の数字の組合せが含まれるトークンセットを特定する。そして、対象箇所検出部１４は、特定したトークンセットを識別する情報の一例として、ソースコードにおける位置を示す情報を対象箇所データ２６に格納する。
【００５１】
ステップＳ２９で、対象箇所検出部１４は、生成したヒストグラムにおいて、最も多い個数となった差分の値が０で、かつ、uniqNum配列の数字とmultiNum配列の数字とで異なる数字が１個のみ存在する否かを判定する。当該条件に該当する場合とは、すなわち、multiNum配列の数字の組合せに含まれるそれぞれの数字と、uniqNum配列の数字の組合せに含まれるそれぞれの数字とがほぼ一致するが１箇所のみ異なるということを意味する。このような場合とは、さらに換言すれば、各クローン断片間において１つの箇所のトークンセットにしか存在しない数字の組合せが、複数箇所のトークンセットにおける数字の組合せに対して１箇所のみ異なっている場合を意味する。これはすなわち、当該１つの箇所のトークンセットに含まれるいずれかのトークンにおいて、ソースコードの変更ミスが発生している可能性があることを示している。上記条件に該当する場合にはステップＳ３０に進み（Ｙｅｓ）、当該条件に該当しない場合には、次のmultiNum配列の要素を処理対象とする処理を行う（Ｎｏ）。
【００５２】
ステップＳ３０で、対象箇所検出部１４は、multiNum配列の数字の組合せに含まれるそれぞれの数字と、uniqNum配列の数字の組合せに含まれるそれぞれの数字とがほぼ一致するが１箇所のみ異なると識別し、uniqNum配列の数字の組合せが含まれるトークンセットを特定する。そして、対象箇所検出部１４は、特定したトークンセットを識別する情報の一例として、ソースコードにおける位置を示す情報を対象箇所データ２６に格納する。
【００５３】
＜データ具体例を用いた処理説明＞
上記のソフトウェア検証装置１における処理について、図３〜図７及び図１２〜図１３に示すデータ具体例を用いて説明する。なお、当該具体例における所定閾値は０．７５とする。
【００５４】
ステップＳ１で、クローン検出部１１は、図３に示すソースコードＡ、ソースコードＢ、ソースコードＣ及びソースコードＤを含む全てのソースコード群２１に対し、前述したCCFinderXを用いて非パラメータ化マッチ（非p-match）でクローン検出を実行する。その結果、１つのＣＩＤに属するクローン断片として、図３において破線内部に示されているクローン断片Ａ、クローン断片Ｂ、クローン断片Ｃ及びクローン断片Ｄが検出されたものとする。
【００５５】
ステップＳ２で、トークン抽出部１２は、クローン断片Ａ、クローン断片Ｂ、クローン断片Ｃ及びクローン断片Ｄから、図４に示すトークン抽出データ２３を生成する。なお、このときトークン抽出部１２は、CCFinderXが生成するトークンのデータを利用することができる。
【００５６】
ステップＳ３で、トークン抽出部１２は、図４のトークン抽出データ２３から、クローン断片それぞれにおいて同じ位置に出現する識別子又はリテラルのトークンを示すトークンセットを抽出する。例えば、識別番号が「３」の列からは、トークンセット｛Box, Box, Ellipse, Ellipse｝が抽出される。また、識別番号が「１３」の列からは、トークンセット｛getHeight5mOk, getHeight4mOk, getHeight3mOk, getHeight2mOk｝が得られる。この識別番号が「１３」の列のトークンセットの例を、図１２（Ａ）に示している。
【００５７】
以下、ステップＳ４（ステップＳ１１〜Ｓ１９）のパターン抽出処理について、図１２（Ａ）に示した識別番号が「１３」の列のトークンセットの具体例を用いて説明する。
【００５８】
〔ステップＳ１２〜ステップＳ１８の繰り返し１回目〕
ステップＳ１２で、パターン抽出部１３は、当該トークンセットの１つ目の（クローン断片Ａの）要素である「getHeight5mOk」をcamel caseによって単語に分割する。その結果、「get, Height, 5, m, Ok」が得られる。
ステップＳ１３で、パターン抽出部１３は、この「get, Height, 5, m, Ok」を組み合わせたn-gram (n≧1)として「get, getHeight, getHeight5, getHeight5m, getHeight5mOk, Height, Height5, Height5m, Height5mOk, 5, 5m, 5mOk, m, mOk, Ok」を生成する。同様の処理を、他の３つの要素である「getHeight4mOk」、「getHeight3mOk」及び「getHeight2mOk」についても実行する。
【００５９】
ステップＳ１４で、パターン抽出部１３は、当該トークンセットの４つの要素において、それぞれのn-gramが何個生成されたかをカウントする。カウントの結果は、「mOk, getHeight, get, Height, m, Ok」のn-gramがそれぞれ４個であり、その他のn-gramがそれぞれ１個である。
ステップＳ１５で、パターン抽出部１３は、トークンセットの要素数である４個生成されたn-gramである「mOk, getHeight, get, Height, m, Ok」のうち、一番長い文字列である「getHeight」を文字列strとして選択する。
【００６０】
ステップＳ１６で、パターン抽出部１３は、文字列strの「getHeight」が空白でないため、ステップＳ１７で、集合patternsに当該「getHeight」を追加する。
ステップＳ１７で、パターン抽出部１３は、トークンセットの各トークンにおける「getHeight」を空白に置き換える。その結果、当該トークンセットは、{□5mOk, □4mOk, □3mOk, □2mOk}となる。但し、□は空白を表すものとする。なお、この段階での集合patterns及びトークンセットの状態を、図１２（Ｂ）に示す。
【００６１】
〔ステップＳ１２〜ステップＳ１８の繰り返し２回目〕
ステップＳ１２で、パターン抽出部１３は、当該トークンセットの１つ目の（クローン断片Ａの）要素である「□5mOk」をcamel caseによって単語に分割する。その結果、「□, 5, m, Ok」が得られる。
ステップＳ１３で、パターン抽出部１３は、この「□, 5, m, Ok」を組み合わせたn-gram (n≧1)として「□, □5, □5m, □5mOk, 5, 5m, 5mOk, m, mOk, Ok」を生成する。同様の処理を、他の３つの要素である「□4mOk」、「□3mOk」及び「□2mOk」についても実行する。
【００６２】
ステップＳ１４で、パターン抽出部１３は、当該トークンセットの４つの要素において、それぞれのn-gramが何個生成されたかをカウントする。カウントの結果は、「mOk, m, Ok」のn-gramがそれぞれ４個であり、その他のn-gramがそれぞれ１個である。
ステップＳ１５で、パターン抽出部１３は、トークンセットの要素数である４個生成されたn-gramである「mOk, m, Ok」のうち、一番長い文字列である「mOk」を文字列strとして選択する。
【００６３】
ステップＳ１６で、パターン抽出部１３は、文字列strの「mOk」が空白でないため、ステップＳ１７で、集合patternsに当該「mOk」を追加する。
ステップＳ１８で、パターン抽出部１３は、トークンセットの各トークンにおける「mOk」を空白に置き換える。その結果、当該トークンセットは、{□5□, □4□, □3□, □2□}となる。なお、この段階での集合patterns及びトークンセットの状態を、図１２（Ｃ）に示す。
【００６４】
〔ステップＳ１２〜ステップＳ１８の繰り返し３回目〕
上記と同様の処理により、パターン抽出部１３は、ステップＳ１２〜ステップＳ１４の処理を経て、「□（空白）」を文字列strとして選択する。その結果、ステップＳ１６で、パターン抽出部１３は、文字列strの「mOk」が空白でないため、ステップＳ１９に進む。
ステップＳ１９で、パターン抽出部１３は、集合patternsである｛getHeight, mOk｝及びトークンセット｛5, 4, 3, 2｝を、パターンテーブル２４に格納する。具体的には、出現回数を１とし、共通文字列の項目に｛getHeight, mOk｝を、独自文字列の項目に｛5, 4, 3, 2｝を設定したレコードをパターンテーブル２４に追加する。
他のトークンセットについても同様の処理をした結果、図５に示すパターンテーブル２４が生成される。
【００６５】
次に、ステップＳ５（ステップＳ２１〜Ｓ２９）の対象箇所検出処理について説明する。
ステップＳ２１で、対象箇所検出部１４は、図５に示すパターンテーブル２４を参照して、複数回出現する独自文字列を抽出し、出現回数に応じて図６に示す分類データ２５のmulti配列又はuniq配列に格納する。例えば、独自文字列の｛box, box, ell, ell｝は、共通文字列が｛1｝のパターンの出現回数が６回と、共通文字列が｛2｝のパターンの出現回数が３回の計９回出現するので、multi配列に格納する。また、例えば、図５に示すパターンテーブル２４において、共通文字列が｛1｝、独自文字列がなしのパターンの出現回数が４回である。この場合は、対象箇所検出部１４は、共通文字列をクローン断片の数である４個展開した文字列の集合｛1, 1, 1, 1｝を、multi配列に格納する。一方、対象箇所検出部１４は、例えば、独自文字列の｛4, 4, 2, 1｝等は、出現回数が１回であるため、図６に示す分類データ２５のuniq配列に格納する。また、例えば、共通文字列が｛validateWidth｝、独自文字列がなしのパターンも、出現回数が１回である。この場合は、対象箇所検出部１４は、共通文字列をクローン断片の数である４個展開した文字列の組合せ｛validateWidth, validateWidth, validateWidth, validateWidth｝を、uniq配列に格納する。
【００６６】
ステップＳ２２で、対象箇所検出部１４は、図５に示すパターンテーブル２４を参照して、独自文字列から数字のみを抽出した独自文字列をさらに生成し、出現回数に応じて図６に示す分類データ２５のmultiNum配列又はuniqNum配列に格納する。例えば、独自文字列の｛5, 4, 3, 2｝は、出現回数が合計２回なので、multi配列に格納する。また、例えば、独自文字列｛Height4, Width4, Border2, Padding1｝に含まれる数字を抽出すると(4, 4, 2, 1)になり、出現回数が１回なので、uniqNum配列に格納する。
【００６７】
ステップＳ２３で、対象箇所検出部１４は、図６に示すmulti配列の各要素に含まれるそれぞれの文字列と、uniq配列の各要素に含まれるそれぞれの文字列とを、先頭から文字単位で比較し、同じ文字数countと異なる文字数diffを求める。例えば、uniq配列の処理対象の要素が｛Height4, Width4, Border2, Padding1｝で、multi配列の処理対象の要素が｛box, box, ell, ell｝である場合、次のようになる。すなわち、対象箇所検出部１４は、要素に含まれる対応する文字列同士（Height4とbox、Width4とbox、Border2とell、Padding1とell）を、先頭から文字単位で比較する。この場合、diff=28、count=0であり、0/(0+28)=0は閾値よりも小さい。このため、対象箇所検出部１４は、ステップＳ２４で、両者が類似していないと判定する。
【００６８】
一方、例えば、uniq配列の処理対象の文字列の組合せが｛Height, Width, Border, Paddng｝で、multi配列の処理対象の文字列の組合せが｛Height, Width, Border, Padding｝の場合、diff=3、count=21であり、21/(21+3)=0.875は閾値以上となる。このため、対象箇所検出部１４は、ステップＳ２４で、両者が一致しないがある程度以上類似していると判定する。そして、ステップＳ２５で、対象箇所検出部１４は、パターンテーブル２４を参照して、当該uniq配列の｛Height, Width, Border, Paddng｝が含まれるトークンの識別番号である「３９」を特定し、これらの情報を、図７に示すように対象箇所データ２６に格納する。ここで、対象箇所検出部１４は、当該格納したデータを、例えば「要確認タイプＡ」とし、後述するステップＳ２８及びステップＳ３０で格納するデータと区別可能にする。
上記と同様の処理を、ループ処理Ｃ及びループ処理Ｄにより、他の文字列の組合せについても行った後、ステップＳ２６に進む。
【００６９】
ステップＳ２６で、対象箇所検出部１４は、multiNum配列の数字の組合せに含まれるそれぞれの数字と、uniqNum配列の数字の組合せに含まれるそれぞれの数字との差分を算出し、図１３に示す差分のヒストグラムを生成する。例えば、uniqNum配列の｛4, 4, 2, 1｝及びmultiNum配列の｛5, 4, 3, 2｝を処理対象とする場合、それぞれの差分は、4-5=-1、4-4=0、2-3=-1、1-2=-1となり、差分が-1の個数が３個、差分が0の個数が１個となる。この場合、同一の差分で最も多い個数が3で、uniqNum配列の数字とmultiNum配列の数字とで値が異なっている個数が3であり、3/3 ≧ 閾値 を満たす。このため、対象箇所検出部１４は、ステップＳ２７において、条件を満たしていると判定する。そして、ステップＳ２８で、対象箇所検出部１４は、両者について、ほぼ一様にバイアスがかかっているが異なっていると識別し、パターンテーブル２４を参照して、当該uniqNum配列の｛4, 4, 2, 1｝が含まれるトークンの識別番号である「３１」を特定する。そして、対象箇所検出部１４は、これらの情報を、図７に示すように対象箇所データ２６に格納する。ここで、対象箇所検出部１４は、当該格納したデータを、例えば「要確認タイプＢ」とし、ステップＳ２５及び後述するステップＳ３０で格納するデータと区別可能にする。
【００７０】
一方、例えば、uniqNum配列の｛5, 4, 3, 1｝及びmultiNum配列の｛5, 4, 3, 2｝を処理対象とする場合、それぞれの差分は、5-5=0、4-4=0、3-3=0、1-2=-1となり、差分が-1の個数が３個、差分が-1の個数が１個となる。この場合、最も多い個数の差分が０であるため、ステップＳ２７の条件を満たさない。しかし、両者の数字の組合せにおいて｛1｝と｛2｝のみが異なるため、ステップＳ２９の条件を満たす。このため、ステップＳ３０で、対象箇所検出部１４は、両者がほぼ一致するが１箇所のみ異なると識別し、パターンテーブル２４を参照して、当該uniqNum配列の｛5, 4, 3, 1｝が含まれるトークンの識別番号である「４９」を特定する。そして、対象箇所検出部１４は、これらの情報を、図７に示すように対象箇所データ２６に格納する。ここで、対象箇所検出部１４は、当該格納したデータを、例えば「要確認タイプＣ」とし、ステップＳ２５及びステップＳ２８で格納するデータと区別可能にする。
上記と同様の処理を、ループ処理Ｅ及びループ処理Ｆにより、他の数字の組合せについても行う。
【００７１】
そして、ステップＳ６において、対象箇所提示部１５は、対象箇所データ２６に格納されたトークンを示す情報をユーザに提示する。一例として、対象箇所提示部１５は、図３に示したソースコードＡ〜ソースコードＤを画面に並べて表示させ、対象となるトークンの箇所をそれぞれハイライト表示させるようにしてもよい。その際、例えば、上記ステップＳ２５、ステップＳ２８及びステップＳ３０のいずれの処理によって格納されたデータであるかを区別可能に（例えば色分けする等によって）表示させてもよい。
【００７２】
＜本実施例における効果等＞
本実施例では、前述した処理により、次のような効果を奏する。すなわち、前述したように、クローン断片は、あるソースコードの部分をコピーして他のソースコードにおいてペーストし、必要に応じて一部変更することによって生成されたものであることが多い。そして、本実施例では、クローン断片間において対応する位置に出現するトークンの組合せについて、それぞれのトークンを、所定規則で文字列単位に分割する。そして、クローン断片間において対応する位置に出現するトークンセットに含まれる文字列の組合せと、他のトークンセットに含まれる文字列の組合せとを比較する。これにより、トークンセット同士としては類似していない場合でも、前述した対象箇所の検出処理において、文字列同士が類似しているが一致していないことを検出することができる。すなわち、本実施例によれば、トークン単位でみれば一見類似していない場合であっても、前述した対象箇所の検出処理において比較対象とし、類似した規則性を有する文字列を検出することが可能となる。そして、このように検出された箇所においては、当該トークンセットにおいて文字列の変更ミスが発生していることが推測される。このため、本実施例によれば、変更ミスが発生している可能性がある箇所を検出する際の精度を向上させることができる。
【００７３】
このような効果は、一例として、業務アプリケーションのソースコードの検証において特に有効であると考えられる。業務アプリケーションのソースコードには、一般的なオープンソースソフトウェア等よりも、クローン部分が多く含まれる可能性がある。業務には類似処理が多く含まれるため、類似する一連の処理を記述するのに、雛形を参照しながら一部を変更するなど、クローン部分の生成を意図的に許容している場合があるからである。そして、業務アプリケーションのソースコードでは、英数字が組み合わさった長い名前の変数が使われ、クローン部分を生成するときには、その変数に含まれる文字列の複数箇所を変更することもある(例えばKCA006_UrSupMemKbnとKCA008_UrSubMemKbnなど)。このような変数における変更ミスの有無の検証において、変数に含まれる文字列単位の比較により上記の検証処理を行うことは、変数単位の比較による検証処理よりも、精度の向上が顕著となる可能性が高い。
【００７４】
また、本実施例では、独自文字列を特定し、当該独自文字列を対象としてトークン間の文字列の組合せを抽出する。これにより、共通文字列が異なるトークンセット同士であってトークン単位でみれば一見類似していない場合であっても、前述した対象箇所の検出処理において比較対象とし、類似しているが一致していない文字列を検出することが可能となる。
【００７５】
また、本実施例では、uniq配列の要素である文字列の組合せと、multi配列の要素である文字列の組合せとの比較結果によって、両者が類似しているが一致していないときに、uniq配列の要素である文字列の組合せを含むトークンセットを検出している。これにより、複数箇所に出現する文字列の組合せが信頼性が高いと推定し、１つの箇所にしか出現しない文字列の組合せを、要確認箇所として検出することを実現している。
【００７６】
また、本実施例では、数字の組合せ同士については、対応する数字同士の差分に基づいて対象箇所の検出処理を行うことで、次のような効果を奏する。すなわち、本実施例では、数字そのものが類似していない場合であっても、数字の組合せ同士の規則性が類似しており、かつ、一部の数字の規則性が異なる場合を検出することができる。これにより、変更ミスが発生している可能性がある箇所の検出精度をさらに向上させることができる。
【００７７】
また、本実施例では、ステップＳ２５、ステップＳ２８及びステップＳ３０でそれぞれ検出したトークンセットを、区別可能な態様で提示することができる。これにより、どのように変更ミスが生じているかの内訳をユーザが把握できるようになり、より検証作業の効率化を図ることができる。
【００７８】
また、本実施例で処理対象とするトークンには、ソースコードのクローンにおいて変更する可能性のある識別子及びリテラルの両方を含めることができる。このため、従来技術よりも、検証対象を広げることができ、変更ミスが発生している可能性がある箇所の検出精度をさらに向上させることができる。
【００７９】
［第２実施例］
第２実施例では、第１実施例に加え、さらに、１つのソースコードのクローン断片の内部において、類似する処理記述が繰り返して出現する繰り返し部分を検出する。このような繰り返し部分も、クローン断片と同様に、ソースコードの一部分をコピーしてペーストし、必要に応じて一部変更して利用するという作業によって生成される可能性が高い。なお、一例として、if構文やループ処理の記述において、このような繰り返し部分が多く発生する傾向にある。第２実施例では、当該繰り返し部分においてソースコードの変更ミスが発生している可能性がある箇所を検出する。なお、第１実施例と同様の内容については、原則として説明を省略する。
【００８０】
＜システム構成＞
図１４は、第２実施例におけるシステム構成の一例を示す。第１実施例に加え、第２実施例では、さらに、繰り返し部分検出部１６及び繰り返し部分群２７を備える。
繰り返し部分検出部１６は、クローン断片において類似する処理記述がなされた複数の繰り返し部分を検出する。
【００８１】
繰り返し部分群２７は、繰り返し部分検出部１６によってソースコードのクローン断片から抽出された繰り返し部分を示すデータである。図１５に、繰り返し部分群２７の一例を示す。図１５に示すソースコードにおいてそれぞれ破線で囲われた部分が、クローン断片に含まれる繰り返し部分群２７の一例である。なお、繰り返し部分群２７のデータは、繰り返し部分に含まれるコード自体を保持する態様でもよいし、各クローン断片における繰り返し部分の領域を特定する態様（例えば、ソースコードの何行目から何行目等といった情報）であってもよい。
【００８２】
なお、第１実施例と同様に、ソフトウェア検証装置１の記憶手段に格納されるデータは上記データに限定されるものではない。詳細には、上記データの他にも、処理過程において一時的に用いられる各種データ（例えば後述する距離ヒストグラム等）が生成されるが、図１４においては図示を省略している。
【００８３】
＜要確認箇所提示処理＞
図１６は、第２実施例において、クローン検出部１１、トークン抽出部１２、パターン抽出部１３、対象箇所検出部１４、対象箇所提示部１５及び繰り返し部分検出部１６が実行するソフトウェア検証処理の一例を示す。なお、第２実施例におけるソフトウェア検証処理は、ステップＳ６までが第１実施例と同一であるため、図示及び説明を省略する。図１６に示すステップＳ１０７以降の処理は、図８に示したステップＳ６に続いて実行される処理である。
【００８４】
以下のステップＳ１０７〜ステップＳ１１２は、ファイルごとに実行する処理（ループ処理Ｇ）である。
ステップＳ１０７で、繰り返し部分検出部１６は、１つのファイルに含まれるソースコードから検出されたクローン断片のうち、範囲が隣接又は重複するクローン断片があれば、それらのクローン断片を結合して、１つのクローン断片とする。
【００８５】
以下のステップＳ１０８〜ステップＳ１１２は、クローン断片ごとに実行する処理（ループ処理Ｈ）である。
ステップＳ１０８で、繰り返し部分検出部１６は、クローン断片に含まれる繰り返し部分を検出する繰り返し部分検出処理を実行する。繰り返し部分検出処理の詳細については後述する。
ステップＳ１０９で、トークン抽出部１２は、トークン抽出データ２３から、繰り返し部分検出処理によって抽出された繰り返し部分それぞれにおいて対応する位置に出現する（すなわちトークン抽出データ２３において同じ識別番号の列に属する）識別子又はリテラルのトークンを示すトークンセットを抽出する。
【００８６】
以下のステップＳ１１１は、トークンセットごとに実行する処理（ループ処理Ｉ）である。
ステップＳ１１１で、パターン抽出部１３は、トークンセットの各トークンにおける文字列の組合せ（文字列の出現パターン）を抽出するパターン抽出処理を実行する。パターン抽出処理の詳細は、第１実施例と同様である。
ステップＳ１１２で、対象箇所検出部１４は、パターン抽出処理により抽出したパターンに基づいて、クローン断片間における各トークンの類似性を計算し、類似しているが同一ではないトークンを検出する対象箇所検出処理を実行する。対象箇所検出処理の詳細は、第１実施例と同様である。
【００８７】
ステップＳ１１３で、対象箇所提示部１５は、対象箇所検出処理によって検出され生成された対象箇所データ２６を参照し、検出されたトークンを、変更ミスの要確認箇所として識別できる態様でユーザに提示する。このとき、例えば、第２実施例における対象箇所検出処理によって生成された対象箇所データ２６については、第１実施例で検出した生成された対象箇所データ２６と区別可能な態様でユーザに提示してもよい。
【００８８】
図１７は、繰り返し部分検出部１６が実行する繰り返し部分検出処理（上記ステップＳ１０８）を示すフローチャートである。
ステップＳ１２１で、繰り返し部分検出部１６は、処理対象のクローン断片に含まれるトークンのうち、プログラムの予約語の一部と句読点の一部のみを残し、その他を “” に置換する。例えば、ソースコードがJava（登録商標）で記載されている場合、例えば “(){}[];:.=” や “if” 等を残し、残りを  “” に置換する。
【００８９】
以下のステップＳ１２２〜ステップＳ１２３は、任意の所定回数であるｎ回実行する処理（ループ処理Ｊ）である。
ステップＳ１２２で、繰り返し部分検出部１６は、乱数によって開始位置（pos）を生成する。
ステップＳ１２３で、繰り返し部分検出部１６は、ステップＳ１２１による置換処理後のクローン断片において、開始位置（pos）から始まる任意の長さの部分トークン列を特定する。そして、繰り返し部分検出部１６は、クローン断片に含まれる、当該部分トークン列と一致するトークン列を検出する。さらに、繰り返し部分検出部１６は、開始位置（pos）と、検出されたトークン列の開始位置(i)との距離(|pos-i|)のヒストグラムを生成する。
【００９０】
ステップＳ１２４で、繰り返し部分検出部１６は、ステップＳ１２３で生成されたヒストグラムにおける、距離(|pos-i|)ごとの検出回数が所定閾値（例えばn/2）よりも大きい距離を、繰り返し部分の長さの候補（divLen）とする。当該候補は、複数存在する場合がある。ただし、距離が０の場合は、部分トークン列自体の検出回数となるため、候補から除くものとする。
【００９１】
以下のステップＳ１２５〜ステップＳ１２７は、繰り返し部分の長さの候補（divLen）ごとに実行する処理（ループ処理Ｋ）である。
ステップＳ１２５で、繰り返し部分検出部１６は、ステップＳ１２１による置換処理後のクローン断片において、開始位置を先頭から順にずらしながら、繰り返し部分の長さの候補(divLen)ごとにトークン列を繰り返し抽出する。そして、開始位置ごとに、抽出したそれぞれのトークン列に含まれるトークンが全て同じタイプ（例えば、予約後の種別や記号の種別等）であった回数(count1)をカウントする。
【００９２】
ステップＳ１２６で、繰り返し部分検出部１６は、ステップＳ１２１による置換処理前のクローン断片において、ステップＳ１２５でカウントした回数(count1)が最も大きかった開始位置から、繰り返し部分の長さの候補（divLen）ごとにトークン列を繰り返し抽出する。ただし、繰り返し部分検出部１６は、クローン断片からトークン列を繰り返し抽出した結果、クローン断片の末尾付近において残りのトークン列の長さが繰り返し部分の長さの候補（divLen）に対して不足している場合は、不足部分に空白を補ったトークン列を抽出する。
【００９３】
ステップＳ１２７で、繰り返し部分検出部１６は、抽出したトークン列全体において、空白以外のトークン数（count2）をカウントする。
ステップＳ１２８で、繰り返し部分検出部１６は、ステップＳ１２７でカウントした空白以外のトークン数（count2）が最も多い繰り返し部分の長さの候補（divLen）のうち、最も短い長さを選択する。そして、繰り返し部分検出部１６は、選択した長さで繰り返し抽出したトークン列を、繰り返し部分とする。なお、ここで最も短い長さ、すなわち、最も小さい単位の繰り返し部分を選択するのは、パターン抽出処理や対象箇所検出処理を行う際に、処理対象とする繰り返し部分の数が多い方が、要確認箇所を検出する精度が向上するからである。
【００９４】
＜データ具体例を用いた処理説明＞
上記の第２実施例における処理のうち、繰り返し部分検出処理について、図１５及び図１８〜図２０に示すデータ具体例を用いて説明する。当該具体例では、ステップＳ１０７において、CCFinderXが出力する情報に基づいて範囲が隣接又は重複するクローン断片を結合した結果の１つのクローン断片が、図１５に示すソースコードにおいて破線で囲われた部分であるとする。
【００９５】
以下、ステップＳ１０８（ステップＳ１２１〜Ｓ１２８）の繰り返し部分検出処理について、図１５に示すクローン断片の具体例を用いて説明する。
ステップＳ１２１で、繰り返し部分検出部１６は、図１５に示すクローン断片に含まれるトークンのうち、“(){}[];:.=” と “if” 以外を “” に置換する。図１８は、当該置換処理後のクローン断片を示す。なお、図１８では、見易さのために途中で改行を行なっているが、実際のデータには改行は含まれていない。なお、CCFinderXは “length()” を特殊扱いして１個のトークンとして出力するため、 “length()”は１個の “” に置換されている。
ステップＳ１２２で、繰り返し部分検出部１６は、乱数によって開始位置（pos）を１０個生成する。これにより、開始位置（pos）が、例えば18, 54, 36, 22, 8, 111, 9, 78, 109, 104で生成されたとする。
【００９６】
ステップＳ１２３で、繰り返し部分検出部１６は、ステップＳ１２１による置換処理後のクローン断片において、当該１０個の開始位置（pos）のそれぞれから始まる１０トークン分の部分トークン列を特定する。そして、繰り返し部分検出部１６は、クローン断片に含まれる、当該部分トークン列と一致するトークン列を検出し、開始位置（pos）と、検出されたトークン列の開始位置(i)との距離(|pos-i|)の距離ヒストグラムを生成する。なお、図１５及び図１８に示した具体例の場合、トークン列全体の長さが１１２である。このため、開始位置（pos）が104、109、111の場合は、部分トークン列が１０トークンに満たない。このような場合は、当該部分トークン列と一致するトークン列の検出は行なわない。
【００９７】
図１９は、当該ステップＳ１２３で生成される距離ヒストグラムを示す。当該ヒストグラムにおける、０以外の距離(|pos-i|)ごとの検出回数は、距離「２８」が９回、距離「５６」が６回、距離「８４」が３回である。ここで、ステップＳ１２４における所定閾値を10/2=5とするとき、繰り返し部分検出部１６は、当該閾値より検出回数の大きい距離である「２８」及び「５６」を、繰り返し部分の長さの候補（divLen）とする。
【００９８】
〔ステップＳ１２５〜ステップＳ１２７の繰り返し１回目（divLen=２８）〕
ステップＳ１２５で、繰り返し部分検出部１６は、図１８のクローン断片において、開始位置を先頭から順にずらしながら、２８個分のトークン列を繰り返し抽出する。そして、開始位置ごとに、抽出したそれぞれのトークン列に含まれるトークンが全て同じタイプであった回数(count1)をカウントすると、当該回数(count1)の最大値は２８であり、そのときの開始位置は先頭（０）である。
【００９９】
ステップＳ１２６で、繰り返し部分検出部１６は、図１５のクローン断片において、回数(count1)が最も大きかった開始位置である先頭（０）から、図２０に示すように、２８個分のトークン列を繰り返し抽出する。なお、この場合は、トークン列を繰り返し抽出した際に、クローン断片の末尾付近に２８個に満たないトークン列が残ることがないので、空白を補うことはない。このため、ステップＳ１２７における空白以外のトークン数（count2）は、クローン断片全体のトークン数と同じである１１２となる。
【０１００】
〔ステップＳ１２５〜ステップＳ１２７の繰り返し２回目（divLen=５６）〕
ステップＳ１２５で、繰り返し部分検出部１６は、図１８のクローン断片において、開始位置を先頭から順にずらしながら、５６個分のトークン列を繰り返し抽出する。そして、開始位置ごとに、抽出したそれぞれのトークン列に含まれるトークンが全て同じタイプであった回数(count1)をカウントすると、当該回数(count1)の最大値は５６であり、そのときの開始位置は先頭（０）である。
【０１０１】
ステップＳ１２６で、繰り返し部分検出部１６は、図１５のクローン断片において、回数(count1)が最も大きかった開始位置である先頭（０）から、５６個分のトークン列を繰り返し抽出する（図示省略）。なお、この場合は、トークン列を繰り返し抽出した際に、クローン断片の末尾付近に５６個に満たないトークン列が残ることがないので、空白を補うことはない。このため、ステップＳ１２７における空白以外のトークン数（count2）は、クローン断片全体のトークン数と同じである１１２となる。
【０１０２】
ステップＳ１２８で、繰り返し部分検出部１６は、ステップＳ１２７でカウントした空白以外のトークン数が、繰り返し部分の長さの候補（divLen）である「２８」及び「５６」のいずれの場合も１１２となったため、両者のうち、短い長さである「２８」を選択する。このため、繰り返し部分検出部１６は、図２０に示した、２８個分のトークン列を繰り返し抽出したものを、繰り返し部分データとする。なお、図２０で示した当該繰り返し部分データは、図１５においてクローン断片内で示した繰り返し部分データと同一である。
【０１０３】
＜本実施例における効果等＞
本実施例によれば、ソースコード間におけるクローン部分と同様に、ソースコードの一部分をコピーしてペーストし、必要に応じて一部変更して利用するという作業によって生成される繰り返し部分につき、要確認箇所を検出することができる。このような繰り返し部分は、一般的にソースコードの作成作業において多く生成されるため、本実施例によれば、変更ミスの検出精度をさらに向上させることができる。
【０１０４】
また、本実施例では、前述したように、繰り返し部分検出処理において、繰り返し部分の長さの候補のうち最も小さい単位を選択している。これにより、処理対象とする繰り返し部分の数が多くすることができ、要確認箇所を検出する精度をさらに向上させることができる。
【０１０５】
［ハードウェア構成等］
前述したソフトウェア検証装置１としてそれぞれ機能するコンピュータのハードウェア構成の一例を図２１に示す。本コンピュータは、プロセッサ１０１、メモリ１０２、ストレージ１０３、可搬記憶媒体駆動装置１０４、入出力装置１０５及び通信インタフェース１０６を備える。
【０１０６】
プロセッサ１０１は、制御ユニット、演算ユニット及び命令デコーダ等を含み、実行ユニットが、命令デコーダで解読されたプログラムの命令に従い、制御ユニットより出力される制御信号に応じ、演算ユニットを用いて算術・論理演算を実行する。かかるプロセッサ１０１は、制御に用いる各種情報が格納される制御レジスタ、既にアクセスしたメモリ２等の内容を一時的に格納可能なキャッシュ、及び、仮想記憶のページテーブルのキャッシュとしての機能を果たすＴＬＢ（Translation Lookaside Buffer）を備える。なお、プロセッサ１０１は、ＣＰＵ（Central Processing Unit）コアが複数設けられている構成でもよい。
【０１０７】
メモリ１０２は、例えばＲＡＭ（Random Access Memory）等の記憶装置であり、プロセッサ１０１で実行されるプログラムがロードされるとともに、プロセッサ１０１の処理に用いるデータが格納されるメインメモリである。また、ストレージ１０３は、例えばＨＤＤ（Hard Disk Drive）やフラッシュメモリ等の記憶装置であり、プログラムや各種データが格納される。可搬記憶媒体駆動装置１０４は、可搬記憶媒体１０７に記憶されたデータやプログラムを読み出す装置である。可搬記憶媒体１０７は、例えば磁気ディスク、光ディスク、光磁気ディスク又はフラッシュメモリ等である。プロセッサ１０１は、メモリ１０２やストレージ１０３と協働しつつ、ストレージ１０３や可搬記憶媒体１０７に格納されたプログラムを実行する。なお、プロセッサ１０１が実行するプログラムや、アクセス対象となるデータは、当該コンピュータと通信可能な他の装置に格納されていてもよい。
【０１０８】
入出力装置１０５は例えばキーボードやタッチパネル、ディスプレイ等であり、ユーザ操作等による動作命令を受け付ける一方、コンピュータによる処理結果を出力する。
通信インタフェース１０６は、例えば、例えばＬＡＮ（Local Area Network）カード等の他、無線周波受信機および送信機、ならびに光受信機および送信機を含むことができる。前述の受信機および送信機は、Ｗｉ−Ｆｉネットワーク、Bluetooth（登録商標）ネットワーク、ロング・ターム・エボリューションなどの１つまたは複数の通信ネットワークにより動作するように実現することができる。
これらのコンピュータの各構成要素は、バス１０８で接続されている。
【０１０９】
［その他］
その他、本明細書で説明したコンピュータの機能的構成及び物理的構成は、上述の態様に限るものではなく、例えば、各機能や物理資源を統合して実装したり、逆に、さらに分散して実装したりすることも可能である。
また、本明細書において、閾値等との比較において「〜以上」や「〜以下」とした記載箇所は、特記した場合を除き当該記載に限定されるものではなく、「〜より大きい（〜を上回る）」や「〜より小さい（〜を下回る）」に適宜置き換えることが可能である。
【０１１０】
以上の実施形態に関し、更に以下の付記を開示する。
（付記１）
ソースコード間で類似する処理記述がなされた部分である複数のコードクローンが記憶された記憶部を参照し、当該複数のコードクローン間において対応する位置にそれぞれ出現するトークンの組合せを抽出し、
前記トークンの組合せごとに、それぞれのトークンを所定規則で文字列単位に分割して、トークン間における文字列の組合せを抽出し、
前記文字列の組合せ同士の比較結果に応じて、前記文字列の組合せを含んだ前記トークンの組合せに含まれるトークンを要確認箇所として検出する
処理をコンピュータに実行させるソフトウェア検証プログラム。
【０１１１】
（付記２）
前記文字列の組合せを抽出する処理は、前記トークンの組合せごとに、それぞれのトークンに共通して含まれる文字列を除いた文字列を特定し、当該文字列を対象としてトークン間における文字列の組合せを抽出する、付記１に記載のソフトウェア検証プログラム。
【０１１２】
（付記３）
前記文字列の組合せを抽出する処理は、抽出した前記文字列の組合せのそれぞれを、前記複数のコードクローンにおいて１箇所に出現する文字列の組合せと、複数箇所に出現する文字列の組合せとに分類し、
前記要確認箇所として検出する処理は、前記１箇所に出現する文字列の組合せと、前記複数箇所に出現する文字列の組合せとの比較結果に応じて、前記１箇所に出現するトークンの組合せに含まれるトークンを要確認箇所として検出する、付記１に記載のソフトウェア検証プログラム。
【０１１３】
（付記４）
前記要確認箇所として検出する処理は、前記文字列の組合せ同士において対応する文字列同士を比較して、前記文字列の組合せ同士が類似している度合を示す値を算出し、前記対応する文字列同士の全てが一致している場合でなく、かつ、前記類似している度合を示す値が所定閾値よりも大きいときに、前記文字列の組合せを含んだ前記トークンの組合せに含まれるトークンを要確認箇所として検出する、付記１〜３のいずれか１項に記載のソフトウェア検証プログラム。
【０１１４】
（付記５）
前記文字列の組合せを抽出する処理は、それぞれの前記トークンの組合せについて、トークン間における文字列に含まれる数字の組合せを検出し、
前記要確認箇所として検出する処理は、前記文字列に含まれる数字の組合せ同士を比較して、当該数字の組合せ同士において対応する数字間における差分を算出し、当該差分に基づいて、前記数字の組合せを含んだ前記トークンの組合せに含まれるトークンを要確認箇所として検出する、付記１〜４のいずれか１項に記載のソフトウェア検証プログラム。
【０１１５】
（付記６）
前記要確認箇所として検出する処理は、前記対応する数字間における差分において、同一の差分となった数字の個数が差分が０以外の数字の個数に占める割合を示す値が所定閾値よりも大きいときに、前記数字の組合せを含んだ前記トークンの組合せに含まれるトークンを要確認箇所として検出する、付記５に記載のソフトウェア検証プログラム。
【０１１６】
（付記７）
前記要確認箇所として検出されたトークンを識別可能な態様で出力する処理をさらに含み、
前記出力する処理は、要確認箇所として検出されたトークンのうち、前記数字の組合せのそれぞれにおいて対応する数字間における差分に基づいて検出したトークンを、当該トークン以外に検出されたトークンとの間で区別可能な態様で出力する、付記５又は６に記載のソフトウェア検証プログラム。
【０１１７】
（付記８）
前記複数のコードクローンのそれぞれに含まれる、類似する処理記述がなされた複数の繰り返し部分を検出する処理をさらに含み、
前記トークンの組合せを抽出する処理は、前記複数の繰り返し部分間において対応する位置にそれぞれ出現するトークンの組合せをさらに抽出する、付記１〜７のいずれか１項に記載のソフトウェア検証プログラム。
【０１１８】
（付記９）
前記繰り返し部分を検出する処理は、検出した前記繰り返し部分のうち、最も小さい単位の繰り返し部分を選択する、付記８に記載のソフトウェア検証プログラム。
【０１１９】
（付記１０）
前記トークンは、識別子又はリテラルである、付記１〜９のいずれか１項に記載のソフトウェア検証プログラム。
【０１２０】
（付記１１）
ソースコード間で類似する処理記述がなされた部分である複数のコードクローンが記憶された記憶部を参照し、当該複数のコードクローン間において対応する位置にそれぞれ出現するトークンの組合せを抽出し、
前記トークンの組合せごとに、それぞれのトークンを所定規則で文字列単位に分割して、トークン間における文字列の組合せを抽出し、
前記文字列の組合せ同士の比較結果に応じて、前記文字列の組合せを含んだ前記トークンの組合せに含まれるトークンを要確認箇所として検出する
処理をコンピュータが実行するソフトウェア検証方法。
【０１２１】
（付記１２）
ソースコード間で類似する処理記述がなされた部分である複数のコードクローンが記憶された記憶部を参照し、当該複数のコードクローン間において対応する位置にそれぞれ出現するトークンの組合せを抽出するトークン抽出部と、
前記トークンの組合せごとに、それぞれのトークンを所定規則で文字列単位に分割して、トークン間における文字列の組合せを抽出する文字列抽出部と、
前記文字列の組合せ同士の比較結果に応じて、前記文字列の組合せを含んだ前記トークンの組合せに含まれるトークンを要確認箇所として検出する対象箇所検出部と
を備えたソフトウェア検証装置。
【符号の説明】
【０１２２】
１…ソフトウェア検証装置、１１…クローン検出部、１２…トークン抽出部、１３…パターン抽出部、１４…対象箇所検出部、１５…対象箇所提示部、１６…繰り返し部分検出部、２１…ソースコード群、２２…クローン断片群、２３…トークン抽出データ、２４…パターンテーブル、２５…分類データ、２６…対象箇所データ、２７…繰り返し部分群
【図１】
2016040707.tif 000003
【図２】
2016040707.tif 000004
【図３】
2016040707.tif 000005
【図４】
2016040707.tif 000006
【図５】
2016040707.tif 000007
【図６】
2016040707.tif 000008
【図７】
2016040707.tif 000009
【図８】
2016040707.tif 000010
【図９】
2016040707.tif 000011
【図１０】
2016040707.tif 000012
【図１１】
2016040707.tif 000013
【図１２】
2016040707.tif 000014
【図１３】
2016040707.tif 000015
【図１４】
2016040707.tif 000016
【図１５】
2016040707.tif 000017
【図１６】
2016040707.tif 000018
【図１７】
2016040707.tif 000019
【図１８】
2016040707.tif 000020
【図１９】
2016040707.tif 000021
【図２０】
2016040707.tif 000022
【図２１】
2016040707.tif 000023