JP2016040707A - ソフトウェア検証プログラム、ソフトウェア検証方法及びソフトウェア検証装置 - Google Patents
ソフトウェア検証プログラム、ソフトウェア検証方法及びソフトウェア検証装置 Download PDFInfo
- Publication number
- JP2016040707A JP2016040707A JP2014164918A JP2014164918A JP2016040707A JP 2016040707 A JP2016040707 A JP 2016040707A JP 2014164918 A JP2014164918 A JP 2014164918A JP 2014164918 A JP2014164918 A JP 2014164918A JP 2016040707 A JP2016040707 A JP 2016040707A
- Authority
- JP
- Japan
- Prior art keywords
- combination
- token
- character string
- tokens
- character strings
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Landscapes
- Stored Programmes (AREA)
Abstract
【課題】ソースコードのコードクローンに含まれる変更ミスの検出精度を向上させる。【解決手段】本発明の1つの態様では、ソースコード間で類似する処理記述がなされた部分である複数のコードクローンが記憶された記憶部を参照し、当該複数のコードクローン間において対応する位置にそれぞれ出現するトークンの組合せを抽出する。そして、抽出したトークンの組合せごとに、それぞれのトークンを所定規則で文字列単位に分割して、トークン間における文字列の組合せを抽出する。さらに、当該文字列の組合せ同士の比較結果に応じて、当該文字列の組合せを含んだトークンの組合せに含まれるトークンを要確認箇所として検出する。【選択図】 図2
Description
本発明は、ソフトウェア開発におけるソースコードの検証を行う技術に関する。
ソフトウェア開発において作成されるソースコードには、ソースコード間で類似する処理記述がなされた部分であるコードクローンが含まれる場合がある。このようなコードクローンは、一例として、既存のソースコードをコピーし、必要に応じて一部の文字列(例えば、識別子やリテラル等)を変更して利用することにより作成される。そして、このような方法でソースコードを作成した場合には、当該コードクローン部分において、文字列の変更ミス(例えば、変更漏れや、誤った文字列に変更してしまう場合等)が含まれることがある。
そこで、このようなコードクローンにおける変更ミスが発生している可能性がある対象箇所を検出する技術が複数開示されている。
第1の技術例として、ソースコードからコードクローン対を検出し、コードクローン間において対応する位置にある識別子の比較結果に基づいて、対象箇所を検出する技術が開示されている。具体的には、例えば、対応する位置にある識別子の非変化率(識別子の対応箇所において識別子が変化していない回数/識別子の対応箇所の総出現回数)が0より大きく閾値より小さい場合を、対象箇所として検出する。
また、第2の技術例として、第1の技術例における条件を満たしている場合においても、コードクローン対の一方の識別子が、もう一方において3種類以上の識別子に対応する場合には、対象箇所として検出しない技術が開示されている。
さらに、第3の技術例として、パラメータ化マッチ(p-match)を用いたコードクローン検出処理においてはクローンとして検出されないが、非パラメータ化マッチではコードクローンとして検出される識別子を、対象箇所として検出する技術が開示されている。パラメータ化マッチとは、コードクローン部分に出現する同じ識別子を同じ特別なトークンに置き換えてから、コードクローン検出を行う方法である。非パラメータ化マッチとは、コードクローン部分に出現する全ての識別子を同じ特別なトークンに置き換えてから、クローン検出を行う方法である。
第1の技術例として、ソースコードからコードクローン対を検出し、コードクローン間において対応する位置にある識別子の比較結果に基づいて、対象箇所を検出する技術が開示されている。具体的には、例えば、対応する位置にある識別子の非変化率(識別子の対応箇所において識別子が変化していない回数/識別子の対応箇所の総出現回数)が0より大きく閾値より小さい場合を、対象箇所として検出する。
また、第2の技術例として、第1の技術例における条件を満たしている場合においても、コードクローン対の一方の識別子が、もう一方において3種類以上の識別子に対応する場合には、対象箇所として検出しない技術が開示されている。
さらに、第3の技術例として、パラメータ化マッチ(p-match)を用いたコードクローン検出処理においてはクローンとして検出されないが、非パラメータ化マッチではコードクローンとして検出される識別子を、対象箇所として検出する技術が開示されている。パラメータ化マッチとは、コードクローン部分に出現する同じ識別子を同じ特別なトークンに置き換えてから、コードクローン検出を行う方法である。非パラメータ化マッチとは、コードクローン部分に出現する全ての識別子を同じ特別なトークンに置き換えてから、クローン検出を行う方法である。
なお、ソースコードの作成に関連する技術の他の例として、修正前後のバージョンのプログラムにおける修正前後の差分を取得し、固定の定義として予めシステムに設定した禁止修正条件を用いて誤修正の検知を行う技術が開示されている。また、他の例として、操作者が入力した文字列データを、パターン言語の学習アルゴリズムの入力として引き渡し、当該学習アルゴリズムの出力(文字列のパターン)を利用した編集を可能にする技術が開示されている。
しかし、前述した、コードクローンにおける変更ミスが発生している可能性がある箇所を検出する従来技術の第1の例や第2の例において、非変化率を算出するためには、検証対象とする識別子について、コードクローン間における対応箇所が少なくとも2箇所以上に出現する必要がある。このため、例えば、コードクローン間における対応箇所が1箇所しかない識別子については、従来技術を利用した変更漏れの検出を行うことができない。また、第1の例から第3の例のいずれも、識別子のみを対象としているため、他の文字列については検出対象外となる。
そこで、本発明の1つの態様では、ソースコードのコードクローンに含まれる変更ミスの検出精度を向上させることを目的とする。
本発明の1つの態様では、ソースコード間で類似する処理記述がなされた部分である複数のコードクローンが記憶された記憶部を参照し、当該複数のコードクローン間において対応する位置にそれぞれ出現するトークンの組合せを抽出する。そして、抽出したトークンの組合せごとに、それぞれのトークンを所定規則で文字列単位に分割して、トークン間における文字列の組合せを抽出する。さらに、当該文字列の組合せ同士の比較結果に応じて、当該文字列の組合せを含んだトークンの組合せに含まれるトークンを要確認箇所として検出する。
本発明の1つの態様によれば、ソースコードのコードクローンに含まれる変更ミスの検出精度を向上させることができる。
[本実施形態の概要]
本実施形態では、ソースコードのコードクローンにおける変更ミス等の検出を行う技術について説明する。まず、図1を参照し、本実施形態で行う処理の概要について説明する。なお、本実施形態の以下の説明では、コードクローンを単にクローンと略して称する。また、類似するクローン群に含まれる1つ1つのクローンを、クローン断片という。
本実施形態では、ソースコードのコードクローンにおける変更ミス等の検出を行う技術について説明する。まず、図1を参照し、本実施形態で行う処理の概要について説明する。なお、本実施形態の以下の説明では、コードクローンを単にクローンと略して称する。また、類似するクローン群に含まれる1つ1つのクローンを、クローン断片という。
図1は、ソースコード群及びクローン群の一例を示す。当該クローン群は、クローン断片1、クローン断片2及びクローン断片3を含む。これらのクローン断片間においては、対応する位置に出現するトークンの組合せとして、1行目及び3行目の{aaMm, aaNn, aaOo},1行目及び2行目の{xxAa, xxBb, xxCc}及び4行目の{yyAa, yyBb, yyDd}の識別子が含まれている。
これらの組合せのうち、例えば{yyAa, yyBb, yyDd}に着目すると、これらの識別子は、クローン断片のそれぞれにおいて1箇所しか出現しない。このため、例えば、従来技術で説明した第1の例や第2の例の技術を用いても、変更ミス等がある可能性がある箇所として検出されない。
一方、本実施形態では、一例として、{aaMm, aaNn, aaOo}及び{xxAa, xxBb, xxCc},{yyAa, yyBb, yyDd}から、それぞれ共通する文字列{aa, xx, yy}を除いた{Mm, Nn, Oo},{Aa, Bb, Cc}及び{Aa, Bb, Dd}に着目する。ここで、{Aa, Bb, Cc}は、それぞれのクローン断片における1行目及び2行目の2箇所で出現する。この{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行目の{1, 2, 3},3行目の{10, 11, 10}及び4行目の{1, 2, 3}が出現する。ここで、{1, 2, 3}は、それぞれのクローン断片における2行目及び4行目の2箇所で出現する。この{1, 2, 3}と、{10, 11, 10}とを比較すると、対応するリテラルがそれぞれ異なっているため、単に文字列として着目すると、特に規則性がないようにみえる。しかし、数字(数値)として着目すると、対応する{1}と{10}との差分及び{2}と{11}との差分がいずれも9である一方で、対応する{3}と{10}との差分は7である。すなわち、これらのリテラルは、クローン断片間において全体として同様の規則性で変更がなされている(バイアスがかかっている)という点で類似しているが、一部の規則性が異なっていると判別することができる。換言すれば、{1, 2, 3}の組合せの規則性に対し、{10, 11, 10}の組合せは、{10, 11}については規則性が共通しているが、{3}に対応する{10}のみが規則性を逸脱していると判別することができる。したがって、この{10, 11, 10}において変更ミス等がある可能性があると推測し、当該箇所を検出することができる。なお、当該具体例はリテラルについて説明したが、本実施形態では、同様の処理を、識別子の一部として含まれる数字に対しても行うことができる。
このように、本実施形態によれば、クローン部分において変更ミス等がある可能性がある箇所について、従来技術では検出できなかった箇所まで検出することができ、検出精度を向上させることができる。
以下、本実施形態の具体的内容について詳細に説明する。
[第1実施例]
<システム構成>
図2は、第1実施例におけるシステム構成の一例を示す。本システムは、ソフトウェア検証装置1を備える。ソフトウェア検証装置1はコンピュータであり、記憶手段に格納されたプログラムがソフトウェア検証装置1においてインストールされ、プロセッサによって実行されることによってその機能が実現される、クローン検出部11、トークン抽出部12、パターン抽出部13、対象箇所検出部14及び対象箇所提示部15を備える。また、ソフトウェア検証装置1は、記憶手段において、ソースコード群21、クローン断片群22、トークン抽出データ23、パターンテーブル24、分類データ25及び対象箇所データ26を備える。なお、記憶手段とは、ソフトウェア検証装置1が備えた記憶手段又はソフトウェア検証装置1に接続された記憶手段のいずれであってもよく、また、ソフトウェア検証装置1による読み取りが可能な記憶媒体であってもよい。
[第1実施例]
<システム構成>
図2は、第1実施例におけるシステム構成の一例を示す。本システムは、ソフトウェア検証装置1を備える。ソフトウェア検証装置1はコンピュータであり、記憶手段に格納されたプログラムがソフトウェア検証装置1においてインストールされ、プロセッサによって実行されることによってその機能が実現される、クローン検出部11、トークン抽出部12、パターン抽出部13、対象箇所検出部14及び対象箇所提示部15を備える。また、ソフトウェア検証装置1は、記憶手段において、ソースコード群21、クローン断片群22、トークン抽出データ23、パターンテーブル24、分類データ25及び対象箇所データ26を備える。なお、記憶手段とは、ソフトウェア検証装置1が備えた記憶手段又はソフトウェア検証装置1に接続された記憶手段のいずれであってもよく、また、ソフトウェア検証装置1による読み取りが可能な記憶媒体であってもよい。
クローン検出部11は、ソースコード群21に含まれるそれぞれのソースコードを対象に、クローン検出を行う。そして、検出した複数のクローン断片を含むクローン断片群22を出力する。
トークン抽出部12は、クローン断片群22に含まれるクローン断片のそれぞれに含まれるトークンを先頭から順に並べたトークン抽出データ23を生成する。そして、トークン抽出部12は、トークン抽出データ23から、クローン断片間において対応する位置に出現する識別子又はリテラルのトークンの組合せ(以下、本明細書において「トークンセット」という)を抽出する。
パターン抽出部13は、トークンセットごとに、それぞれのトークンを所定規則で文字列単位に分割して、トークン間における文字列の組合せ(分割された文字列ごとの組合せであり、それぞれの文字列の出現パターン)及び当該パターンの出現回数等を検出する。そして、パターン抽出部13は、各クローン断片間で対応する位置に出現するトークン間における文字列の組合せの出現回数を示すパターンテーブル24を生成する。なお、本明細書における「文字列」は、数字を含んだ意味を有する。なお、パターン抽出部13は、文字列抽出部の一例である。
対象箇所検出部14は、パターンテーブル24に基づき、トークンセットのトークン間における文字列の組合せを、類似するクローン断片群22において1箇所にしか出現しない組合せと、複数箇所に出現する組合せとに分類した分類データ25を生成する。さらに、対象箇所検出部14は、分類データ25に基づいて、1箇所にしか出現しない文字列の組合せと、複数箇所に出現する文字列の組合せとを比較する。そして、対象箇所検出部14は、当該比較結果に応じて、ソースコードの変更ミスが発生している可能性の高い要確認箇所として検出し、対象箇所データ26に格納する。
対象箇所提示部15は、対象箇所データ26を参照し、検出されたトークンを、変更ミスの要確認箇所として識別できる態様でユーザに提示する。
ソースコード群21は、要確認箇所を検出する対象となる複数のソースコードの集合である。図3は、ソースコード群21の一例であり、ソースコードA、ソースコードB、ソースコードC及びソースコードDを含む。なお、各ソースコードは、1つのファイルに含まれていてもよいし、別々のファイルに含まれていてもよい。
クローン断片群22は、ソースコード群21に含まれるそれぞれのソースコードから検出された複数のクローン断片を示すデータである。図3においてそれぞれのソースコードにおいて破線で囲われた部分が、各ソースコードに含まれるクローン断片の一例であり、クローン断片A、クローン断片B、クローン断片C及びクローン断片Dを含む。なお、クローン断片群22のデータは、クローン断片に含まれるコード自体を保持する態様でもよいし、各ソースコードにおけるクローン断片の領域を特定する態様(例えば、ソースコードの何行目から何行目等といった情報)であってもよい。
トークン抽出データ23は、トークン抽出処理によって抽出された、それぞれのソースコードのクローン断片をトークン単位で分割したデータである。図4は、トークン抽出データ23の一例であり、クローン断片A、クローン断片B、クローン断片C及びクローン断片Dのトークンを示している。当該トークン抽出データ23の例では、各クローン断片において同じ位置に出現するトークンに対し、対応する識別番号を付与している。なお、本実施形態では識別子及びリテラルのトークンを処理対象とするため、当該トークン抽出データ23も識別子及びリテラルのトークンのみを含んでいればよいが、図4では、図3に示したクローン断片との対応関係を明確にするため、識別子及びリテラル以外の文字列(必ずしもトークン単位に分割していない)も図示している。なお、図4では、識別子及びリテラルに対応する識別番号に網掛けをして図示している。
パターンテーブル24は、パターン抽出処理によって抽出された、トークンセットに含まれるトークン、すなわち、各クローン断片間で対応する位置に出現するトークンにおける文字列の出現パターンが格納されるテーブルである。パターンテーブル24は、例えば、図5に示すように、トークンセットに含まれるトークン全てにおいて共通する文字列を示す共通文字列、当該共通文字列以外の文字列を示す独自文字列、これらの共通文字列及び独自文字列のパターンの出現回数の項目を含む。
分類データ25は、パターン抽出処理によって検出されたパターンに属する文字列の組合せが、各クローン断片において複数箇所に出現するか1箇所にのみ出現するかに応じて分類したデータである。分類データ25は、例えば、図6に示すように、複数箇所に出現する文字列の組合せを要素とするmulti配列及び1箇所にのみ出現する文字列の組合せを要素とするuniq配列を含む。また、分類データ25はさらに、文字列のうち数字のみを抽出して同様に分類したデータを含む。具体的には、分類データ25は、同じく図6に示すように、複数箇所に出現する数字の組合せを要素とするmultiNum配列及び1箇所にのみ出現する数字の組合せを要素とするuniqNum配列を含む。
対象箇所データ26は、パターン抽出部13及び対象箇所検出部14による処理によって検出された、要確認箇所を含むトークンを特定する情報が格納されるデータである。対象箇所データ26は、例えば、図7に示すように、検出されたトークンの識別番号及び各クローン断片における当該トークンを含む。なお、図7に示す要確認タイプについては後述する。
なお、ソフトウェア検証装置1の記憶手段に格納されるデータは上記データに限定されるものではない。詳細には、上記データの他にも、処理過程において一時的に用いられる各種データ(例えばヒストグラム等)が生成されるが、図2においては図示を省略している。
<要確認箇所提示処理>
図8は、クローン検出部11、トークン抽出部12、パターン抽出部13、対象箇所検出部14及び対象箇所提示部15が実行するソフトウェア検証処理を示す。
ステップS1で、クローン検出部11は、ソースコード群21に含まれるそれぞれのソースコードを対象に、クローン検出を実行する。クローン検出処理には、一例として、既存のクローン検出ツールである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.」に示されている。クローン検出部11は、類似するクローンのまとまりであるクローンセットごとに、クローン断片群22のデータを出力する。クローン検出部11は、例えば、クローンセットを識別するクローンセットID(CID)、それぞれのクローン断片が含まれるソースコード(ソースコードのファイル名)及びクローン断片の範囲を示す情報等を出力する。
図8は、クローン検出部11、トークン抽出部12、パターン抽出部13、対象箇所検出部14及び対象箇所提示部15が実行するソフトウェア検証処理を示す。
ステップS1で、クローン検出部11は、ソースコード群21に含まれるそれぞれのソースコードを対象に、クローン検出を実行する。クローン検出処理には、一例として、既存のクローン検出ツールである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.」に示されている。クローン検出部11は、類似するクローンのまとまりであるクローンセットごとに、クローン断片群22のデータを出力する。クローン検出部11は、例えば、クローンセットを識別するクローンセットID(CID)、それぞれのクローン断片が含まれるソースコード(ソースコードのファイル名)及びクローン断片の範囲を示す情報等を出力する。
以下のステップS2〜ステップS5は、CIDごとに実行する処理(ループ処理A)である。
ステップS2で、トークン抽出部12は、1つのCIDに属する各クローン断片から、クローン断片それぞれに含まれる識別子及びリテラルのトークンを先頭から順に並べたトークン抽出データ23を生成する。
ステップS3で、トークン抽出部12は、トークン抽出データ23から、クローン断片それぞれにおいて対応する位置に出現する(すなわちトークン抽出データ23において同じ識別番号の列に属する)識別子又はリテラルのトークンセットを抽出する。
ステップS2で、トークン抽出部12は、1つのCIDに属する各クローン断片から、クローン断片それぞれに含まれる識別子及びリテラルのトークンを先頭から順に並べたトークン抽出データ23を生成する。
ステップS3で、トークン抽出部12は、トークン抽出データ23から、クローン断片それぞれにおいて対応する位置に出現する(すなわちトークン抽出データ23において同じ識別番号の列に属する)識別子又はリテラルのトークンセットを抽出する。
以下のステップS4は、トークンセットごとに実行する処理(ループ処理B)である。
ステップS4で、パターン抽出部13は、トークンセットの各トークンにおける文字列の組合せ(文字列の出現パターン)を抽出するパターン抽出処理を実行する。パターン抽出処理の詳細については後述する。
ステップS5で、対象箇所検出部14は、パターン抽出処理により抽出したパターンに基づいて、クローン断片間における各トークンの類似性や規則性を特定し、変更ミスが含まれる可能性のある要確認箇所を検出する対象箇所検出処理を実行する。対象箇所検出処理の詳細については後述する。
ステップS4で、パターン抽出部13は、トークンセットの各トークンにおける文字列の組合せ(文字列の出現パターン)を抽出するパターン抽出処理を実行する。パターン抽出処理の詳細については後述する。
ステップS5で、対象箇所検出部14は、パターン抽出処理により抽出したパターンに基づいて、クローン断片間における各トークンの類似性や規則性を特定し、変更ミスが含まれる可能性のある要確認箇所を検出する対象箇所検出処理を実行する。対象箇所検出処理の詳細については後述する。
ステップS6で、対象箇所提示部15は、対象箇所検出処理によって検出され生成された対象箇所データ26を参照し、検出されたトークンを、変更ミスの要確認箇所として識別できる態様でユーザに提示する。一例として、対象箇所提示部15は、クローン断片を含んだそれぞれのソースコードを画面表示させ、対象となるトークンの箇所をハイライト表示させる。このとき、対象箇所提示部15は、一例として、後述する要確認タイプごとに区別可能な態様で表示してもよい。
図9は、パターン抽出部13が実行するパターン抽出処理(上記ステップS4)を示すフローチャートである。
ステップS11で、パターン抽出部13は、トークンセットに含まれる各クローン断片のトークン全てに共通して含まれる共通文字列を格納するための集合patternsを用意する。
ステップS11で、パターン抽出部13は、トークンセットに含まれる各クローン断片のトークン全てに共通して含まれる共通文字列を格納するための集合patternsを用意する。
ステップS12で、パターン抽出部13は、各トークンを、camel case (単語の境界を大文字で区分する方法)とsnake case (単語の境界を‘_’で区分する方法)によって単語単位に分割する。なお、当該camel case 及びsnake caseによる分割は、所定規則で文字列単位に分割することの一例である。
ステップS13で、パターン抽出部13は、隣接する単語を1個以上結合した文字列(n-gram、n≧1)を生成する。このとき、パターン抽出部13は、空白も1つの単語として扱い、1個以上の連続する数字も1つの単語として扱う。なお、1つのトークンから生成したn-gramの文字列は重複しないものとする。
ステップS14で、パターン抽出部13は、トークンセットから生成されたn-gramが、それぞれ何個生成されたかをカウントする。
ステップS15で、パターン抽出部13は、トークンセットのトークン数(すなわち、クローンセットに含まれるクローン断片数)と等しい個数生成されたn-gram(すなわち、トークンセットに含まれる各クローン断片のトークン全てに共通して含まれるn-gram)のうち、文字列が最も長いものを、文字列strとして選択する。
ステップS15で、パターン抽出部13は、トークンセットのトークン数(すなわち、クローンセットに含まれるクローン断片数)と等しい個数生成されたn-gram(すなわち、トークンセットに含まれる各クローン断片のトークン全てに共通して含まれるn-gram)のうち、文字列が最も長いものを、文字列strとして選択する。
ステップS16で、パターン抽出部13は、文字列strが空白か否かを判定し、空白でない場合はステップS17に進み(No)、空白である場合はステップS19に進む(Yes)。
ステップS17で、パターン抽出部13は、文字列strを、集合patternsに追加する。
ステップS18で、パターン抽出部13は、トークンセットに含まれる各トークンにおける文字列strを、空白に置換する。パターン抽出部13は、当該ステップS18の後、再びステップS12に戻って上記処理を繰り返す。
ステップS17で、パターン抽出部13は、文字列strを、集合patternsに追加する。
ステップS18で、パターン抽出部13は、トークンセットに含まれる各トークンにおける文字列strを、空白に置換する。パターン抽出部13は、当該ステップS18の後、再びステップS12に戻って上記処理を繰り返す。
ステップS19で、パターン抽出部13は、上記処理の結果、トークンセットに残った文字列の組合せ(すなわち、トークンセットにおける、当該トークンセットに含まれる各クローン断片のトークン全てに共通して出現する文字列以外の文字列の組合せであり、以下、独自文字列という)と、集合patternsに含まれる文字列(トークンセットに含まれる各クローン断片のトークン全てに共通して出現する文字列であり、以下、共通文字列という)とを、パターンテーブル24に格納する。具体的には、パターン抽出部13は、トークンセットに残った、置換後の文字列の組合せを、パターンテーブル24の独自文字列の項目のデータとし、集合patternsを、パターンテーブル24の共通文字列の項目のデータとする。このとき、パターン抽出部13は、これらの独自文字列及び共通文字列の項目のデータと同じ組合せのデータを有するレコードがパターンテーブル24に存在しない場合には、これらの独自文字列及び共通文字列の項目のデータを含み、かつ出現回数を1とした新たなレコードを追加する。一方、パターン抽出部13は、これらの独自文字列及び共通文字列の項目のデータと同じ組合せのデータを有するレコードがすでに存在する場合には、新たにレコードを追加することなく、当該レコードの出現回数の項目に1を加算する。
図10及び図11は、対象箇所検出部14が実行する対象箇所検出処理(上記ステップS5)を示すフローチャートである。
ステップS21で、対象箇所検出部14は、パターン抽出処理により検出された、トークンセットに含まれる文字列の出現パターンを、クローン断片全体における出現回数に応じて分類する。具体的には、対象箇所検出部14は、それぞれのパターンにおける独自文字列を、複数箇所のトークンセットにおいて出現する場合(multi)と、1箇所のトークンセットにおいてのみ出現する場合(uniq)に分類する。ただし、対象箇所検出部14は、独自文字列が存在せず共通文字列しか存在しないパターンについては、共通文字列を独自文字列として用いて、当該分類を行う。より具体的には、対象箇所検出部14は、パターンテーブル24を参照して、独自文字列が同一のレコードを抽出し、その出現回数を合算する。このとき、独自文字列が無いレコードについては、共通文字列をクローン断片の数だけ展開した文字列の組合せが独自文字列であるものとして処理を行う。そして、出現回数が複数回である独自文字列を抽出し、分類データ25のmulti配列に格納する。一方、対象箇所検出部14は、出現回数が1回の独自文字列を抽出し、分類データ25のuniq配列に格納する。
ステップS22で、対象箇所検出部14は、独自文字列から数字のみを抽出した独自文字列をさらに生成し、上記ステップS21の処理と同様の処理を、当該数字のみが含まれる独自文字列を対象として行う。具体的には、対象箇所検出部14は、数字のみを含む独自文字列が、複数箇所のトークンセットにおいて出現する場合(multiNum)と、1箇所のトークンセットにおいてのみ出現する場合(uniqNum)に分類する。より具体的には、対象箇所検出部14は、パターンテーブル24を参照して、数字のみを抽出した独自文字列が同一のレコードを抽出し、その出現回数を合算する。そして、出現回数が複数回である数字のみの独自文字列を抽出し、分類データ25のmultiNum配列に格納する。一方、対象箇所検出部14は、出現回数が1回の数字のみの独自文字列を抽出し、分類データ25のuniqNum配列に格納する。独自文字列が存在しない場合の処理は上記ステップS21と同様である。
以下のステップS23〜ステップS25は、uniq配列に含まれる文字列の組合せごと(uniq配列の1要素ごと)に実行する処理(ループ処理C)である。また、当該ステップS23〜ステップS25は、当該ループ処理の中で、さらに、multi配列に含まれる文字列の組合せごと(multi配列の1要素ごと)に実行する処理(ループ処理D)である。
ステップS23で、対象箇所検出部14は、multi配列の文字列の組合せに含まれるそれぞれの文字列と、uniq配列の文字列の組合せに含まれるそれぞれの文字列とを、先頭から文字単位で比較し、文字列の組合せ同士が類似している度合を示す値を算出する。具体的には、対象箇所検出部14は、まず、これらの文字列間において、同じ文字数countと異なる文字数diffを求める。
ステップS24で、対象箇所検出部14は、異なる文字数diffが0より大きく、かつ、同じ文字数count及び異なる文字数diffの和で同じ文字数countを除した値が所定閾値以上(count/(count+diff) ≧ 閾値)であるか否かを判定する。なお、所定閾値は、例えばクローン断片の数等に応じて、予め任意に設定することができる。当該条件に該当する場合とは、すなわち、multi配列の文字列の組合せに含まれるそれぞれの文字列と、uniq配列の文字列の組合せに含まれるそれぞれの文字列とが一致しないが、ある程度以上類似している場合を意味する。このような場合とは、さらに換言すれば、各クローン断片間において1つの箇所のトークンセットにしか存在しない文字列の組合せが、複数箇所のトークンセットにおける文字列の組合せと少しだけ異なっている場合を意味する。これはすなわち、当該1つの箇所のトークンセットに含まれるいずれかのトークンにおいて、文字列の変更ミスが発生している可能性があることを示している。上記条件に該当する場合にはステップS25に進み(Yes)、当該条件に該当しない場合には、次のmulti配列の要素を処理対象とする処理を行う(No)。
ステップS25で、対象箇所検出部14は、multi配列の文字列の組合せに含まれるそれぞれの文字列と、uniq配列の文字列の組合せに含まれるそれぞれの文字列とがある程度以上類似しているが一致しないと判別し、uniq配列の対象の文字列の組合せが含まれるトークンセットを特定する。そして、対象箇所検出部14は、特定したトークンセットを識別できる情報の一例として、ソースコードにおける位置を示す情報を対象箇所データ26に格納する。
以下のステップS26〜ステップS30は、uniqNum配列に含まれる文字列の組合せごと(uniqNum配列の要素ごと)に実行する処理(ループ処理E)である。また、当該ステップS26〜ステップS30は、当該ループ処理の中で、さらに、multiNum配列に含まれる文字列の組合せごと(multiNum配列の要素ごと)に実行する処理(ループ処理F)である。
ステップS26で、対象箇所検出部14は、multiNum配列の数字の組合せに含まれるそれぞれの数字と、uniqNum配列の数字の組合せに含まれるそれぞれの数字との差分を算出し、差分のヒストグラムを生成する。差分のヒストグラムは、差分の値と、当該差分の値となった数字の個数とを示す。
ステップS27で、対象箇所検出部14は、生成したヒストグラムにおいて、同一の差分となった数字の個数が差分が0以外の数字の個数に占める割合を示す値が所定閾値以上であるか否かを判定する。より具体的には、対象箇所検出部14は、最も多い個数となった差分の値が0以外で、かつ、同一の差分の値となった数字の個数のうち最も多い個数を、uniqNum配列の数字とmultiNum配列の数字とで値が異なっている(差分が0以外の)個数で除した値が所定閾値以上((同一の差分で最も多い個数) / (uniqNum配列の数字とmultiNum配列の数字とで値が異なっている個数) ≧ 閾値)であるか否かを判定する。なお、所定閾値は、上記のステップS24で用いた閾値と同様に、予め任意に設定することができ、ステップS24で用いた閾値と同一の値でも異なる値でもよい。当該条件に該当する場合とは、すなわち、multiNum配列の数字の組合せに含まれるそれぞれの数字と、uniqNum配列の数字の組合せに含まれるそれぞれの数字との多くの差分が一致するが、両者の数字が異なっている場合を意味する。このような場合とは、さらに換言すれば、各クローン断片間において1つの箇所のトークンセットにしか存在しない数字の組合せが、複数箇所のトークンセットにおける数字の組合せに対してほぼ一様にバイアスがかかっているが異なっている場合を意味する。これはすなわち、当該1つの箇所のトークンセットに含まれるいずれかのトークンにおいて、ソースコードの変更ミスが発生している可能性があることを示している。上記条件に該当する場合にはステップS28に進み(Yes)、当該条件に該当しない場合にはステップS29に進む(No)。
ステップS28で、対象箇所検出部14は、uniqNum配列の数字はmultiNum配列の数字に対してほぼ一様にバイアスがかかっているが異なっているものと判別し、uniqNum配列の数字の組合せが含まれるトークンセットを特定する。そして、対象箇所検出部14は、特定したトークンセットを識別する情報の一例として、ソースコードにおける位置を示す情報を対象箇所データ26に格納する。
ステップS29で、対象箇所検出部14は、生成したヒストグラムにおいて、最も多い個数となった差分の値が0で、かつ、uniqNum配列の数字とmultiNum配列の数字とで異なる数字が1個のみ存在する否かを判定する。当該条件に該当する場合とは、すなわち、multiNum配列の数字の組合せに含まれるそれぞれの数字と、uniqNum配列の数字の組合せに含まれるそれぞれの数字とがほぼ一致するが1箇所のみ異なるということを意味する。このような場合とは、さらに換言すれば、各クローン断片間において1つの箇所のトークンセットにしか存在しない数字の組合せが、複数箇所のトークンセットにおける数字の組合せに対して1箇所のみ異なっている場合を意味する。これはすなわち、当該1つの箇所のトークンセットに含まれるいずれかのトークンにおいて、ソースコードの変更ミスが発生している可能性があることを示している。上記条件に該当する場合にはステップS30に進み(Yes)、当該条件に該当しない場合には、次のmultiNum配列の要素を処理対象とする処理を行う(No)。
ステップS30で、対象箇所検出部14は、multiNum配列の数字の組合せに含まれるそれぞれの数字と、uniqNum配列の数字の組合せに含まれるそれぞれの数字とがほぼ一致するが1箇所のみ異なると識別し、uniqNum配列の数字の組合せが含まれるトークンセットを特定する。そして、対象箇所検出部14は、特定したトークンセットを識別する情報の一例として、ソースコードにおける位置を示す情報を対象箇所データ26に格納する。
<データ具体例を用いた処理説明>
上記のソフトウェア検証装置1における処理について、図3〜図7及び図12〜図13に示すデータ具体例を用いて説明する。なお、当該具体例における所定閾値は0.75とする。
上記のソフトウェア検証装置1における処理について、図3〜図7及び図12〜図13に示すデータ具体例を用いて説明する。なお、当該具体例における所定閾値は0.75とする。
ステップS1で、クローン検出部11は、図3に示すソースコードA、ソースコードB、ソースコードC及びソースコードDを含む全てのソースコード群21に対し、前述したCCFinderXを用いて非パラメータ化マッチ(非p-match)でクローン検出を実行する。その結果、1つのCIDに属するクローン断片として、図3において破線内部に示されているクローン断片A、クローン断片B、クローン断片C及びクローン断片Dが検出されたものとする。
ステップS2で、トークン抽出部12は、クローン断片A、クローン断片B、クローン断片C及びクローン断片Dから、図4に示すトークン抽出データ23を生成する。なお、このときトークン抽出部12は、CCFinderXが生成するトークンのデータを利用することができる。
ステップS3で、トークン抽出部12は、図4のトークン抽出データ23から、クローン断片それぞれにおいて同じ位置に出現する識別子又はリテラルのトークンを示すトークンセットを抽出する。例えば、識別番号が「3」の列からは、トークンセット{Box, Box, Ellipse, Ellipse}が抽出される。また、識別番号が「13」の列からは、トークンセット{getHeight5mOk, getHeight4mOk, getHeight3mOk, getHeight2mOk}が得られる。この識別番号が「13」の列のトークンセットの例を、図12(A)に示している。
以下、ステップS4(ステップS11〜S19)のパターン抽出処理について、図12(A)に示した識別番号が「13」の列のトークンセットの具体例を用いて説明する。
〔ステップS12〜ステップS18の繰り返し1回目〕
ステップS12で、パターン抽出部13は、当該トークンセットの1つ目の(クローン断片Aの)要素である「getHeight5mOk」をcamel caseによって単語に分割する。その結果、「get, Height, 5, m, Ok」が得られる。
ステップS13で、パターン抽出部13は、この「get, Height, 5, m, Ok」を組み合わせたn-gram (n≧1)として「get, getHeight, getHeight5, getHeight5m, getHeight5mOk, Height, Height5, Height5m, Height5mOk, 5, 5m, 5mOk, m, mOk, Ok」を生成する。同様の処理を、他の3つの要素である「getHeight4mOk」、「getHeight3mOk」及び「getHeight2mOk」についても実行する。
ステップS12で、パターン抽出部13は、当該トークンセットの1つ目の(クローン断片Aの)要素である「getHeight5mOk」をcamel caseによって単語に分割する。その結果、「get, Height, 5, m, Ok」が得られる。
ステップS13で、パターン抽出部13は、この「get, Height, 5, m, Ok」を組み合わせたn-gram (n≧1)として「get, getHeight, getHeight5, getHeight5m, getHeight5mOk, Height, Height5, Height5m, Height5mOk, 5, 5m, 5mOk, m, mOk, Ok」を生成する。同様の処理を、他の3つの要素である「getHeight4mOk」、「getHeight3mOk」及び「getHeight2mOk」についても実行する。
ステップS14で、パターン抽出部13は、当該トークンセットの4つの要素において、それぞれのn-gramが何個生成されたかをカウントする。カウントの結果は、「mOk, getHeight, get, Height, m, Ok」のn-gramがそれぞれ4個であり、その他のn-gramがそれぞれ1個である。
ステップS15で、パターン抽出部13は、トークンセットの要素数である4個生成されたn-gramである「mOk, getHeight, get, Height, m, Ok」のうち、一番長い文字列である「getHeight」を文字列strとして選択する。
ステップS15で、パターン抽出部13は、トークンセットの要素数である4個生成されたn-gramである「mOk, getHeight, get, Height, m, Ok」のうち、一番長い文字列である「getHeight」を文字列strとして選択する。
ステップS16で、パターン抽出部13は、文字列strの「getHeight」が空白でないため、ステップS17で、集合patternsに当該「getHeight」を追加する。
ステップS17で、パターン抽出部13は、トークンセットの各トークンにおける「getHeight」を空白に置き換える。その結果、当該トークンセットは、{□5mOk, □4mOk, □3mOk, □2mOk}となる。但し、□は空白を表すものとする。なお、この段階での集合patterns及びトークンセットの状態を、図12(B)に示す。
ステップS17で、パターン抽出部13は、トークンセットの各トークンにおける「getHeight」を空白に置き換える。その結果、当該トークンセットは、{□5mOk, □4mOk, □3mOk, □2mOk}となる。但し、□は空白を表すものとする。なお、この段階での集合patterns及びトークンセットの状態を、図12(B)に示す。
〔ステップS12〜ステップS18の繰り返し2回目〕
ステップS12で、パターン抽出部13は、当該トークンセットの1つ目の(クローン断片Aの)要素である「□5mOk」をcamel caseによって単語に分割する。その結果、「□, 5, m, Ok」が得られる。
ステップS13で、パターン抽出部13は、この「□, 5, m, Ok」を組み合わせたn-gram (n≧1)として「□, □5, □5m, □5mOk, 5, 5m, 5mOk, m, mOk, Ok」を生成する。同様の処理を、他の3つの要素である「□4mOk」、「□3mOk」及び「□2mOk」についても実行する。
ステップS12で、パターン抽出部13は、当該トークンセットの1つ目の(クローン断片Aの)要素である「□5mOk」をcamel caseによって単語に分割する。その結果、「□, 5, m, Ok」が得られる。
ステップS13で、パターン抽出部13は、この「□, 5, m, Ok」を組み合わせたn-gram (n≧1)として「□, □5, □5m, □5mOk, 5, 5m, 5mOk, m, mOk, Ok」を生成する。同様の処理を、他の3つの要素である「□4mOk」、「□3mOk」及び「□2mOk」についても実行する。
ステップS14で、パターン抽出部13は、当該トークンセットの4つの要素において、それぞれのn-gramが何個生成されたかをカウントする。カウントの結果は、「mOk, m, Ok」のn-gramがそれぞれ4個であり、その他のn-gramがそれぞれ1個である。
ステップS15で、パターン抽出部13は、トークンセットの要素数である4個生成されたn-gramである「mOk, m, Ok」のうち、一番長い文字列である「mOk」を文字列strとして選択する。
ステップS15で、パターン抽出部13は、トークンセットの要素数である4個生成されたn-gramである「mOk, m, Ok」のうち、一番長い文字列である「mOk」を文字列strとして選択する。
ステップS16で、パターン抽出部13は、文字列strの「mOk」が空白でないため、ステップS17で、集合patternsに当該「mOk」を追加する。
ステップS18で、パターン抽出部13は、トークンセットの各トークンにおける「mOk」を空白に置き換える。その結果、当該トークンセットは、{□5□, □4□, □3□, □2□}となる。なお、この段階での集合patterns及びトークンセットの状態を、図12(C)に示す。
ステップS18で、パターン抽出部13は、トークンセットの各トークンにおける「mOk」を空白に置き換える。その結果、当該トークンセットは、{□5□, □4□, □3□, □2□}となる。なお、この段階での集合patterns及びトークンセットの状態を、図12(C)に示す。
〔ステップS12〜ステップS18の繰り返し3回目〕
上記と同様の処理により、パターン抽出部13は、ステップS12〜ステップS14の処理を経て、「□(空白)」を文字列strとして選択する。その結果、ステップS16で、パターン抽出部13は、文字列strの「mOk」が空白でないため、ステップS19に進む。
ステップS19で、パターン抽出部13は、集合patternsである{getHeight, mOk}及びトークンセット{5, 4, 3, 2}を、パターンテーブル24に格納する。具体的には、出現回数を1とし、共通文字列の項目に{getHeight, mOk}を、独自文字列の項目に{5, 4, 3, 2}を設定したレコードをパターンテーブル24に追加する。
他のトークンセットについても同様の処理をした結果、図5に示すパターンテーブル24が生成される。
上記と同様の処理により、パターン抽出部13は、ステップS12〜ステップS14の処理を経て、「□(空白)」を文字列strとして選択する。その結果、ステップS16で、パターン抽出部13は、文字列strの「mOk」が空白でないため、ステップS19に進む。
ステップS19で、パターン抽出部13は、集合patternsである{getHeight, mOk}及びトークンセット{5, 4, 3, 2}を、パターンテーブル24に格納する。具体的には、出現回数を1とし、共通文字列の項目に{getHeight, mOk}を、独自文字列の項目に{5, 4, 3, 2}を設定したレコードをパターンテーブル24に追加する。
他のトークンセットについても同様の処理をした結果、図5に示すパターンテーブル24が生成される。
次に、ステップS5(ステップS21〜S29)の対象箇所検出処理について説明する。
ステップS21で、対象箇所検出部14は、図5に示すパターンテーブル24を参照して、複数回出現する独自文字列を抽出し、出現回数に応じて図6に示す分類データ25のmulti配列又はuniq配列に格納する。例えば、独自文字列の{box, box, ell, ell}は、共通文字列が{1}のパターンの出現回数が6回と、共通文字列が{2}のパターンの出現回数が3回の計9回出現するので、multi配列に格納する。また、例えば、図5に示すパターンテーブル24において、共通文字列が{1}、独自文字列がなしのパターンの出現回数が4回である。この場合は、対象箇所検出部14は、共通文字列をクローン断片の数である4個展開した文字列の集合{1, 1, 1, 1}を、multi配列に格納する。一方、対象箇所検出部14は、例えば、独自文字列の{4, 4, 2, 1}等は、出現回数が1回であるため、図6に示す分類データ25のuniq配列に格納する。また、例えば、共通文字列が{validateWidth}、独自文字列がなしのパターンも、出現回数が1回である。この場合は、対象箇所検出部14は、共通文字列をクローン断片の数である4個展開した文字列の組合せ{validateWidth, validateWidth, validateWidth, validateWidth}を、uniq配列に格納する。
ステップS21で、対象箇所検出部14は、図5に示すパターンテーブル24を参照して、複数回出現する独自文字列を抽出し、出現回数に応じて図6に示す分類データ25のmulti配列又はuniq配列に格納する。例えば、独自文字列の{box, box, ell, ell}は、共通文字列が{1}のパターンの出現回数が6回と、共通文字列が{2}のパターンの出現回数が3回の計9回出現するので、multi配列に格納する。また、例えば、図5に示すパターンテーブル24において、共通文字列が{1}、独自文字列がなしのパターンの出現回数が4回である。この場合は、対象箇所検出部14は、共通文字列をクローン断片の数である4個展開した文字列の集合{1, 1, 1, 1}を、multi配列に格納する。一方、対象箇所検出部14は、例えば、独自文字列の{4, 4, 2, 1}等は、出現回数が1回であるため、図6に示す分類データ25のuniq配列に格納する。また、例えば、共通文字列が{validateWidth}、独自文字列がなしのパターンも、出現回数が1回である。この場合は、対象箇所検出部14は、共通文字列をクローン断片の数である4個展開した文字列の組合せ{validateWidth, validateWidth, validateWidth, validateWidth}を、uniq配列に格納する。
ステップS22で、対象箇所検出部14は、図5に示すパターンテーブル24を参照して、独自文字列から数字のみを抽出した独自文字列をさらに生成し、出現回数に応じて図6に示す分類データ25のmultiNum配列又はuniqNum配列に格納する。例えば、独自文字列の{5, 4, 3, 2}は、出現回数が合計2回なので、multi配列に格納する。また、例えば、独自文字列{Height4, Width4, Border2, Padding1}に含まれる数字を抽出すると(4, 4, 2, 1)になり、出現回数が1回なので、uniqNum配列に格納する。
ステップS23で、対象箇所検出部14は、図6に示すmulti配列の各要素に含まれるそれぞれの文字列と、uniq配列の各要素に含まれるそれぞれの文字列とを、先頭から文字単位で比較し、同じ文字数countと異なる文字数diffを求める。例えば、uniq配列の処理対象の要素が{Height4, Width4, Border2, Padding1}で、multi配列の処理対象の要素が{box, box, ell, ell}である場合、次のようになる。すなわち、対象箇所検出部14は、要素に含まれる対応する文字列同士(Height4とbox、Width4とbox、Border2とell、Padding1とell)を、先頭から文字単位で比較する。この場合、diff=28、count=0であり、0/(0+28)=0は閾値よりも小さい。このため、対象箇所検出部14は、ステップS24で、両者が類似していないと判定する。
一方、例えば、uniq配列の処理対象の文字列の組合せが{Height, Width, Border, Paddng}で、multi配列の処理対象の文字列の組合せが{Height, Width, Border, Padding}の場合、diff=3、count=21であり、21/(21+3)=0.875は閾値以上となる。このため、対象箇所検出部14は、ステップS24で、両者が一致しないがある程度以上類似していると判定する。そして、ステップS25で、対象箇所検出部14は、パターンテーブル24を参照して、当該uniq配列の{Height, Width, Border, Paddng}が含まれるトークンの識別番号である「39」を特定し、これらの情報を、図7に示すように対象箇所データ26に格納する。ここで、対象箇所検出部14は、当該格納したデータを、例えば「要確認タイプA」とし、後述するステップS28及びステップS30で格納するデータと区別可能にする。
上記と同様の処理を、ループ処理C及びループ処理Dにより、他の文字列の組合せについても行った後、ステップS26に進む。
上記と同様の処理を、ループ処理C及びループ処理Dにより、他の文字列の組合せについても行った後、ステップS26に進む。
ステップS26で、対象箇所検出部14は、multiNum配列の数字の組合せに含まれるそれぞれの数字と、uniqNum配列の数字の組合せに含まれるそれぞれの数字との差分を算出し、図13に示す差分のヒストグラムを生成する。例えば、uniqNum配列の{4, 4, 2, 1}及びmultiNum配列の{5, 4, 3, 2}を処理対象とする場合、それぞれの差分は、4-5=-1、4-4=0、2-3=-1、1-2=-1となり、差分が-1の個数が3個、差分が0の個数が1個となる。この場合、同一の差分で最も多い個数が3で、uniqNum配列の数字とmultiNum配列の数字とで値が異なっている個数が3であり、3/3 ≧ 閾値 を満たす。このため、対象箇所検出部14は、ステップS27において、条件を満たしていると判定する。そして、ステップS28で、対象箇所検出部14は、両者について、ほぼ一様にバイアスがかかっているが異なっていると識別し、パターンテーブル24を参照して、当該uniqNum配列の{4, 4, 2, 1}が含まれるトークンの識別番号である「31」を特定する。そして、対象箇所検出部14は、これらの情報を、図7に示すように対象箇所データ26に格納する。ここで、対象箇所検出部14は、当該格納したデータを、例えば「要確認タイプB」とし、ステップS25及び後述するステップS30で格納するデータと区別可能にする。
一方、例えば、uniqNum配列の{5, 4, 3, 1}及びmultiNum配列の{5, 4, 3, 2}を処理対象とする場合、それぞれの差分は、5-5=0、4-4=0、3-3=0、1-2=-1となり、差分が-1の個数が3個、差分が-1の個数が1個となる。この場合、最も多い個数の差分が0であるため、ステップS27の条件を満たさない。しかし、両者の数字の組合せにおいて{1}と{2}のみが異なるため、ステップS29の条件を満たす。このため、ステップS30で、対象箇所検出部14は、両者がほぼ一致するが1箇所のみ異なると識別し、パターンテーブル24を参照して、当該uniqNum配列の{5, 4, 3, 1}が含まれるトークンの識別番号である「49」を特定する。そして、対象箇所検出部14は、これらの情報を、図7に示すように対象箇所データ26に格納する。ここで、対象箇所検出部14は、当該格納したデータを、例えば「要確認タイプC」とし、ステップS25及びステップS28で格納するデータと区別可能にする。
上記と同様の処理を、ループ処理E及びループ処理Fにより、他の数字の組合せについても行う。
上記と同様の処理を、ループ処理E及びループ処理Fにより、他の数字の組合せについても行う。
そして、ステップS6において、対象箇所提示部15は、対象箇所データ26に格納されたトークンを示す情報をユーザに提示する。一例として、対象箇所提示部15は、図3に示したソースコードA〜ソースコードDを画面に並べて表示させ、対象となるトークンの箇所をそれぞれハイライト表示させるようにしてもよい。その際、例えば、上記ステップS25、ステップS28及びステップS30のいずれの処理によって格納されたデータであるかを区別可能に(例えば色分けする等によって)表示させてもよい。
<本実施例における効果等>
本実施例では、前述した処理により、次のような効果を奏する。すなわち、前述したように、クローン断片は、あるソースコードの部分をコピーして他のソースコードにおいてペーストし、必要に応じて一部変更することによって生成されたものであることが多い。そして、本実施例では、クローン断片間において対応する位置に出現するトークンの組合せについて、それぞれのトークンを、所定規則で文字列単位に分割する。そして、クローン断片間において対応する位置に出現するトークンセットに含まれる文字列の組合せと、他のトークンセットに含まれる文字列の組合せとを比較する。これにより、トークンセット同士としては類似していない場合でも、前述した対象箇所の検出処理において、文字列同士が類似しているが一致していないことを検出することができる。すなわち、本実施例によれば、トークン単位でみれば一見類似していない場合であっても、前述した対象箇所の検出処理において比較対象とし、類似した規則性を有する文字列を検出することが可能となる。そして、このように検出された箇所においては、当該トークンセットにおいて文字列の変更ミスが発生していることが推測される。このため、本実施例によれば、変更ミスが発生している可能性がある箇所を検出する際の精度を向上させることができる。
本実施例では、前述した処理により、次のような効果を奏する。すなわち、前述したように、クローン断片は、あるソースコードの部分をコピーして他のソースコードにおいてペーストし、必要に応じて一部変更することによって生成されたものであることが多い。そして、本実施例では、クローン断片間において対応する位置に出現するトークンの組合せについて、それぞれのトークンを、所定規則で文字列単位に分割する。そして、クローン断片間において対応する位置に出現するトークンセットに含まれる文字列の組合せと、他のトークンセットに含まれる文字列の組合せとを比較する。これにより、トークンセット同士としては類似していない場合でも、前述した対象箇所の検出処理において、文字列同士が類似しているが一致していないことを検出することができる。すなわち、本実施例によれば、トークン単位でみれば一見類似していない場合であっても、前述した対象箇所の検出処理において比較対象とし、類似した規則性を有する文字列を検出することが可能となる。そして、このように検出された箇所においては、当該トークンセットにおいて文字列の変更ミスが発生していることが推測される。このため、本実施例によれば、変更ミスが発生している可能性がある箇所を検出する際の精度を向上させることができる。
このような効果は、一例として、業務アプリケーションのソースコードの検証において特に有効であると考えられる。業務アプリケーションのソースコードには、一般的なオープンソースソフトウェア等よりも、クローン部分が多く含まれる可能性がある。業務には類似処理が多く含まれるため、類似する一連の処理を記述するのに、雛形を参照しながら一部を変更するなど、クローン部分の生成を意図的に許容している場合があるからである。そして、業務アプリケーションのソースコードでは、英数字が組み合わさった長い名前の変数が使われ、クローン部分を生成するときには、その変数に含まれる文字列の複数箇所を変更することもある(例えばKCA006_UrSupMemKbnとKCA008_UrSubMemKbnなど)。このような変数における変更ミスの有無の検証において、変数に含まれる文字列単位の比較により上記の検証処理を行うことは、変数単位の比較による検証処理よりも、精度の向上が顕著となる可能性が高い。
また、本実施例では、独自文字列を特定し、当該独自文字列を対象としてトークン間の文字列の組合せを抽出する。これにより、共通文字列が異なるトークンセット同士であってトークン単位でみれば一見類似していない場合であっても、前述した対象箇所の検出処理において比較対象とし、類似しているが一致していない文字列を検出することが可能となる。
また、本実施例では、uniq配列の要素である文字列の組合せと、multi配列の要素である文字列の組合せとの比較結果によって、両者が類似しているが一致していないときに、uniq配列の要素である文字列の組合せを含むトークンセットを検出している。これにより、複数箇所に出現する文字列の組合せが信頼性が高いと推定し、1つの箇所にしか出現しない文字列の組合せを、要確認箇所として検出することを実現している。
また、本実施例では、数字の組合せ同士については、対応する数字同士の差分に基づいて対象箇所の検出処理を行うことで、次のような効果を奏する。すなわち、本実施例では、数字そのものが類似していない場合であっても、数字の組合せ同士の規則性が類似しており、かつ、一部の数字の規則性が異なる場合を検出することができる。これにより、変更ミスが発生している可能性がある箇所の検出精度をさらに向上させることができる。
また、本実施例では、ステップS25、ステップS28及びステップS30でそれぞれ検出したトークンセットを、区別可能な態様で提示することができる。これにより、どのように変更ミスが生じているかの内訳をユーザが把握できるようになり、より検証作業の効率化を図ることができる。
また、本実施例で処理対象とするトークンには、ソースコードのクローンにおいて変更する可能性のある識別子及びリテラルの両方を含めることができる。このため、従来技術よりも、検証対象を広げることができ、変更ミスが発生している可能性がある箇所の検出精度をさらに向上させることができる。
[第2実施例]
第2実施例では、第1実施例に加え、さらに、1つのソースコードのクローン断片の内部において、類似する処理記述が繰り返して出現する繰り返し部分を検出する。このような繰り返し部分も、クローン断片と同様に、ソースコードの一部分をコピーしてペーストし、必要に応じて一部変更して利用するという作業によって生成される可能性が高い。なお、一例として、if構文やループ処理の記述において、このような繰り返し部分が多く発生する傾向にある。第2実施例では、当該繰り返し部分においてソースコードの変更ミスが発生している可能性がある箇所を検出する。なお、第1実施例と同様の内容については、原則として説明を省略する。
第2実施例では、第1実施例に加え、さらに、1つのソースコードのクローン断片の内部において、類似する処理記述が繰り返して出現する繰り返し部分を検出する。このような繰り返し部分も、クローン断片と同様に、ソースコードの一部分をコピーしてペーストし、必要に応じて一部変更して利用するという作業によって生成される可能性が高い。なお、一例として、if構文やループ処理の記述において、このような繰り返し部分が多く発生する傾向にある。第2実施例では、当該繰り返し部分においてソースコードの変更ミスが発生している可能性がある箇所を検出する。なお、第1実施例と同様の内容については、原則として説明を省略する。
<システム構成>
図14は、第2実施例におけるシステム構成の一例を示す。第1実施例に加え、第2実施例では、さらに、繰り返し部分検出部16及び繰り返し部分群27を備える。
繰り返し部分検出部16は、クローン断片において類似する処理記述がなされた複数の繰り返し部分を検出する。
図14は、第2実施例におけるシステム構成の一例を示す。第1実施例に加え、第2実施例では、さらに、繰り返し部分検出部16及び繰り返し部分群27を備える。
繰り返し部分検出部16は、クローン断片において類似する処理記述がなされた複数の繰り返し部分を検出する。
繰り返し部分群27は、繰り返し部分検出部16によってソースコードのクローン断片から抽出された繰り返し部分を示すデータである。図15に、繰り返し部分群27の一例を示す。図15に示すソースコードにおいてそれぞれ破線で囲われた部分が、クローン断片に含まれる繰り返し部分群27の一例である。なお、繰り返し部分群27のデータは、繰り返し部分に含まれるコード自体を保持する態様でもよいし、各クローン断片における繰り返し部分の領域を特定する態様(例えば、ソースコードの何行目から何行目等といった情報)であってもよい。
なお、第1実施例と同様に、ソフトウェア検証装置1の記憶手段に格納されるデータは上記データに限定されるものではない。詳細には、上記データの他にも、処理過程において一時的に用いられる各種データ(例えば後述する距離ヒストグラム等)が生成されるが、図14においては図示を省略している。
<要確認箇所提示処理>
図16は、第2実施例において、クローン検出部11、トークン抽出部12、パターン抽出部13、対象箇所検出部14、対象箇所提示部15及び繰り返し部分検出部16が実行するソフトウェア検証処理の一例を示す。なお、第2実施例におけるソフトウェア検証処理は、ステップS6までが第1実施例と同一であるため、図示及び説明を省略する。図16に示すステップS107以降の処理は、図8に示したステップS6に続いて実行される処理である。
図16は、第2実施例において、クローン検出部11、トークン抽出部12、パターン抽出部13、対象箇所検出部14、対象箇所提示部15及び繰り返し部分検出部16が実行するソフトウェア検証処理の一例を示す。なお、第2実施例におけるソフトウェア検証処理は、ステップS6までが第1実施例と同一であるため、図示及び説明を省略する。図16に示すステップS107以降の処理は、図8に示したステップS6に続いて実行される処理である。
以下のステップS107〜ステップS112は、ファイルごとに実行する処理(ループ処理G)である。
ステップS107で、繰り返し部分検出部16は、1つのファイルに含まれるソースコードから検出されたクローン断片のうち、範囲が隣接又は重複するクローン断片があれば、それらのクローン断片を結合して、1つのクローン断片とする。
ステップS107で、繰り返し部分検出部16は、1つのファイルに含まれるソースコードから検出されたクローン断片のうち、範囲が隣接又は重複するクローン断片があれば、それらのクローン断片を結合して、1つのクローン断片とする。
以下のステップS108〜ステップS112は、クローン断片ごとに実行する処理(ループ処理H)である。
ステップS108で、繰り返し部分検出部16は、クローン断片に含まれる繰り返し部分を検出する繰り返し部分検出処理を実行する。繰り返し部分検出処理の詳細については後述する。
ステップS109で、トークン抽出部12は、トークン抽出データ23から、繰り返し部分検出処理によって抽出された繰り返し部分それぞれにおいて対応する位置に出現する(すなわちトークン抽出データ23において同じ識別番号の列に属する)識別子又はリテラルのトークンを示すトークンセットを抽出する。
ステップS108で、繰り返し部分検出部16は、クローン断片に含まれる繰り返し部分を検出する繰り返し部分検出処理を実行する。繰り返し部分検出処理の詳細については後述する。
ステップS109で、トークン抽出部12は、トークン抽出データ23から、繰り返し部分検出処理によって抽出された繰り返し部分それぞれにおいて対応する位置に出現する(すなわちトークン抽出データ23において同じ識別番号の列に属する)識別子又はリテラルのトークンを示すトークンセットを抽出する。
以下のステップS111は、トークンセットごとに実行する処理(ループ処理I)である。
ステップS111で、パターン抽出部13は、トークンセットの各トークンにおける文字列の組合せ(文字列の出現パターン)を抽出するパターン抽出処理を実行する。パターン抽出処理の詳細は、第1実施例と同様である。
ステップS112で、対象箇所検出部14は、パターン抽出処理により抽出したパターンに基づいて、クローン断片間における各トークンの類似性を計算し、類似しているが同一ではないトークンを検出する対象箇所検出処理を実行する。対象箇所検出処理の詳細は、第1実施例と同様である。
ステップS111で、パターン抽出部13は、トークンセットの各トークンにおける文字列の組合せ(文字列の出現パターン)を抽出するパターン抽出処理を実行する。パターン抽出処理の詳細は、第1実施例と同様である。
ステップS112で、対象箇所検出部14は、パターン抽出処理により抽出したパターンに基づいて、クローン断片間における各トークンの類似性を計算し、類似しているが同一ではないトークンを検出する対象箇所検出処理を実行する。対象箇所検出処理の詳細は、第1実施例と同様である。
ステップS113で、対象箇所提示部15は、対象箇所検出処理によって検出され生成された対象箇所データ26を参照し、検出されたトークンを、変更ミスの要確認箇所として識別できる態様でユーザに提示する。このとき、例えば、第2実施例における対象箇所検出処理によって生成された対象箇所データ26については、第1実施例で検出した生成された対象箇所データ26と区別可能な態様でユーザに提示してもよい。
図17は、繰り返し部分検出部16が実行する繰り返し部分検出処理(上記ステップS108)を示すフローチャートである。
ステップS121で、繰り返し部分検出部16は、処理対象のクローン断片に含まれるトークンのうち、プログラムの予約語の一部と句読点の一部のみを残し、その他を “” に置換する。例えば、ソースコードがJava(登録商標)で記載されている場合、例えば “(){}[];:.=” や “if” 等を残し、残りを “” に置換する。
ステップS121で、繰り返し部分検出部16は、処理対象のクローン断片に含まれるトークンのうち、プログラムの予約語の一部と句読点の一部のみを残し、その他を “” に置換する。例えば、ソースコードがJava(登録商標)で記載されている場合、例えば “(){}[];:.=” や “if” 等を残し、残りを “” に置換する。
以下のステップS122〜ステップS123は、任意の所定回数であるn回実行する処理(ループ処理J)である。
ステップS122で、繰り返し部分検出部16は、乱数によって開始位置(pos)を生成する。
ステップS123で、繰り返し部分検出部16は、ステップS121による置換処理後のクローン断片において、開始位置(pos)から始まる任意の長さの部分トークン列を特定する。そして、繰り返し部分検出部16は、クローン断片に含まれる、当該部分トークン列と一致するトークン列を検出する。さらに、繰り返し部分検出部16は、開始位置(pos)と、検出されたトークン列の開始位置(i)との距離(|pos-i|)のヒストグラムを生成する。
ステップS122で、繰り返し部分検出部16は、乱数によって開始位置(pos)を生成する。
ステップS123で、繰り返し部分検出部16は、ステップS121による置換処理後のクローン断片において、開始位置(pos)から始まる任意の長さの部分トークン列を特定する。そして、繰り返し部分検出部16は、クローン断片に含まれる、当該部分トークン列と一致するトークン列を検出する。さらに、繰り返し部分検出部16は、開始位置(pos)と、検出されたトークン列の開始位置(i)との距離(|pos-i|)のヒストグラムを生成する。
ステップS124で、繰り返し部分検出部16は、ステップS123で生成されたヒストグラムにおける、距離(|pos-i|)ごとの検出回数が所定閾値(例えばn/2)よりも大きい距離を、繰り返し部分の長さの候補(divLen)とする。当該候補は、複数存在する場合がある。ただし、距離が0の場合は、部分トークン列自体の検出回数となるため、候補から除くものとする。
以下のステップS125〜ステップS127は、繰り返し部分の長さの候補(divLen)ごとに実行する処理(ループ処理K)である。
ステップS125で、繰り返し部分検出部16は、ステップS121による置換処理後のクローン断片において、開始位置を先頭から順にずらしながら、繰り返し部分の長さの候補(divLen)ごとにトークン列を繰り返し抽出する。そして、開始位置ごとに、抽出したそれぞれのトークン列に含まれるトークンが全て同じタイプ(例えば、予約後の種別や記号の種別等)であった回数(count1)をカウントする。
ステップS125で、繰り返し部分検出部16は、ステップS121による置換処理後のクローン断片において、開始位置を先頭から順にずらしながら、繰り返し部分の長さの候補(divLen)ごとにトークン列を繰り返し抽出する。そして、開始位置ごとに、抽出したそれぞれのトークン列に含まれるトークンが全て同じタイプ(例えば、予約後の種別や記号の種別等)であった回数(count1)をカウントする。
ステップS126で、繰り返し部分検出部16は、ステップS121による置換処理前のクローン断片において、ステップS125でカウントした回数(count1)が最も大きかった開始位置から、繰り返し部分の長さの候補(divLen)ごとにトークン列を繰り返し抽出する。ただし、繰り返し部分検出部16は、クローン断片からトークン列を繰り返し抽出した結果、クローン断片の末尾付近において残りのトークン列の長さが繰り返し部分の長さの候補(divLen)に対して不足している場合は、不足部分に空白を補ったトークン列を抽出する。
ステップS127で、繰り返し部分検出部16は、抽出したトークン列全体において、空白以外のトークン数(count2)をカウントする。
ステップS128で、繰り返し部分検出部16は、ステップS127でカウントした空白以外のトークン数(count2)が最も多い繰り返し部分の長さの候補(divLen)のうち、最も短い長さを選択する。そして、繰り返し部分検出部16は、選択した長さで繰り返し抽出したトークン列を、繰り返し部分とする。なお、ここで最も短い長さ、すなわち、最も小さい単位の繰り返し部分を選択するのは、パターン抽出処理や対象箇所検出処理を行う際に、処理対象とする繰り返し部分の数が多い方が、要確認箇所を検出する精度が向上するからである。
ステップS128で、繰り返し部分検出部16は、ステップS127でカウントした空白以外のトークン数(count2)が最も多い繰り返し部分の長さの候補(divLen)のうち、最も短い長さを選択する。そして、繰り返し部分検出部16は、選択した長さで繰り返し抽出したトークン列を、繰り返し部分とする。なお、ここで最も短い長さ、すなわち、最も小さい単位の繰り返し部分を選択するのは、パターン抽出処理や対象箇所検出処理を行う際に、処理対象とする繰り返し部分の数が多い方が、要確認箇所を検出する精度が向上するからである。
<データ具体例を用いた処理説明>
上記の第2実施例における処理のうち、繰り返し部分検出処理について、図15及び図18〜図20に示すデータ具体例を用いて説明する。当該具体例では、ステップS107において、CCFinderXが出力する情報に基づいて範囲が隣接又は重複するクローン断片を結合した結果の1つのクローン断片が、図15に示すソースコードにおいて破線で囲われた部分であるとする。
上記の第2実施例における処理のうち、繰り返し部分検出処理について、図15及び図18〜図20に示すデータ具体例を用いて説明する。当該具体例では、ステップS107において、CCFinderXが出力する情報に基づいて範囲が隣接又は重複するクローン断片を結合した結果の1つのクローン断片が、図15に示すソースコードにおいて破線で囲われた部分であるとする。
以下、ステップS108(ステップS121〜S128)の繰り返し部分検出処理について、図15に示すクローン断片の具体例を用いて説明する。
ステップS121で、繰り返し部分検出部16は、図15に示すクローン断片に含まれるトークンのうち、“(){}[];:.=” と “if” 以外を “” に置換する。図18は、当該置換処理後のクローン断片を示す。なお、図18では、見易さのために途中で改行を行なっているが、実際のデータには改行は含まれていない。なお、CCFinderXは “length()” を特殊扱いして1個のトークンとして出力するため、 “length()”は1個の “” に置換されている。
ステップS122で、繰り返し部分検出部16は、乱数によって開始位置(pos)を10個生成する。これにより、開始位置(pos)が、例えば18, 54, 36, 22, 8, 111, 9, 78, 109, 104で生成されたとする。
ステップS121で、繰り返し部分検出部16は、図15に示すクローン断片に含まれるトークンのうち、“(){}[];:.=” と “if” 以外を “” に置換する。図18は、当該置換処理後のクローン断片を示す。なお、図18では、見易さのために途中で改行を行なっているが、実際のデータには改行は含まれていない。なお、CCFinderXは “length()” を特殊扱いして1個のトークンとして出力するため、 “length()”は1個の “” に置換されている。
ステップS122で、繰り返し部分検出部16は、乱数によって開始位置(pos)を10個生成する。これにより、開始位置(pos)が、例えば18, 54, 36, 22, 8, 111, 9, 78, 109, 104で生成されたとする。
ステップS123で、繰り返し部分検出部16は、ステップS121による置換処理後のクローン断片において、当該10個の開始位置(pos)のそれぞれから始まる10トークン分の部分トークン列を特定する。そして、繰り返し部分検出部16は、クローン断片に含まれる、当該部分トークン列と一致するトークン列を検出し、開始位置(pos)と、検出されたトークン列の開始位置(i)との距離(|pos-i|)の距離ヒストグラムを生成する。なお、図15及び図18に示した具体例の場合、トークン列全体の長さが112である。このため、開始位置(pos)が104、109、111の場合は、部分トークン列が10トークンに満たない。このような場合は、当該部分トークン列と一致するトークン列の検出は行なわない。
図19は、当該ステップS123で生成される距離ヒストグラムを示す。当該ヒストグラムにおける、0以外の距離(|pos-i|)ごとの検出回数は、距離「28」が9回、距離「56」が6回、距離「84」が3回である。ここで、ステップS124における所定閾値を10/2=5とするとき、繰り返し部分検出部16は、当該閾値より検出回数の大きい距離である「28」及び「56」を、繰り返し部分の長さの候補(divLen)とする。
〔ステップS125〜ステップS127の繰り返し1回目(divLen=28)〕
ステップS125で、繰り返し部分検出部16は、図18のクローン断片において、開始位置を先頭から順にずらしながら、28個分のトークン列を繰り返し抽出する。そして、開始位置ごとに、抽出したそれぞれのトークン列に含まれるトークンが全て同じタイプであった回数(count1)をカウントすると、当該回数(count1)の最大値は28であり、そのときの開始位置は先頭(0)である。
ステップS125で、繰り返し部分検出部16は、図18のクローン断片において、開始位置を先頭から順にずらしながら、28個分のトークン列を繰り返し抽出する。そして、開始位置ごとに、抽出したそれぞれのトークン列に含まれるトークンが全て同じタイプであった回数(count1)をカウントすると、当該回数(count1)の最大値は28であり、そのときの開始位置は先頭(0)である。
ステップS126で、繰り返し部分検出部16は、図15のクローン断片において、回数(count1)が最も大きかった開始位置である先頭(0)から、図20に示すように、28個分のトークン列を繰り返し抽出する。なお、この場合は、トークン列を繰り返し抽出した際に、クローン断片の末尾付近に28個に満たないトークン列が残ることがないので、空白を補うことはない。このため、ステップS127における空白以外のトークン数(count2)は、クローン断片全体のトークン数と同じである112となる。
〔ステップS125〜ステップS127の繰り返し2回目(divLen=56)〕
ステップS125で、繰り返し部分検出部16は、図18のクローン断片において、開始位置を先頭から順にずらしながら、56個分のトークン列を繰り返し抽出する。そして、開始位置ごとに、抽出したそれぞれのトークン列に含まれるトークンが全て同じタイプであった回数(count1)をカウントすると、当該回数(count1)の最大値は56であり、そのときの開始位置は先頭(0)である。
ステップS125で、繰り返し部分検出部16は、図18のクローン断片において、開始位置を先頭から順にずらしながら、56個分のトークン列を繰り返し抽出する。そして、開始位置ごとに、抽出したそれぞれのトークン列に含まれるトークンが全て同じタイプであった回数(count1)をカウントすると、当該回数(count1)の最大値は56であり、そのときの開始位置は先頭(0)である。
ステップS126で、繰り返し部分検出部16は、図15のクローン断片において、回数(count1)が最も大きかった開始位置である先頭(0)から、56個分のトークン列を繰り返し抽出する(図示省略)。なお、この場合は、トークン列を繰り返し抽出した際に、クローン断片の末尾付近に56個に満たないトークン列が残ることがないので、空白を補うことはない。このため、ステップS127における空白以外のトークン数(count2)は、クローン断片全体のトークン数と同じである112となる。
ステップS128で、繰り返し部分検出部16は、ステップS127でカウントした空白以外のトークン数が、繰り返し部分の長さの候補(divLen)である「28」及び「56」のいずれの場合も112となったため、両者のうち、短い長さである「28」を選択する。このため、繰り返し部分検出部16は、図20に示した、28個分のトークン列を繰り返し抽出したものを、繰り返し部分データとする。なお、図20で示した当該繰り返し部分データは、図15においてクローン断片内で示した繰り返し部分データと同一である。
<本実施例における効果等>
本実施例によれば、ソースコード間におけるクローン部分と同様に、ソースコードの一部分をコピーしてペーストし、必要に応じて一部変更して利用するという作業によって生成される繰り返し部分につき、要確認箇所を検出することができる。このような繰り返し部分は、一般的にソースコードの作成作業において多く生成されるため、本実施例によれば、変更ミスの検出精度をさらに向上させることができる。
本実施例によれば、ソースコード間におけるクローン部分と同様に、ソースコードの一部分をコピーしてペーストし、必要に応じて一部変更して利用するという作業によって生成される繰り返し部分につき、要確認箇所を検出することができる。このような繰り返し部分は、一般的にソースコードの作成作業において多く生成されるため、本実施例によれば、変更ミスの検出精度をさらに向上させることができる。
また、本実施例では、前述したように、繰り返し部分検出処理において、繰り返し部分の長さの候補のうち最も小さい単位を選択している。これにより、処理対象とする繰り返し部分の数が多くすることができ、要確認箇所を検出する精度をさらに向上させることができる。
[ハードウェア構成等]
前述したソフトウェア検証装置1としてそれぞれ機能するコンピュータのハードウェア構成の一例を図21に示す。本コンピュータは、プロセッサ101、メモリ102、ストレージ103、可搬記憶媒体駆動装置104、入出力装置105及び通信インタフェース106を備える。
前述したソフトウェア検証装置1としてそれぞれ機能するコンピュータのハードウェア構成の一例を図21に示す。本コンピュータは、プロセッサ101、メモリ102、ストレージ103、可搬記憶媒体駆動装置104、入出力装置105及び通信インタフェース106を備える。
プロセッサ101は、制御ユニット、演算ユニット及び命令デコーダ等を含み、実行ユニットが、命令デコーダで解読されたプログラムの命令に従い、制御ユニットより出力される制御信号に応じ、演算ユニットを用いて算術・論理演算を実行する。かかるプロセッサ101は、制御に用いる各種情報が格納される制御レジスタ、既にアクセスしたメモリ2等の内容を一時的に格納可能なキャッシュ、及び、仮想記憶のページテーブルのキャッシュとしての機能を果たすTLB(Translation Lookaside Buffer)を備える。なお、プロセッサ101は、CPU(Central Processing Unit)コアが複数設けられている構成でもよい。
メモリ102は、例えばRAM(Random Access Memory)等の記憶装置であり、プロセッサ101で実行されるプログラムがロードされるとともに、プロセッサ101の処理に用いるデータが格納されるメインメモリである。また、ストレージ103は、例えばHDD(Hard Disk Drive)やフラッシュメモリ等の記憶装置であり、プログラムや各種データが格納される。可搬記憶媒体駆動装置104は、可搬記憶媒体107に記憶されたデータやプログラムを読み出す装置である。可搬記憶媒体107は、例えば磁気ディスク、光ディスク、光磁気ディスク又はフラッシュメモリ等である。プロセッサ101は、メモリ102やストレージ103と協働しつつ、ストレージ103や可搬記憶媒体107に格納されたプログラムを実行する。なお、プロセッサ101が実行するプログラムや、アクセス対象となるデータは、当該コンピュータと通信可能な他の装置に格納されていてもよい。
入出力装置105は例えばキーボードやタッチパネル、ディスプレイ等であり、ユーザ操作等による動作命令を受け付ける一方、コンピュータによる処理結果を出力する。
通信インタフェース106は、例えば、例えばLAN(Local Area Network)カード等の他、無線周波受信機および送信機、ならびに光受信機および送信機を含むことができる。前述の受信機および送信機は、Wi−Fiネットワーク、Bluetooth(登録商標)ネットワーク、ロング・ターム・エボリューションなどの1つまたは複数の通信ネットワークにより動作するように実現することができる。
これらのコンピュータの各構成要素は、バス108で接続されている。
通信インタフェース106は、例えば、例えばLAN(Local Area Network)カード等の他、無線周波受信機および送信機、ならびに光受信機および送信機を含むことができる。前述の受信機および送信機は、Wi−Fiネットワーク、Bluetooth(登録商標)ネットワーク、ロング・ターム・エボリューションなどの1つまたは複数の通信ネットワークにより動作するように実現することができる。
これらのコンピュータの各構成要素は、バス108で接続されている。
[その他]
その他、本明細書で説明したコンピュータの機能的構成及び物理的構成は、上述の態様に限るものではなく、例えば、各機能や物理資源を統合して実装したり、逆に、さらに分散して実装したりすることも可能である。
また、本明細書において、閾値等との比較において「〜以上」や「〜以下」とした記載箇所は、特記した場合を除き当該記載に限定されるものではなく、「〜より大きい(〜を上回る)」や「〜より小さい(〜を下回る)」に適宜置き換えることが可能である。
その他、本明細書で説明したコンピュータの機能的構成及び物理的構成は、上述の態様に限るものではなく、例えば、各機能や物理資源を統合して実装したり、逆に、さらに分散して実装したりすることも可能である。
また、本明細書において、閾値等との比較において「〜以上」や「〜以下」とした記載箇所は、特記した場合を除き当該記載に限定されるものではなく、「〜より大きい(〜を上回る)」や「〜より小さい(〜を下回る)」に適宜置き換えることが可能である。
以上の実施形態に関し、更に以下の付記を開示する。
(付記1)
ソースコード間で類似する処理記述がなされた部分である複数のコードクローンが記憶された記憶部を参照し、当該複数のコードクローン間において対応する位置にそれぞれ出現するトークンの組合せを抽出し、
前記トークンの組合せごとに、それぞれのトークンを所定規則で文字列単位に分割して、トークン間における文字列の組合せを抽出し、
前記文字列の組合せ同士の比較結果に応じて、前記文字列の組合せを含んだ前記トークンの組合せに含まれるトークンを要確認箇所として検出する
処理をコンピュータに実行させるソフトウェア検証プログラム。
(付記1)
ソースコード間で類似する処理記述がなされた部分である複数のコードクローンが記憶された記憶部を参照し、当該複数のコードクローン間において対応する位置にそれぞれ出現するトークンの組合せを抽出し、
前記トークンの組合せごとに、それぞれのトークンを所定規則で文字列単位に分割して、トークン間における文字列の組合せを抽出し、
前記文字列の組合せ同士の比較結果に応じて、前記文字列の組合せを含んだ前記トークンの組合せに含まれるトークンを要確認箇所として検出する
処理をコンピュータに実行させるソフトウェア検証プログラム。
(付記2)
前記文字列の組合せを抽出する処理は、前記トークンの組合せごとに、それぞれのトークンに共通して含まれる文字列を除いた文字列を特定し、当該文字列を対象としてトークン間における文字列の組合せを抽出する、付記1に記載のソフトウェア検証プログラム。
前記文字列の組合せを抽出する処理は、前記トークンの組合せごとに、それぞれのトークンに共通して含まれる文字列を除いた文字列を特定し、当該文字列を対象としてトークン間における文字列の組合せを抽出する、付記1に記載のソフトウェア検証プログラム。
(付記3)
前記文字列の組合せを抽出する処理は、抽出した前記文字列の組合せのそれぞれを、前記複数のコードクローンにおいて1箇所に出現する文字列の組合せと、複数箇所に出現する文字列の組合せとに分類し、
前記要確認箇所として検出する処理は、前記1箇所に出現する文字列の組合せと、前記複数箇所に出現する文字列の組合せとの比較結果に応じて、前記1箇所に出現するトークンの組合せに含まれるトークンを要確認箇所として検出する、付記1に記載のソフトウェア検証プログラム。
前記文字列の組合せを抽出する処理は、抽出した前記文字列の組合せのそれぞれを、前記複数のコードクローンにおいて1箇所に出現する文字列の組合せと、複数箇所に出現する文字列の組合せとに分類し、
前記要確認箇所として検出する処理は、前記1箇所に出現する文字列の組合せと、前記複数箇所に出現する文字列の組合せとの比較結果に応じて、前記1箇所に出現するトークンの組合せに含まれるトークンを要確認箇所として検出する、付記1に記載のソフトウェア検証プログラム。
(付記4)
前記要確認箇所として検出する処理は、前記文字列の組合せ同士において対応する文字列同士を比較して、前記文字列の組合せ同士が類似している度合を示す値を算出し、前記対応する文字列同士の全てが一致している場合でなく、かつ、前記類似している度合を示す値が所定閾値よりも大きいときに、前記文字列の組合せを含んだ前記トークンの組合せに含まれるトークンを要確認箇所として検出する、付記1〜3のいずれか1項に記載のソフトウェア検証プログラム。
前記要確認箇所として検出する処理は、前記文字列の組合せ同士において対応する文字列同士を比較して、前記文字列の組合せ同士が類似している度合を示す値を算出し、前記対応する文字列同士の全てが一致している場合でなく、かつ、前記類似している度合を示す値が所定閾値よりも大きいときに、前記文字列の組合せを含んだ前記トークンの組合せに含まれるトークンを要確認箇所として検出する、付記1〜3のいずれか1項に記載のソフトウェア検証プログラム。
(付記5)
前記文字列の組合せを抽出する処理は、それぞれの前記トークンの組合せについて、トークン間における文字列に含まれる数字の組合せを検出し、
前記要確認箇所として検出する処理は、前記文字列に含まれる数字の組合せ同士を比較して、当該数字の組合せ同士において対応する数字間における差分を算出し、当該差分に基づいて、前記数字の組合せを含んだ前記トークンの組合せに含まれるトークンを要確認箇所として検出する、付記1〜4のいずれか1項に記載のソフトウェア検証プログラム。
前記文字列の組合せを抽出する処理は、それぞれの前記トークンの組合せについて、トークン間における文字列に含まれる数字の組合せを検出し、
前記要確認箇所として検出する処理は、前記文字列に含まれる数字の組合せ同士を比較して、当該数字の組合せ同士において対応する数字間における差分を算出し、当該差分に基づいて、前記数字の組合せを含んだ前記トークンの組合せに含まれるトークンを要確認箇所として検出する、付記1〜4のいずれか1項に記載のソフトウェア検証プログラム。
(付記6)
前記要確認箇所として検出する処理は、前記対応する数字間における差分において、同一の差分となった数字の個数が差分が0以外の数字の個数に占める割合を示す値が所定閾値よりも大きいときに、前記数字の組合せを含んだ前記トークンの組合せに含まれるトークンを要確認箇所として検出する、付記5に記載のソフトウェア検証プログラム。
前記要確認箇所として検出する処理は、前記対応する数字間における差分において、同一の差分となった数字の個数が差分が0以外の数字の個数に占める割合を示す値が所定閾値よりも大きいときに、前記数字の組合せを含んだ前記トークンの組合せに含まれるトークンを要確認箇所として検出する、付記5に記載のソフトウェア検証プログラム。
(付記7)
前記要確認箇所として検出されたトークンを識別可能な態様で出力する処理をさらに含み、
前記出力する処理は、要確認箇所として検出されたトークンのうち、前記数字の組合せのそれぞれにおいて対応する数字間における差分に基づいて検出したトークンを、当該トークン以外に検出されたトークンとの間で区別可能な態様で出力する、付記5又は6に記載のソフトウェア検証プログラム。
前記要確認箇所として検出されたトークンを識別可能な態様で出力する処理をさらに含み、
前記出力する処理は、要確認箇所として検出されたトークンのうち、前記数字の組合せのそれぞれにおいて対応する数字間における差分に基づいて検出したトークンを、当該トークン以外に検出されたトークンとの間で区別可能な態様で出力する、付記5又は6に記載のソフトウェア検証プログラム。
(付記8)
前記複数のコードクローンのそれぞれに含まれる、類似する処理記述がなされた複数の繰り返し部分を検出する処理をさらに含み、
前記トークンの組合せを抽出する処理は、前記複数の繰り返し部分間において対応する位置にそれぞれ出現するトークンの組合せをさらに抽出する、付記1〜7のいずれか1項に記載のソフトウェア検証プログラム。
前記複数のコードクローンのそれぞれに含まれる、類似する処理記述がなされた複数の繰り返し部分を検出する処理をさらに含み、
前記トークンの組合せを抽出する処理は、前記複数の繰り返し部分間において対応する位置にそれぞれ出現するトークンの組合せをさらに抽出する、付記1〜7のいずれか1項に記載のソフトウェア検証プログラム。
(付記9)
前記繰り返し部分を検出する処理は、検出した前記繰り返し部分のうち、最も小さい単位の繰り返し部分を選択する、付記8に記載のソフトウェア検証プログラム。
前記繰り返し部分を検出する処理は、検出した前記繰り返し部分のうち、最も小さい単位の繰り返し部分を選択する、付記8に記載のソフトウェア検証プログラム。
(付記10)
前記トークンは、識別子又はリテラルである、付記1〜9のいずれか1項に記載のソフトウェア検証プログラム。
前記トークンは、識別子又はリテラルである、付記1〜9のいずれか1項に記載のソフトウェア検証プログラム。
(付記11)
ソースコード間で類似する処理記述がなされた部分である複数のコードクローンが記憶された記憶部を参照し、当該複数のコードクローン間において対応する位置にそれぞれ出現するトークンの組合せを抽出し、
前記トークンの組合せごとに、それぞれのトークンを所定規則で文字列単位に分割して、トークン間における文字列の組合せを抽出し、
前記文字列の組合せ同士の比較結果に応じて、前記文字列の組合せを含んだ前記トークンの組合せに含まれるトークンを要確認箇所として検出する
処理をコンピュータが実行するソフトウェア検証方法。
ソースコード間で類似する処理記述がなされた部分である複数のコードクローンが記憶された記憶部を参照し、当該複数のコードクローン間において対応する位置にそれぞれ出現するトークンの組合せを抽出し、
前記トークンの組合せごとに、それぞれのトークンを所定規則で文字列単位に分割して、トークン間における文字列の組合せを抽出し、
前記文字列の組合せ同士の比較結果に応じて、前記文字列の組合せを含んだ前記トークンの組合せに含まれるトークンを要確認箇所として検出する
処理をコンピュータが実行するソフトウェア検証方法。
(付記12)
ソースコード間で類似する処理記述がなされた部分である複数のコードクローンが記憶された記憶部を参照し、当該複数のコードクローン間において対応する位置にそれぞれ出現するトークンの組合せを抽出するトークン抽出部と、
前記トークンの組合せごとに、それぞれのトークンを所定規則で文字列単位に分割して、トークン間における文字列の組合せを抽出する文字列抽出部と、
前記文字列の組合せ同士の比較結果に応じて、前記文字列の組合せを含んだ前記トークンの組合せに含まれるトークンを要確認箇所として検出する対象箇所検出部と
を備えたソフトウェア検証装置。
ソースコード間で類似する処理記述がなされた部分である複数のコードクローンが記憶された記憶部を参照し、当該複数のコードクローン間において対応する位置にそれぞれ出現するトークンの組合せを抽出するトークン抽出部と、
前記トークンの組合せごとに、それぞれのトークンを所定規則で文字列単位に分割して、トークン間における文字列の組合せを抽出する文字列抽出部と、
前記文字列の組合せ同士の比較結果に応じて、前記文字列の組合せを含んだ前記トークンの組合せに含まれるトークンを要確認箇所として検出する対象箇所検出部と
を備えたソフトウェア検証装置。
1…ソフトウェア検証装置、11…クローン検出部、12…トークン抽出部、13…パターン抽出部、14…対象箇所検出部、15…対象箇所提示部、16…繰り返し部分検出部、21…ソースコード群、22…クローン断片群、23…トークン抽出データ、24…パターンテーブル、25…分類データ、26…対象箇所データ、27…繰り返し部分群
Claims (8)
- ソースコード間で類似する処理記述がなされた部分である複数のコードクローンが記憶された記憶部を参照し、当該複数のコードクローン間において対応する位置にそれぞれ出現するトークンの組合せを抽出し、
前記トークンの組合せごとに、それぞれのトークンを所定規則で文字列単位に分割して、トークン間における文字列の組合せを抽出し、
前記文字列の組合せ同士の比較結果に応じて、前記文字列の組合せを含んだ前記トークンの組合せに含まれるトークンを要確認箇所として検出する
処理をコンピュータに実行させるソフトウェア検証プログラム。 - 前記文字列の組合せを抽出する処理は、前記トークンの組合せごとに、それぞれのトークンに共通して含まれる文字列を除いた文字列を特定し、当該文字列を対象としてトークン間における文字列の組合せを抽出する、請求項1に記載のソフトウェア検証プログラム。
- 前記文字列の組合せを抽出する処理は、抽出した前記文字列の組合せのそれぞれを、前記複数のコードクローンにおいて1箇所に出現する文字列の組合せと、複数箇所に出現する文字列の組合せとに分類し、
前記要確認箇所として検出する処理は、前記1箇所に出現する文字列の組合せと、前記複数箇所に出現する文字列の組合せとの比較結果に応じて、前記1箇所に出現するトークンの組合せに含まれるトークンを要確認箇所として検出する、請求項1に記載のソフトウェア検証プログラム。 - 前記要確認箇所として検出する処理は、前記文字列の組合せ同士において対応する文字列同士を比較して、前記文字列の組合せ同士が類似している度合を示す値を算出し、前記対応する文字列同士の全てが一致している場合でなく、かつ、前記類似している度合を示す値が所定閾値よりも大きいときに、前記文字列の組合せを含んだ前記トークンの組合せに含まれるトークンを要確認箇所として検出する、請求項1〜3のいずれか1項に記載のソフトウェア検証プログラム。
- 前記文字列の組合せを抽出する処理は、それぞれの前記トークンの組合せについて、トークン間における文字列に含まれる数字の組合せを検出し、
前記要確認箇所として検出する処理は、前記文字列に含まれる数字の組合せ同士を比較して、当該数字の組合せ同士において対応する数字間における差分を算出し、当該差分に基づいて、前記数字の組合せを含んだ前記トークンの組合せに含まれるトークンを要確認箇所として検出する、請求項1〜4のいずれか1項に記載のソフトウェア検証プログラム。 - 前記複数のコードクローンのそれぞれに含まれる、類似する処理記述がなされた複数の繰り返し部分を検出する処理をさらに含み、
前記トークンの組合せを抽出する処理は、前記複数の繰り返し部分間において対応する位置にそれぞれ出現するトークンの組合せをさらに抽出する、請求項1〜5のいずれか1項に記載のソフトウェア検証プログラム。 - ソースコード間で類似する処理記述がなされた部分である複数のコードクローンが記憶された記憶部を参照し、当該複数のコードクローン間において対応する位置にそれぞれ出現するトークンの組合せを抽出し、
前記トークンの組合せごとに、それぞれのトークンを所定規則で文字列単位に分割して、トークン間における文字列の組合せを抽出し、
前記文字列の組合せ同士の比較結果に応じて、前記文字列の組合せを含んだ前記トークンの組合せに含まれるトークンを要確認箇所として検出する
処理をコンピュータが実行するソフトウェア検証方法。 - ソースコード間で類似する処理記述がなされた部分である複数のコードクローンが記憶された記憶部を参照し、当該複数のコードクローン間において対応する位置にそれぞれ出現するトークンの組合せを抽出するトークン抽出部と、
前記トークンの組合せごとに、それぞれのトークンを所定規則で文字列に分割して、トークン間における文字列の組合せを抽出する文字列抽出部と、
前記文字列の組合せ同士の比較結果に応じて、前記文字列の組合せを含んだ前記トークンの組合せに含まれるトークンを要確認箇所として検出する対象箇所検出部と
を備えたソフトウェア検証装置。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2014164918A JP2016040707A (ja) | 2014-08-13 | 2014-08-13 | ソフトウェア検証プログラム、ソフトウェア検証方法及びソフトウェア検証装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2014164918A JP2016040707A (ja) | 2014-08-13 | 2014-08-13 | ソフトウェア検証プログラム、ソフトウェア検証方法及びソフトウェア検証装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2016040707A true JP2016040707A (ja) | 2016-03-24 |
Family
ID=55541020
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2014164918A Pending JP2016040707A (ja) | 2014-08-13 | 2014-08-13 | ソフトウェア検証プログラム、ソフトウェア検証方法及びソフトウェア検証装置 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2016040707A (ja) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2019114154A (ja) * | 2017-12-26 | 2019-07-11 | 三菱電機株式会社 | 要素類似判定装置、要素類似判定方法及び要素類似判定プログラム |
CN115145633A (zh) * | 2022-07-25 | 2022-10-04 | 杭州师范大学 | 一种基于控制流图的代码错误自动检出方法 |
-
2014
- 2014-08-13 JP JP2014164918A patent/JP2016040707A/ja active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2019114154A (ja) * | 2017-12-26 | 2019-07-11 | 三菱電機株式会社 | 要素類似判定装置、要素類似判定方法及び要素類似判定プログラム |
CN115145633A (zh) * | 2022-07-25 | 2022-10-04 | 杭州师范大学 | 一种基于控制流图的代码错误自动检出方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105446723B (zh) | 用于标识源代码版本之间的语义区别的方法和装置 | |
US10268758B2 (en) | Method and system of acquiring semantic information, keyword expansion and keyword search thereof | |
WO2014032266A1 (en) | Personal language model for input method editor | |
US9229691B2 (en) | Method and apparatus for programming assistance | |
EP3685258B1 (en) | Ranking of software code parts | |
CN105630763A (zh) | 用于提及检测中的消歧的方法和系统 | |
JP2017041171A (ja) | テストシナリオ生成支援装置およびテストシナリオ生成支援方法 | |
US20150199364A1 (en) | Data analyzing apparatus and program | |
CN108846069B (zh) | 一种基于标记语言的文档执行方法及装置 | |
US10346450B2 (en) | Automatic datacenter state summarization | |
JP2013149061A (ja) | 文書類似性評価システム、文書類似性評価方法およびコンピュータ・プログラム | |
JP2016040707A (ja) | ソフトウェア検証プログラム、ソフトウェア検証方法及びソフトウェア検証装置 | |
JP6722565B2 (ja) | 類似文書抽出装置、類似文書抽出方法及び類似文書抽出プログラム | |
KR102520305B1 (ko) | 키워드 빈도수와 영역 중요도 분석 기반 딥러닝 문서 분석 시스템 및 방법 | |
JP2018067264A (ja) | データ検索プログラム、データ検索装置およびデータ検索方法 | |
JP2006277282A (ja) | モデル評価解析システムおよびモデル評価解析プログラム | |
JP6121828B2 (ja) | 静的解析装置、静的解析方法、および、コンピュータ・プログラム | |
JP6497199B2 (ja) | プログラム試験優先順位決定システム | |
US20190294637A1 (en) | Similar data search device, similar data search method, and recording medium | |
JP2019148859A (ja) | フローダイアグラムを用いたモデル開発環境におけるデザインパターンの発見を支援する装置および方法 | |
CN108536576B (zh) | 用于对应用程序的测试脚本进行优化的方法和装置 | |
JP2018185601A (ja) | 情報処理装置及び情報処理プログラム | |
JP2018084939A (ja) | 修正支援プログラム、修正支援方法、修正支援装置、およびコンパイラ | |
JP6753190B2 (ja) | 文書検索装置及びプログラム | |
JP5971069B2 (ja) | 情報処理装置、タイトル抽出方法及びプログラム |