社団法人 電子情報通信学会
THE INSTITUTE OF ELECTRONICS,
INFORMATION AND COMMUNICATION ENGINEERS

信学技報
TECHNICAL REPORT OF IEICE.

コードクローン検出ツールの差分情報を用いた不具合検出手法の提案と評価
澤健一†

肥後 芳樹†

楠本 真二†† 大阪大学 大学院情報科学研究科 コンピュータサイエンス専攻 〒 560-8531 豊中市待兼山町 1-3
E-mail: †{k-sawa,higo,kusumoto}@ist.osaka-u.ac.jp
あらまし 近年，コードクローンに対する関心が高まってきている．コードクローンとは，主としてコピーアンドペー
スト等によってソースコード上に生じる類似したコード片のことで，コンパイラでは検出できないような潜在的な不具合を埋め込みやすいといわれている．コードクローンを検出する様々な手法があるが，各手法が用いているアルゴ
リズムが異なるため，検出されるコードクローンに差が生じる．本稿では，この差を利用して文の追加・削除や識別子の修正漏れのような，不具合の可能性が高いコードクローンのみを抽出する手法を提案し，その評価を行う．現在までに行った実験では，1 つのコードクローン検出ツールのみを用いた場合に比べて，非常に短時間で目的の不具合を発見できている．
キーワード

コードクローン，ソフトウェア保守，バグ検出

Proposal and evaluation of an approach to find bugs using difference
information of code clone detection tools
Kenichi SAWA† , Yoshiki HIGO† , and Shinji KUSUMOTO†† Graduate School of Information Science and Technology, Osaka University
1-3, Machikaneyama-cho, Toyonaka, Osaka, 560-8531, Japan
E-mail: †{k-sawa,higo,kusumoto}@ist.osaka-u.ac.jp
Abstract Code clone has recently received a lot of attention. A code clone is a code fragment that has othersimilar or identical code fragments in the source code. Most code clones are generated by ‘copy and paste’ programming. Potential bugs, which cannot be detected by compiler, are often introduced due to code clones. At
present, many code clone detection tools have been developed. However, different code clones are identified fromthe same source code by the tools since they adopt different detection algorithms. This paper proposes a method for
efficiently detecting code clones that are very likely to include bugs. A software tool has been implemented basedon the proposed method, and it was applied to LINUX source code. As a result, some bugged code clones weredetected within a short time frame.
Key words Code Clone，Software Maintenance，Bug Detection

1. は じ め にまた，コピーアンドペーストを行った際に，コピー先に合わせて識別子を変更したり，新たな文を追加したりといった修正作

近年，ソフトウェアの保守を困難にさせる要因として，コー業がしばしば行われる．この作業を慎重に行わないと，修正ミ

ドクローンに対する関心が高まってきている．コードクローン

スや修正漏れといったことが発生する可能性がある．コードクとは，ソースコード上に存在する同一もしくは類似したコード

ローンにはこのような問題が存在するため，ソースコードから片のことであり，コピーアンドペースト等によって発生する．

コードクローンを自動的に検出してその情報を用いることは，あるコード片に不具合が存在した場合や，保守変更が必要に

ソフトウェア開発や保守を行ううえで非常に有効である．

なった場合，そのコード片とコードクローンになっている全て

これまでに，コードクローンを検出する様々な手法が提案さのコード片に対して同様の修正を行わなければならない．ソフ

れているが，それらのツールはどれも異なるコードクローンのトウェアの規模が拡大するほど修正に要する作業量が増大する．

定義を用いているため，同じ対象からコードクローンを検出し

—1—

表1

各検出手法によって検出されるタイプ
検出手法

検出されるタイプ

1a 1b 2a 2b

3

Ducasse の手法 [2]

○

○

×

×

×

Baker の手法 [3]

○

○

○

×

×

Kamiya の手法 [4]

○

○

○

○

×

Wettel の手法 [5]

○

○

○

○

○

   >?@>     
ACBEDGF H
AIB,DGFGJ"$#&%('*),+.-0/21 4345768 !K= >?> O 
ACBEDGF H
AIB,DGFGJ"$#&%('*),+9-:/;1 <6=8

4L4 5MN!た場合でもツールごとに検出結果が異なる．
図 1 P-Match の例

本稿では，これら既存のコードクローン検出ツールにおける出力結果の差異に注目し，不具合の可能性が高いコードクロー
ンのみを抽出する手法を提案する．この手法により，コードク
ローンに起因する不具合を効率よく特定することができる．

タイプ 3：文の挿入，文の削除，文の変更が行われているため，文の挿入，削除，変更漏れの可能性が考えられる．
タイプ 1b のコードクローンは直接不具合の原因になる可能

2. コードクローンの分類と特徴

性は低いが，タイプ 2b，タイプ 3 のコードクローンは修正ミス

2. 1 コードクローンの分類が考えられるため，不具合の原因になる可能性が高い．本稿でBellon らは，コードクローンを次の 3 つのタイプに分類しては，これらタイプ 2b，タイプ 3 のコードクローンに注目する．

いる [1]．
タイプ 1：空白，改行位置など，コーディングスタイルのみが異なるコードクローン
タイプ 2：変数名，関数名や変数の型など，識別子のみが異なるコードクローンタイプ 3：文の挿入，削除，変更が行われたコードクローン
本稿では，このうちタイプ 1，タイプ 2 をさらに分け，5 つのタイプに分類する．
タイプ 1a：表面上完全に同一なコードクローン

図 2 は，提案手法により検出されたタイプ 2b，タイプ 3 それぞれにおける不具合の例を示している．図 2(a) では，コード 2 において変数名の修正漏れのため，不具合が引き起こされている．図 2(b) では，コード 2 において本来存在すべき必要な関数が無いため，不具合が引き起こされている．

3. 提 案 手 法
3. 1 概要表 1 で示したように，既存のコードクローン検出ツールは異タイプ 1b：空白，改行位置に違いがあるコードクローンなったタイプのコードクローンを検出する．それら異なるコー

タイプ 2a：パラメタライズドマッチング（P-Match）である

ドクローン検出ツールの差分を取ることで，特定のタイプの

コードクローン（P-Match については次節で説明する）
タイプ 2b：P-Match でないコードクローン

コードクローン情報のみを得ることができる．
例えば，Wettel の手法 [5] と Kamiya の手法 [4] の出力結果

タイプ 3：文の挿入，削除，変更が行われたコードクローンの差分を取ると，タイプ 3 のコードクローンを抽出できる．タ

表 1 に既存のコードクローン検出ツールが検出できるコード

イプ 3 のコードクローンは，文の挿入，削除，修正漏れの可能クローンのタイプをまとめる．各ツールによって検出すること性が考えられるため，コード片間の異なる文に注目することでのできるコードクローンのタイプが異なっているのが分かる．

不具合を発見しやすくなる．また，Kamiya の手法と Baker の

2. 2 パラメタライズドマッチング（P-Match）

手法 [3] の出力結果の差分を取ると，タイプ 2b のコードクロー

P-Match とは，ソースコードの比較を行うときに識別子のンを抽出できる．タイプ 2b のコードクローンは，変数名，関数対応付けを行うものである．図 1 に P-Match の例を示す．P-

名や変数の型などの修正漏れの可能性が考えられるため，コー

Match を用いている場合は，比較を行うときに識別子の違いをド片間の識別子に注目することで不具合を発見しやすくなる．

認識するので，図 1 の code1 と code2 はコードクローンでな提案手法はコードクローン検出ツールの出力結果を用い，直いと判定される．一方，P-Match を用いない場合は識別子の違接対象ソースコードの解析は行わない．そのため，差分を取得いを認識しないので，コードクローンであると判定される．

する 2 つのコードクローン検出ツールが対応してさえいれば，

2. 3 各タイプの特徴

どのようなプログラミング言語に対しても適用可能である．

各タイプに分類されたコードクローンはそれぞれ特徴が異な

2 つのコードクローン検出ツールにおける出力結果の差分をるため，起こりうる問題も異なる．以下の 3 つのタイプは，他取得するには，それぞれのツールで検出されたコードクローンのタイプに比べて問題が起こりやすいと考えられるものである．

を比較し，同一であるかどうかを判断する必要がある．同一でタイプ 1b：プログラムの意味的には同一であるが，コーディ

あると判断された場合，そのコードクローンを不要なものとし

ングスタイルが異なるため，可読性が低い可能性が考えられる．

て削除する．コードクローンの比較には，ソースコードのファタイプ 2b：変数名，関数名や変数の型などの識別子が変更

イル名とコード片の開始行，終了行の情報を用いる．コードク

されているが，P-Match になっていないため，識別子の変更漏ローンの比較に行数を用いているのは，トークン情報などをれ，もしくは変更し間違えている可能性が考えられる．

持っていないコードクローン検出ツールが存在するためである．

—2—](^`_ K     ]^Q_ a bQcWdQe0f`gUh                         M                                      !  "     #  $ $&%(' ) * )() + ,-  .
                !  " / 6  #  $ $&%(' ) '(2 < + ,-  .
                !  "  /    $ $0%1' ) %,2 3 4 + + 5  .
                !  "  /    $ $&%1' ) %1,02 3 4 + + 5  .
   6   7 + ,- 8 9 %( * ) ) : $0           ;  * ) ) + ,- < ' * 3 + + 51=
   6   7 + ,- 8(9 %( + * %: $&           ;  + * %( + ,- < ' * 3 + + 51=>    1.
>    1.
   6   7 + ,- 8 9 %( * ) ) : $0           ;  * ) ) + ,- < ' * 3 ?9 ' 2(@ '(=   6   7 + ,- 8(9 %( + * %: $&           ;  + * %( + ,- < ' * 3 ?9 ' 2(@ '1=>>   6   7 A B(C D EF GD H I(I :  "          $0J    =   6   7 A B(C D E1F G1D H I(I :  "          $0J =LN N OQPSRUTWV&XZY([U\             $LK =     1        $&K =>    .
>    1.
   6   7 + ,- 8 9 %( * ) ) : $&8 9(4 4 =   6   7 + ,- 8 9(% + * %: $&8(9 4 4 =             $J =     1        $J =>>>(a) タイプ 2b の不具合

^B_L`      ^-_S` a bScXdSefLgih          " $            O                                              ! "   #  $ " %    !      " %  # " !      "  "  &   $   "   !  #    #  % "   ! '   ( ! "                   ! "   #  $ " %    !      " %  -# " !      "  "  &   $   "   !  #    #  % "   ! '   ( ! "     )   (   #    *$  " +   $,   -). / 01 2 3 4 5 6 7 8 9 : 5 2 34 5 6 ; <) =        #  >  ? "+    &"   )"   !  #    #  @BA-C-D ! E F G H  E = @ ! @ CI = E C-J @BA-C-D ! KLE M = F   "   !  #    #  N E = @ ! D F =  % E = @ ! @ CI = E CJ 

P P QSRLTUSVXWLYXZS[BT]\)         #  B  ? "-+    &"   )"   !  #    #  @>A-C-D ! EBF GBH  E = @ ! @ CI = E C-J @>A-C>D ! KLEBM = F   "   !  #    #  N E = @ ! D F =  % E = @ ! @ CI = E CJ (b) タイプ 3 の不具合

図2

コードクローンに起因する不具合の例

以下では，コードクローン比較の精度を上げるために行う
ソースコードの正規化と，コードクローンを同一であるかどうかを判断する 2 つの条件について述べる．

3. 2 ソースコードの正規化
コードクローン検出ツールが用いている検出アルゴリズムの違いによって，ツールごとに検出されるコードクローンの開始 

 "!#%$& ')(** 
 
 !

位置，終了位置が若干異なる場合がある [1]．空行や中括弧のみである行の存在がその原因となっている．この問題を回避する(b) 正規化後(a) 正規化前ため，次のようなソースコードの正規化を行う．
図3

正規化の例

•

空行の削除

•

コメント行の削除•

不必要な空白，タブの削除

ルの差分を取ることで，タイプ 2b やタイプ 3 といった差異の•中括弧のみの行を削除し，1 つ上の行に中括弧を追加

大きなコードクローンを検出する．コードクローン検出ツール

ソースコードの正規化の例を図 3 に示す．ソースコードのは，できるだけ大きな範囲をコードクローンとして検出しよう

正規化を行うことで，コードクローン検出ツールにおけるコー
ドクローンの開始位置，終了位置の違いを減らすことができる
ので，異なるコードクローン検出ツールで検出されたコードク
ローンであっても，次に述べる一致判定の精度が向上する．

3. 3 コードクローンの一致条件 1
ここでは，コードクローンが同一であるかどうかを判断するための 1 つ目の条件を示す．
提案手法では，より差異のあるコードクローンを検出できる
コードクローン検出ツールから，その差異を検出できないツーとするため，より差異のあるコードクローンを検出可能なツールの方が，より大きな範囲をコードクローンとして検出する．
したがって，一方のツールによる検出結果がもう一方のツールによる検出結果と完全に一致，もしくは内包されている場合のみ，それらのコードクローンが同一であると判断し，互い違いになっているような場合は同一であると判断しない．
図 4 は，2 つのコードクローンを CP1 ，CP2 ，それぞれのコード片を CF1 ，CF2 としたとき，2 つのコードクローンが互いに重なり合っている例である．この例の場合，CP1 .CF1 と—3— 

   本実験では，タイプ 2b とタイプ 3 のコードクローンを抽出し．それぞれ不具合が含まれているかどうかを調査する．まず，対象ソフトウェアのコードクローンを検出する．コードクロー     

図 4 2 つのコードクローンが重なり合っている例

CP2 .CF1 において，一方のコードクローンが内包されているという条件を満たさないため，CP1 と CP2 は異なるコードク
ローンであると判断される．

3. 4 コードクローンの一致条件 2
次に，コードクローンが同一であるかどうかを判断するための 2 つ目の条件を示す．

2 つのコードクローン検出ツールによって検出されたコードンの検出は，ソースコードの正規化を行う前と行った後の 2 つのソースコードに対して行う．検出されたコードクローンに対して，提案手法を適用して差分を取得する．差分を取得するとき，ソースコードの正規化を行わずに検出したコードクローン
に対しては，コードクローンの一致条件 1 を用いない．ソース
コードの正規化を行って検出したコードクローンに対しては，
コードクローンの一致条件 1 を用いる．したがって，タイプ 2bとタイプ 3 それぞれに対して，ソースコードの正規化，コード
クローンの一致条件 1 を用いている場合と用いていない場合，
計 4 種類の実験を行っている．また，good 値は 0.7 としている．

4. 1. 1 タイプ 2b のクローン抽出に用いたツールタイプ 2b の抽出には，コードクローン検出ツールとしてクローンが完全に一致していれば問題は無いが，一方が内包さ

CCFinderX を用いた [6]．CCFinderX には P-Match を用いる

れている場合は，どの程度の割合で一致しているかを判断するか用いないかを選択するオプションが存在するため，P-Match必要がある．この判断には good 値を用いる [1]．

good 値を求める前準備として，2 つのコード片の一致割合を求める．2 つのコード片 CF1 ，CF2 の一致割合は，それぞれの行数を lines(CF1 )，lines(CF2 ) と書くと，次の式で表される．

overlap(CF1 , CF2 ) =|lines(CF1 ) ∩ lines(CF2 )||lines(CF1 ) ∪ lines(CF2 )|

この値を用いて，2 つのコードクローン CP1 ，CP2 の good
値 (p) は次のように表される．

good(CP1 , CP2 ) = min ( overlap(CP1 .CF1 , CP2 .CF1 ),overlap(CP1 .CF2 , CP2 .CF2 ))を用いない場合から用いる場合の差分を取ることで，タイプ 2bのコードクローンを抽出できる．CCFinderX では，50 トーク
ン以上のコードクローンを検出するように設定した．

4. 1. 2 タイプ 3 のクローン抽出に用いたツールタイプ 3 の抽出には，コードクローン検出ツールとしてDude [5] と CCFinder [4] を用いた．全てのタイプを検出する
Dude から，タイプ 2b までを検出する CCFinder の結果の差分を取ることで，タイプ 3 のコードクローンを抽出できる．Dudeでは 7 行以上のコードクローンを，CCfinder では 50 トークン
以上のコードクローンを検出するように設定した．

4. 2 結果

表 2 は，差分取得前と差分取得後それぞれのクローン行数とgood(CP1 , CP2 ) >=p(p ∈ [0, 1])

2 つのコードクローンにおける good 値が p 以上を満たすと
き，そのコードクローンが同一のものであると判断する．過去の研究において p の値は 0.7 が適切であると述べられており，
本稿でもこの値を用いる [1], [3]．
図 4 の例において good 値を求めると次のようになる．

5 6
5good(CP1 , CP2 ) = min( , ) = < 0.78 88

コード片の数を示している．クローン行数は，ソースコード上で重なっていても異なるコードクローンであれば重複して数えている．また，ソースコードの正規化を行うとソースコードの行数が減少するが，この表のクローン行数は，正規化前のソースコードに当てはめて行数を数えている．また，差分取得前の情報に関してはソースコードの正規化のみが影響しており，その結果検出されるコードクローンにも差が生じている．
いずれの場合でも，差分取得により大幅にクローン行数やコード片の数が削減できていることがわかる．また，ソース

good 値が 0.7 よりも小さいため，図 4 のコードクローンは

コードの正規化とコードクローンの一致条件 1 を用いることで，異なるものであると判断される．ただし，good 値が 0.7 以上

用いない場合に比べてより良い結果が出ていることもわかる．

であっても，コードクローン一致条件 1 を満たさなければ同一

表 2 における差分取得後のコードクローンの中に，実際に不であると判断されることはない．2 つの条件が同時に満たされ具合があるかどうかを調査した結果が表 3 である．表 3 では，て初めて，2 つのコードクローンが同一であると判断される．

既に修正されている不具合の箇所，修正されていないが不具合

4. 適 用 実 験の可能性が考えられる箇所，不具合ではないが可読性などの観点から修正すべき箇所を示している．

4. 1 概要タイプ 2b のコードクローンは，ソースコードの正規化とコー提案手法を実際のソフトウェアに適用することで，目的としドクローンの一致条件 1 を用いることでより多くの不具合を検ているような不具合を抽出できるかどうかを調査する．対象

出できている．一方，タイプ 3 のコードクローンは検出された

ソフトウェアは Linux2.6.6/arch である．記述言語は C 言語，

不具合の数が減少してしまっている．この理由については次章

ファイル数 2,699 個，総行数 769,467 行となっている．

で考察する．

—4—

表2

表3

差分取得の効果
クローン行数 コード片の数

正規化，一致条件 1 なし
タイプ 2b
タイプ 3

タイプ 3

不具合の

不具合ではないが

不具合

可能性有り

修正すべき

正規化，一致条件 1 なし

差分取得前

217,527

9,739

差分取得後

18,374945

タイプ 2b

4

5

5

差分取得前

260,207

11,391

タイプ 3

5

2

2

差分取得後

19,574647

正規化，一致条件 1 あり
タイプ 2b検出された不具合の数

修正済み

差分取得前

204,087

8,749

差分取得後

14,355661

差分取得前

256,813

11,080

差分取得後

16,773556

正規化，一致条件 1 あり
タイプ 2b

6

5

9

タイプ 3

3

2

2

ドクローンとして検出されていなかった．CCFinderX はトー
クンベースでコードクローンを検出しているため，本来はソースコードの正規化によって検出されるコードクローンに影響は

5. 考

察

5. 1 差分取得の効果
表 2 で示したように，差分を取得することでコードクローン無いはずである．CCFinderX のオプションが何か影響を与えている可能性が考えられるが，今のところ原因は不明である．

5. 2. 2 タ イ プ 3
表 3 を見ると，タイプ 3 のコードクローンは，ソースコー

量を大幅に削減することが確認できた．差分取得後のコードク

ドの正規化やコードクローンの一致条件 1 を用いた方が検出さローンを実際に不具合があるかどうか調査したが，いずれの場れる不具合の数が減少してしまっていた．検出されなかった 2合もおよそ 10 時間程度の調査時間であった．差分取得前に調査を行っていた場合，単純計算でも 100〜150 時間程度の調査時間が必要になる．1 日 5 時間の調査を行った場合，2,30 日かかる調査が 2 日程度で済むことになるので，提案手法が優れているということがわかるであろう．
また，既存のコードクローン検出ツールの出力結果のみを使用した場合は，あるコードクローンにどのような不具合の可能性が高いかが分からなかった．しかし，タイプ 2b のコードク
ローンであれば，コード片間で対応の取れていない識別子に注
目すれば良いし，タイプ 3 のコードクローンであれば，コード片間で異なっている文に注目すれば良い．提案手法を用いた場
合はコードクローンのどこに注目すればよいか分かっているので，調査に要する時間的コストの削減が見込めると考えられる．
一方で，差分取得により削除されたコードクローンが多数存在している．削除されたコードクローンに多くの不具合が含まれていると，提案手法の有効性が薄れてしまうことになるため，

つのコードクローンを調査したところ，そもそも差分取得前のコードクローンとして検出されていなかった．これは，ソース
コードの正規化に起因するものであった．
図 3 を見るとわかるように，ソースコードの正規化を行うとソースコードの行数が減少する．タイプ 3 の実験に用いたDude は行をベースにコードクローンを検出するツールであり，ソースコードの行数が減少すると，元のソースコードでは検出できていたコードクローンが検出できなくなってしまうことがある．その結果として，正規化を行わない場合では検出できていたコードクローンが検出されていなかったのである．
したがって，行をベースにコードクローンを検出するツールを用いる場合は注意が必要である．正規化を行う場合は，正規化を行わない場合よりもコードクローンの最小一致行数を少なくするのが 1 つの解決策として考えられる．ただし，その場合はより多くのコードクローンが検出されることになるので，不具合検出の要求に応じて適切な値を設定する必要がある．

削除されたコードクローン部分の調査が必要である．ただし，削除されたコードクローンの多くは，タイプ 1 など不具合を引

6. 関 連 研 究

き起こしにくいコードクローンであるため，この中に多くの不Li らのコードクローン検出ツール CPMiner は，タイプ 3

具合が含まれている可能性は高くないと考えている．

5. 2 正規化，一致条件 1 の効果
5. 2. 1 タ イ プ 2b
表 3 を見ると，タイプ 2b のコードクローンに関しては，ソー
スコードの正規化やコードクローンの一致条件 1 を用いた方がより多くの不具合を検出できていた．
新たに検出できた不具合のうち 1 つは，正規化や一致条件 1を用いない場合でも，コードクローン検出ツールの出力結果として検出されていた．しかし，差分を取得するときに，一致条件 1 の内包条件を満たしていないコードクローンが同一であると判断されてしまったために削除されていた．この事実により，
コードクローンの一致条件 1 の有用性がわかるであろう．
もう 1 つは，正規化を用いない場合において，そもそもコーのコードクローンも検出でき，バグ検出機能も備えている [7]．

CPMiner は C，C++で記述されたプログラムに対して適用可能である．一方，我々の提案手法は，使用するコードクローン
検出ツールが対応しているどのような言語にも適用可能である．

Li らは Linux2.6.6 に対して適用実験を行っているので，その結果と我々が提案した手法との違いを考察する．CPMiner はLinux2.6.6 全体に対して 49 個の不具合を検出している．本稿
で行った適用実験との規模の差を考えると，検出可能な不具合の数は提案手法の方が CPMiner と同等もしくはそれ以上であり，不具合の検出数に関しては我々の提案手法の方が優秀である．しかし，我々の手法は不具合でない誤検出も非常に多いため，検出精度は CPMiner の方が優秀である．

—5—

そ の 理 由 と し て 考 え ら れ る の が ，CPMiner が 行って今後の課題としては，まず差分取得によって削除されたコー

い る U nchangedRatio を 用 い た フィル タ リ ン グ で あ る ．

ドクローンの調査が挙げられる．削除されたコードクローンにU nchangedRatio は，コピーアンドペーストにおける 2 つのはどの程度の不具合が含まれているか，含まれているとすれば

コード片において，ある識別子がどの程度変更されているかの

それはどのような原因による不具合か，などといったことを調割合を表す．コピー元のコード片に存在するある識別子の総数を査することで，提案手法の有用性を確かめることができる．

N umT otal，その識別子がコピー先のコード片において変更さ本稿では，行の情報しか持っていないコードクローン検出れていない数を N umU nchanged とすると，U nchangedRatio

ツールにも対応するため，コードクローンを開始行，終了行をは次の式で表される．

用いて表現していたが，それをトークン情報に変換することがU nchangedRatio =N umU nchanged
N umT otal

できれば差分取得の精度をより高めることが可能になると考えられる．行数を用いている場合，1 行の増減によって good 値

U nchangedRatio の値は 0 から 1 で，U nchangedRatio = 0の値が大きく変わってしまう可能性があるが，トークン情報をの と き は そ の 識 別 子 が 全 て 変 更 さ れ て い る こ と を 示 す．

用いることでより正確にコードクローンの一致判定ができるよU nchangedRatio = 1 のときは，その識別子がまったく変うになるので，より精度を高めることができるであろう．

更されていないことを示す．0 ではないが，0 に近い値である

さらに，差分取得後のコードクローンに対してフィルタリン

と，コード片全体に対して変更されていない識別子が少しだけグを適用することで，より精度を高めることもできるかもしれ存在することになるため，修正漏れの可能性が非常に高くなる．

ない．適用実験において検出されたコードクローンには，同じCPMiner は，このフィルタリングを行うことでより不具合のようなコードの繰り返しを多く含むものや，デバッグ用コード

可能性が高いコードクローンを検出するようにしている．一方，の有無によってタイプ 3 のコードクローンと検出されているも我々の提案手法はこのようなフィルタリングを一切行っていなのが見受けられた．このようなコードクローンは不具合の可能いので，より誤検出が多くなってしまっていると考えられる．

性が低いため，これらを削除するようなフィルタリングを作成

Jiang らは，自身らが作成したコードクローン検出ツール

することで，さらに精度を高めることも考えている．

Deckard を用いて不具合を検出する手法を提案している [8]．

謝辞

Jiang らは，コードクローンになっている箇所を囲むような条

IJARC(マ イ ク ロ ソ フ ト 産 学 連 携 機 構) 第 3 回 CORE プ

件文に注目して不具合の検出を行っている．それら条件文がロジェクト，文部科学省 科学研究費補助金 基盤研究 (A)(課異なるものであったり，条件文の述部に不整合があるコードク

題番号:17200001)，および若手研究 (スタートアップ)(課題番

ローンを検出する．また，コードクローン間で識別子の修正漏

号:19800022) の助成を得た．

れなどがある場合も不具合として検出している．

Jiang らの手法でも，誤検出を減らすためにフィルタリングを行っている．コードクローンを囲んでいる条件文が異なっている
場合は不具合として検出するが，for 文と while 文，switch-case
文と if-else 文など，意味的に同じような処理になるものは除去している．また，条件文の述部についても，e1 < e2 と e2 > e1のように意味的に同じものは除去している．さらに，識別子の修正漏れがある場合でも，修正漏れの数が多い場合はあえて修正していない可能性が高いため除去している．

Jiang らの手法は，Linux2.6.19 全体に対して 41 個の不具合を検出している．Linux のバージョンが異なるので正確な比較は行えないが，我々が実験を行った Linux2.6.6 よりも規模が大きいので，不具合の検出数に関しては我々の提案手法の方が優秀である．しかし，Jiang らの手法もフィルタリングを行っており，検出精度は Jiang らの手法の方が優秀である．また，我々の提案手法や CPMiner との違いとして，不具合だけではなくプログラミングスタイルによる問題点も検出可能である．

7. ま と め
本稿では，コードクローン検出ツールの出力結果の差分を取ることで，不具合の可能性が高いタイプのコードクローンのみを取り出し，不具合の検出を容易にする手法を提案した．提案
手法の適用実験を行ったところ，非常に短時間で不具合を検出

文

献[1] S. Bellon, R. Koschke, G. Antoniol, J. Krinke, and E. Merlo.
Comparison and evaluation of clone detection tools. IEEE
Transactions on Software Engineering, 33(9):804–818, Sep
2007.
[2] S. Ducasse, M. Rieger, and S. Demeyer. A language independent approach for detecting duplicated code. Proc.
of the International Conference on Software Maintenance,
pages 109–118, Aug 1999.
[3] B.S. Baker. Finding clones with dup : Analysis of an enperiment. IEEE Transactions on Software Engineering,33(9):608–621, Sep 2007.
[4] T. Kamiya, S. Kusumoto, and K. Inoue. Ccfinder : A
multi-linguistic token-based code clone detection system forlargescale source code. IEEE Transactions on Software Engineering, 28(7):654–670, Jul 2002.
[5] R. Wettel and R. Marinescu. Archeology of code duplication : Recovering duplication chanins from small duplication fragments. Proc. of the 7th International Symposium
on Symbolic and Numeric Algorithms for Scientific Computing, pages 63–70, Sep 2005.
[6] CCFinderX. http://www.ccfinder.net/ccfinderx-j.html.
[7] Z. Li, S. Myagmar S. Lu, and Y. Zhou. Cp-miner : Finding
copy-paste and related bugs in large-scale software code.
IEEE Transactions on Software Engineering, 32(3):176–
192, Mar 2006.
[8] L. Jiang, Z. Su, and E. Chiu. Context-based detection ofclone-related bugs. Proc. 6th Joint Meeting on European
Software Engineering Conference and the ACM SIGSOFT
Symposium on the Foundations of Software Engineering(ESEC/FSE ’07), pages 55–64, Sep 2007.

できることが確認された．

—6—