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

信学技報
TECHNICAL REPORT OF IEICE.

ソフトウェア開発におけるコピーアンドペーストによって生じたコード片に対する調査
大田 崇史†

井垣

宏†

堀田

圭祐†

肥後

芳樹†

楠本 真二†† 大阪大学大学院情報科学研究科 〒 565-0871 大阪府吹田市山田丘 1-5
E-mail: †{t-ohta,igaki,k-hotta,higo,kusumoto}@ist.osaka-u.ac.jp
あらましソフトウェア開発における生産性の向上等を目的として，コピーアンドペーストを伴うソースコードの再利用が行われている．コピーアンドペーストによるプログラミングには，生産性の向上といったメリットの他に，コ
ピー元に含まれるバグがコピー先に伝搬してしまうといった問題点があることも知られている．そのため，ソース
コード中の類似したコード片（コードクローン）をコードクローン検出ツールを用いて特定し，修正の必要なコード片の特定やリファクタリング候補の特定といった支援が行われている．一方で，コードクローン検出ツールはツールによる自動生成コードやテストケースといったコピーアンドペーストを伴わないコードクローンも数多く検出することで知られている．そこで本研究では，開発者によるコピーアンドペーストとコードクローン検出結果の間にどの程度乖離があるか，またその差異が具体的にどのようなものであるかを実際のソフトウェア開発プロジェクトを対象として分析した．結果として，既存の検出ツールはコピーアンドペーストの 74.6% を検出できず，CDSW の検出結果の 95.7%がコピーアンドペーストを伴わないコードクローンであった．
キーワード

コードクローン，コピーアンドペースト，コードクローン検出ツール

An Empirical Study on Copy and Paste ofCode in Software Development.
Takafumi OHTA† , Hiroshi IGAKI† , Keisuke HOTTA† , Yoshiki HIGO† , and Shinji KUSUMOTO†† Graduate School of Information Science and Technology, Osaka University Yamadaoka 1-5, Suita-Shi,
Osaka, 565-0871 Japan
E-mail: †{t-ohta,igaki,k-hotta,higo,kusumoto}@ist.osaka-u.ac.jp
Abstract In order to improve productivity etc. copy and paste programming is performed. It is known that not
only source code but bugs are also copied between file in copy and paste programming. Therefore, code clone detection tools which extract the identical or similar code fragments (called code clone) in a source code are proposed.
On the other hand, it is also known that code clone detection tools detect lots of code clones which include thesource code which is not generated by copy and paste. In this paper, we analyzed the diﬀerence between the codefragments generated by copy and paste, and the code clone detection result, through actual software development
project. As a result, a conventional code clone detection tool did not detect 74.6% of the code fragments generated
by copy and paste, and 95.7% of the result detected by the tool are not generated by copy and paste.
Key words Code Clone, Copy and Paste, Code Clone Detection Tool

1. ま え が きをコピーし，開発対象に貼り付ける，コピーアンドペーストによるプログラミングがよく行われるようになってきている [1]．

ソフトウェア開発において，ソースコードの再利用は開発効

一方で，ソースコードのコピーアンドペーストによる再利用率や信頼性の向上に有用であると言われている．特に，ソースには問題も存在する．ソースコードのコピーアンドペーストをコードが公開されているオープンソース・ソフトウェアやソー行う際，コピー元のコード片がバグを含むと，コピー先のコー

スコード検索システムの普及に伴い，開発者が既存のコード片

ド片もバグを含むことになる．そのため，バグ修正ではコピー—1—

元のコード片に加えコピー先のコード片の修正が必要になる．

望ましい．

バグを含むコード片が複数箇所にコピーされた場合，コピー元

Type-3 のコードクローンを検出する手法として，抽象構文のコード片と全てのコピー先のコード片についてバグ修正を行木を用いた検出手法，プログラム依存グラフを用いた検出手法，

う必要がある．しかし，全てのコピー元とコピー先を把握する

関数メトリクスを用いた検出手法，Smith-Waterman アルゴリ

ことは困難であるため，コピーアンドペーストは保守作業を困

ズム [14] を用いた検出手法 [6] などが存在する．

難にする要因の一つとされている [2]．

ソースコードを対象としたコピーアンドペーストとは，ある

この種のコピーアンドペーストによる再利用を特定するため

ソースファイルの一部あるいは全部のコード片を開発者が一時に，コードクローン検出ツールが良く利用される [3] [4]．コー

的にコピーし，コピー元のソースファイルとは別のファイルもドクローンとはソースコード中に存在する互いに類似または一

しくは同一ファイルの別箇所に貼り付けることを指す．本稿で致したコード片のことであり，コピーアンドペーストや同一処は特に，コピー元及びコピー先のファイルが同一プロジェクト

理の繰り返し記述で発生する．コードクローン検出ツールを利に含まれるようなコピーアンドペーストを対象とする．すなわ

用することで，コードクローンを検出し，修正の必要なコード

ち，異なるプロジェクトや Web 上に存在するソースコードが片の特定やリファクタリング候補の特定 [5] といった様々な支

コピー元となる場合を対象としない．コピーアンドペーストに援が可能となる．

よるソースコードの再利用を特定する目的で，コードクローン

一方で，コードクローン検出ツールによって検出されるコー検出ツールが使われている [10]．

ドクローンには，ツールによる自動生成コード等の開発者によ

2. 2 コードクローン検出の課題

るコピーアンドペーストを伴わない類似コード片も数多く含ま

コードクローン検出ツールによって検出されるコード片には，れる．しかしながら，開発者によるコピーアンドペーストを伴コピーアンドペーストによらないものが多く含まれる．例えば，

うコードクローンとそれ以外の理由によって類似しているコー

ツールによる自動生成コードやテストケース，単純な Java オ

ドクローンの違いを分析した既存研究は存在しない．

ブジェクト等において，開発者がコピーアンドペーストしたわ

そこで本研究では，複数人による小規模ソフトウェア開発プ
ロジェクトを対象とし，開発者によるすべてのコピーアンドけでは無いにもかかわらず，コード片が類似しているために，
コードクローンであると判断されることがある．

ペースト行動の特定を行った．さらに，その結果とコードク

このようなツールによる自動生成コードやテストケースに起ローン検出ツール「CDSW [6]」による結果を比較し，ツール

因するコードクローンは，コードクローン検出結果に悪影響をによる結果と開発者によるコピーアンドペーストの違いを分析及ぼすことがあると考えられている．そのため，Goede ら [9]した．その結果，CDSW はコピーアンドペーストの 74.6% をは，コードクローンに対する開発者の修正頻度やリスクを分析検出できず，CDSW の検出結果の 95.7%がコピーアンドペー

する際に，ツールによる自動生成コードをコメントから類推し，ストを伴わないコードクローンであった．

コードクローン検出対象から排除している．同様に，石原 [11]2. コードクローン検出技術

ら，Harder [12] らは自動生成コードを，[13] らはテストケース
をコードクローン検出の対象から排除している．

本節ではコードクローンの分類を説明し，コードクローンの一方で，コピーアンドペーストとコードクローン検出結果の検出ツールを紹介する．また，本稿におけるコピーアンドペー

間にどの程度乖離があるかは必ずしも分析されていない．そこ

ストを定義し，コードクローン検出ツールにおける課題を示す．

で本研究では，コピーアンドペーストとコードクローン検出結2. 1 コードクローンの分類

果の差異がどの程度あり，その差異が何に起因するものである

コードクローンはその類似性に基づき 3 つのタイプに分類でかをケーススタディにもとづいて明らかにする．

きる [7] [8]．

Type-1 空白やタブの有無，括弧の位置などのコーディング
スタイルに依存する箇所を除いて，完全に一致するコードク
ローン．

3. ソフトウェア開発プロジェクトにおけるコピーアンドペーストの抽出
本節では，コードクローン検出ツールの検出結果とコピーア

Type-2 変数名や関数名などのユーザ定義名，また変数の型なンドペーストを比較するために，実際のコピーアンドペースト

ど一部の予約語のみが異なるコードクローン．

を特定する仕組みを提案する．

Type-3 Type-2 における変更に加えて，文の挿入や削除，変更が行われたコードクローン．なお，類似するコード片間の非共通部分のことをギャップと呼ぶ．

3. 1 キーアイデア
コピーアンドペーストを行う際，開発者は対象となるソース
ファイルからコード片を選択し，コピーアンドペーストを行う

タイプごとに対応するコードクローン検出ツールが存在する．

コード片をクリップボードに保存する．その後，コピー先ソー

コピーアンドペーストにおいては，コピーアンドペースト後スファイルを開き，貼り付けたい箇所を選択し，クリップボーに，コピー先の関数名や変数名などにあわせてペーストを行っドに保存されたコード片を貼り付ける．そこで我々はクリップ

たコードの変更が行われることが多い．そのため，コピーアン

ボードに着目し，コピーアンドペーストを特定する．コピーア

ドペーストの特定においては，Type-2 以上，文の挿入等も考

ンドペースト特定に利用する各種ログを以下に示す．

慮する場合は，Type-3 のコードクローンが検出できることがクリップボードログ クリップボードに文書が保存された時刻—2—

を特定する．

__________________

Step2:コピーアンドペースト先の特定

コピー元候補𝑡𝑡𝑑𝑒𝑙𝑎𝑦
𝑟𝑏𝑎𝑠𝑒

𝑑𝑖𝑓𝑓1

1
𝑟𝑏𝑎𝑠𝑒

𝑑𝑖𝑓𝑓2

比較
𝑑𝑖𝑓𝑓1

この Step では，まずコピーアンドペースト時刻より前のリビジョンのうち，最新のリビジョン rbase を抽出する．次に，

… 比較

類似度が
類似度が
𝑑𝑖𝑓𝑓2
高い
高い

図1

の特定を行う．
__________________

比較

貼り付けた
と判定

ピーアンドペーストが行われたか（コピーアンドペースト先）

𝑚
𝑟𝑏𝑎𝑠𝑒

𝑑𝑖𝑓𝑓𝑚
…

____________________________________…

2
𝑟𝑏𝑎𝑠𝑒

Step2 では，図 1 に示すようにコピーアンドペーストコードとソースファイル編集履歴を用いて，どのファイルに対してコ

貼り付けて
ないと判定
類似度が
高い

𝑑𝑖𝑓𝑓𝑚

貼り付けた
と判定

貼り付けた
と判定

貼り付けられたかの判定i
rbase から一定時間 ｔdelay 以内に記録されたリビジョン rbase（

0 < i < m）についてリビジョンが古いものから順に rbase との差分 diﬀi を抽出する．抽出した差分とコピーアンドペースト
コード間の類似度を比較することで，対象の差分を含むファイルがコピー先であるかを判定する．ここで，コピーアンドペー
ストコード candidate と diﬀi の類似度 sim(candidate, diﬀ )を以下の式 1 で定義する．

(コピーアンドペースト時刻)，保存した開発者及び文書 (コピーsim(candidate, dif fi ) =アンドペーストコード) の内容

levenshtein(candidate, dif f )(1)length(candidate)

アプリケーション実行履歴 どの開発者がどのアプリケーショ

levenshtein は 2 つの文字列のレーベンシュタイン距離を表し，ンを用いてどのファイルをいつからいつまで開いていたか

length は文字列の長さを表す．つまり，式（1）は，コピーアン

ソースファイル編集履歴 開発者ごとに，どのソースファイル

ドペーストコードの文字列の何割を編集すればリビジョン間のがどのように編集されたかを保持する．ソースファイルは一定差分と一致するかを表しており，小さければ小さいほどコピーア

時刻あるいは開発者がファイルを保存したタイミングごとに版

ンドペーストコードを貼り付けた確率が高いということを表す．

管理されており，特定のリビジョンが保存された時刻とファイ

ここではある閾値 Th を用いて，sim(candidate, dif fi ) < Th

ル内容が保持されている．

のときコピーアンドペーストコードが貼り付けられた．つまり，クリップボードログに保存されたすべての文書を対象として，

コピーアンドペーストが行われたと判定する．本稿では Th を

下記 Step にもとづいてコピーアンドペーストの特定を行う．

0.3 とした．なお，閾値 Th を 0 としないのは，ソースファイ

Step1: アプリケーション実行履歴及びソースファイル編集履

ル編集履歴に，コピーアンドペーストコードが貼り付けられた歴より，コピーアンドペースト元がどこであるかを特定する．

直後のソースファイルが必ずしも保存されているとは限らない

Step2: Step １の結果とソースファイル編集履歴より，コピーiためである．あるリビジョン rbaseと rbase の差分からコピーア

アンドペースト先がどこであるかを特定する．

ンドペーストコードが貼り付けられたと判定された場合，判定以降では，各 Step の詳細について述べる．

i+1
以降のリビジョンについては，処理を打ち切る．つまり，rbase

3. 2 コピーアンドペーストの特定差分の抽出及び差分とコピー元候補の抽出を行わない．

クリップボードログには，開発者，時刻，コピーアンドペー
ストされたコード片が保存されている．すべてのコピーアンド
ペーストされたコード片を対象として以降の Step1,2 を行う．

Step1:コピーアンドペースト元の特定以上の Step により，クリップボードログに保存されたすべての文書からコピーアンドペーストを特定する．

4. ケーススタディ

コピーアンドペーストされた各コード片について，コピーア

本節では，大学院生向け講義 Cloud Spiral の講義中に開発

ンドペースト元を特定する．ここでは，開発者がクリップボーを行ったプロジェクトについてコピーアンドペーストの抽出及ドに文書をコピーした時刻を利用し，その時刻に対象の開発者

び，コードクローンの検出を行った結果を述べる．

がどのアプリケーションを用いてどのファイルを開いていたか

4. 1 Cloud Spiralをアプリケーション実行履歴より特定する．ここでは，開発者

Cloud Spiral とは大学院生向けの講義で 2013 年度は西日本が開いていたファイルがコピーアンドペーストの特定を目指すの 9 大学から 49 人が受講した．Cloud Spiral では，5 又は 6

プロジェクト内のファイルであるかを調査する．Web ページや人で構成される班を 9 班作り，開発を行った．開発対象は全別のプロジェクトのファイルが開かれていた場合は，コピーア

チーム共通で，2013 年度はチケットの購入を行う web アプリ

ンドペーストコードを廃棄し，終了する．

ケーションを作成した．開発期間は連続する 4 日間の 10:30〜

対象プロジェクト内のファイルを開いていたことが確認され17:00 で，各プロジェクトの総行数は平均して約 5000 LOC でた場合，コピーアンドペーストされた時刻時点での対象ファイあった．開発は統合開発環境 Eclipse 上で行い，版管理システルの内容をソースファイル編集履歴から取得し，コピーアンドムとして SVN を用いた．本稿では，ある 1 つの 6 人班に対ペーストコードがどのファイルからコピーされたものであるかして行ったコピーアンドペーストの抽出及び，コードクローンの検出結果について述べる．この班の開発したプロジェクトは—3—

5028 LOC であった．
4. 2 Cloud Spiral で収集したログ
本小節では，Cloud Spiral で収集したログについて述べる．

IdentifyingEventForm form=new IdentifyingEventForm();
form.setEventId("abc");boolean actual=form.validate();Cloud Spiral では前節で述べたクリップボード，アプリケー

コピー元

ションの実行履歴及びソースファイルの編集履歴を収集した．
ソースコードの編集履歴の保存は Dropbox を用いて行った．

Cloud Spiral のプロジェクトは SVN で管理していたが，それとは別にプロジェクト開発履歴収集のために Dropbox を用いた．本プロジェクトでは，すべての受講生は eclipse を利用してIdentifyingEventForm form=new IdentifyingEventForm();
form.setEventId("");
boolean actual=form.validate();おり，eclipse プラグインとして，編集中のソースファイルを 1

コピー先分ごとに保存する機能を追加した．結果として，すべてのソー
スファイルは Dropbox 上に 1 分毎に保存されることになった．

図2

コード片が小さく検出できないコピーアンドペースト

本稿の実験対象とする班について，1130 件のクリップボー
ドのログ ，11879 件のアプリケーション実行履歴及び 360967

する．

リビジョンのソースファイル編集履歴を収集した．

Step2: Step1 の結果にもとづいて，最終成果物における 2 つ

4. 3 抽出したコピーアンドペーストのコピーアンドペーストコードとコピーアンドペースト時にク

前小節で示したログを元にコピーアンドペーストの抽出を

リップボードログとして記録されたコピーアンドペーストコー

行った．コピーアンドペーストの特定結果を表 1 に示す．1130

ド間の類似度を式 1 と同様の方法で算出する．このとき，コ

件のクリップボードログの内，288 件の文書が対象プロジェク

ピー元，コピー先いずれか一つでも類似度が閾値 0.5 を超えた

ト外から複製されたものであった．プロジェクト内からクリッ

ときに，消失したと判定する．

プボードに保存された文書 842 件の内，実際にコピーアンド

コピーアンドペーストが存在する場合は，CDSW の結果とペーストが行われたと特定されたものは 264 件であった．さら比較するためにコピー元及びコピー先の開始，終了行番号を記に，その中から java ファイルにおけるコピーアンドペースト

録する．

の詳細を表 2 に示す．java ファイルにおけるコピーアンドペー

4. 4 コードクローンの検出

ストは 171 件で，コメントに関するコピーアンドペーストが

コードクローン検出ツールとして CDSW [6] を用いて，プ

67 件，ソースコードのコピーアンドペーストが 104 件であっロジェクトの最終成果物についてコードクローンの検出を行った．コメントは今回利用したコードクローン検出ツールで検出た結果， 329 個のコードクローンが検出された．CDSW ではされないため，比較対象から除外した．ソースコードのコピー

最小クローン長と許容ギャップ数を変更できる．最小クローン

アンドペーストの内 47 件はコピー元又はコピー先が開発の過長及び，許容ギャップ数はコードクローンとして認める最小の程で消失し，55 件は最終成果物に存在した．ここで消失したか

トークン数，許容するギャップの数を示す．本稿では，最小クどうかの判定については，下記の Step で行った．

ローン長を 30 ，許容ギャップ数 3 とした．

Step1: コピーアンドペーストされたコピー元及びコピー先のコピーアンドペースト時点のソースコードと SVN 上に保存された最終成果物の同一ファイルとを目視で比較を行い，最終成5. コピーアンドペーストと
コードクローンの比較

果物におけるコピーアンドペーストコードの開始行・終了行

本節では，前節で収集したコピーアンドペーストとコードクをコピー元ファイル，コピー先ファイルそれぞれについて特定

ローンについて比較を行った結果について述べる．最終成果物についてコードクローンの検出を行ったため，最終成果物に存表 1 抽出したコピーアンドペーストの内訳

在するコピーアンドペースト 55 個と，ツールによって検出さファイルの種類 検出数［個］

れたコードクローン 329 個について比較を行った．CDSW は

java

171

ブロック単位でコードクローンの検出を行い，コードクローン

html

34

txt

50

xml

9

合計

264

をブロックの開始行，終了行及びファイルパスで表す．そこで
本研究では同一のパスを持つコピー元ファイルとコピー先ファ
イルに含まれるコピーアンドペーストコードの開始行，終了行
がツールによって検出されたコードクローンの開始行，終了行

表 2 java ファイルについて抽出したコピーアンドペーストの間に含まれれば CDSW の検出結果とコピーアンドペースト

検出数［個］が一致したものと判定する．CDSW の検出精度を測る評価指開発過程で消失49

標として 適合率（precision ） 及び 再現率（recall ）を定義す

最終成果物に存在

55

コメント

67

る．CP を最終成果物に存在するコピーアンドペーストの集

合計

171

合，Clone を検出したコードクローンの集合とする．このとき，—4—

public void testExcute02() throws Exception {Date ticket = DateFormat.getDateInstance().parse("2013/12/21");
Date event = DateFormat.getDateInstance().parse("2030/1/11");

public void testExcute05() throws Exception {LoginController loginController = new LoginController();
IdentifyingAccountForm account = new IdentifyingAccountForm();
account.setUserId("user1");
account.setPass("upass1");loginController.execute(account);

RegisterEventController controller = new RegisterEventController();
RegisteringEventForm entity = new RegisteringEventForm();
entity.setDescription("test2");
entity.setEventDate(event);
entity.setEventName("Test");entity.setTicketStartDate(ticket);

Date ticket = DateFormat.getDateInstance().parse("2013/12/21");
Date event = DateFormat.getDateInstance().parse("2030/1/11");
RegisterEventController controller = new RegisterEventController();
RegisteringEventForm entity = new RegisteringEventForm();
entity.setDescription("test2");
entity.setEventDate(event);
entity.setEventName("Test");entity.setTicketStartDate(ticket);
EventInfoEntity eventInfo = controller.execute(entity);
assert(false);}

EventInfoEntity eventInfo = controller.execute(entity);
assert(false);
}

コピー先

コピー元
図 3 不一致部分が多く検出できないコピーアンドペースト

え，CDSW で検出できなくなった．許容ギャップ数を増やすこ

precision 及び recall を以下の式で定義する．
|CP ∩ Clone|
precision =|Clone|recall =|CP ∩ Clone|
|CP |

(2)
(3)

とで不一致部分を多く含むコピーアンドペーストも検出できるが，誤検出率も高くなると考えられる．わずかではあるが，これらの例とは別に検出できないコピーアンドペーストとして複数のブロックにまたがるコードをコピーアンドペーストがあっ

最終成果物に存在するコピーアンドペーストと，検出した

た．CDSW はブロック単位でのコードクローン検出を行うた

クローンについて比較を行った結果，|CP ∩ Clone| = 14，

め，このようなコピーアンドペーストは検出できない．表 4 に|CP | = 55，|Clone| = 329 であった．よって，式 2，式 3 よ検出漏れとなったコピーアンドペーストの内訳を示す．

り precision = 0.0425，recall = 0.2545 となった．precision

5. 2 コピーアンドペーストを伴わない
コードクローンの特徴と recall が低い，つまり，ツールによるコードクローン検出結果とコピーアンドペーストは一致しないことが分かる．特に

CDSW が誤検出したコードクローンの例を図 4 に示す．図

CDSW で検出したコードクローンのほとんどがコピーアンド

4 ではコードクローンペアの両方がテストケースから検出されペーストを含まないことが分かる．

ている．テストでは，あるメソッドを特定の引数で呼び出した

5. 1 検出漏れしたコピーアンドペーストの特徴

結果が期待する動作をするか調べるというようにある程度処理

図 2 に CDSW で検出できなかったコピーアンドペーストの表 3 検出漏れとなったコピーアンドペーストの原因例を示す．図 2 の例では，コピーアンドペーストで作成した原因

コード片が小さいこと，つまり，コピーしたコード片に含まれるトークン数が少ない事が検出漏れの原因だった．CDSW は
コードクローンとして検出するものの最小のトークン数を設定

検出漏れ数［個］

トークン数が少ない

25

ギャップを含む

14

複数のブロックを含む

2

できる．本実験では，最小トークン数を 30 として行ったが検出漏れとなったコピーアンドペーストの内，25 個のコピーア
ンドペーストのトークン数が 30 よりも少なかった．これらの表 4 検出したコードクローンペアの分類
コードクローンペアの分類

検出数［個］

コピーアンドペーストを除外して再度再現率を計算した結果

2 つのコード片をテスト対象から検出

0.4242 となった．CDSW の設定を変更することでトークン数

テスト対象とテストケースから 1 つずつ検出が少ないものについてもコードクローンとして検出することができるが，より小さなコード片もコードクローンとして検出す

1142 つのコード片をテストケースから検出

314

合計

329

るため，再現率が低くなる．

表 5 抽出したコピーアンドペーストの内訳

十分なトークン数を含むにも関わらず，CDSW で検出でき

最終成果物に存在［個］

CDSW で検出［個］

なかったコピーアンドペーストを図 3 に示す．図 3 はコピー

テスト対象

10

3

先においてコピー元の塗りつぶした部分が削除されている．そテストケース45

11の結果，不一致部分を多く含み CDSW の許容ギャップ数を越

合計

55

14

—5—

public void testValidate02() throws Exception {IdentifyingAccountForm idAccForm =new IdentifyingAccountForm();
idAccForm.setUserId("0123456789AB");
idAccForm.setPass ("abcdefg01234");
boolean actual = idAccForm.validate();assertTrue(actual);}

れ）は 74.6 % で，CDSW がコピーアンドペースト以外を検出する場合（コピーアンドペーストを伴わないコードクローン）は 95.7% であった．検出漏れをしたもののほとんどが，コピー
アンドペーストしたコード片のトークン数がコードクローンとして認める最小トークン数よりも少ない事が原因であった．また，（コピーアンドペーストを伴わないコードクローンの 99 %がテストケースに関するコードクローンであった．これは，テ

public void testRegisteringSeatCategoryForm1() throws Exception{
RegisteringSeatCategoryForm registeringSeatEntity =new RegisteringSeatCategoryForm();
registeringSeatEntity.setCount(1);registeringSeatEntity.setEventId("100");
registeringSeatEntity.setFee(0);registeringSeatEntity.setSeatName("a");boolean actual = registeringSeatEntity.validate();assertTrue(actual);}
図4

コピーアンドペーストを伴わないコードクローンの流れが決まっている．図 4 のコードクローンペアは両者とも，クラスのフィールド値を変化させ，そのフィールド値の検査が正しく行われるかをテストする．このように，テストケースは処理が似通う傾向にある．また，CDSW は変数名や関数名が異なるコードクローンを検出するために，ユーザ定義名をすべて特殊文字に置換する．例えば，a = b.getc(); という文と d =e.getf(); という文を同一とみなす．よって，処理が似通うコー
ド片のペアをコードクローンとして検出する可能性がある．
テストケースが検出結果に与える影響を調べるために CDSWが検出したコードクローンペアを 1）2 つのコード片が共にテスト対象から検出されるもの．2）片方のコード片がテスト対象からもう一方が，テストケースから検出されるもの．3）2 つのコード片が共にテストケースから検出されるもの．に分類した結果，表 4 が示すように，ほぼ全てのコードクローンはテス
トケースから検出されていることがわかった．また，コピーア
ンドペーストではないと判断されたコードクローンの内 99 %がテストケースに関連するコードクローンであった．以上より，
テストケースがコードクローン検出ツールの検出結果に与える影響は大きいと考えられる．
そこで，テストケースを除外した場合について CDSW の検
出精度を調べた．表 5 はコピーアンドペーストにおける，テスト対象とテストケースの内訳を示す．テストケースを除外したときに |CP ∩ Clone| = 3，|CP | = 10，|Clone| = 11 とな
り，CDSW の検出精度は precision = 0.2727，recall = 0.3となった．

6. お わ り に
本稿ではソフトウェア開発中で行われたコピーアンドペー
ストとコードクローン検出ツール CDSW の検出結果を比較した．比較に向けて，ソフトウェア開発中のログを利用してコ
ピーアンドペーストを抽出する手法を提案した．比較の結果，

CDSW がコピーアンドペーストを検出できない場合（検出漏ストの構造が類似することが原因だと考えられる．
今後は，より多くのデータを集めることでコピーアンドペー
ストに関する知見を得る予定である．本稿では，Cloud Spiralの開発における 1 つの班の開発データを用いて，コードクロー
ンとコピーアンドペーストの比較を行った．別の班の開発データを用いた比較をすることで，より信頼度の高い結果を得られると考えられる．
文

献[1] Zhang, G., Peng, X. and Zhao, Z. X. W.: Cloning Practices: Why Developers Clone and What can be Changed,
Proceedings of the 28th International Conference on Software Maintenance, pp. 285-294 (2012).
[2] Zibran, M. F. and Roy, C. K.: The Road of Software Clone
Management: A Survey, Technical Report, University of
Saskatchewan (2012).
[3] 肥後芳樹，楠本真二，井上克郎：コードクローン検出とその関連技
術，電子情報通信学会論文誌，Vol. 91-D, No. 6, pp. 1465-1481(2008).
[4] 神谷年洋，肥後芳樹，吉田則裕：コードクローン検出技術の展開，
コンピュータソフトウェア，Vol. 28, No. 3, pp. 28-42 (2011).
[5] 堀田圭佑, 肥後芳樹, 楠本真二, ”プログラム依存グラフを用いた
コードクローンに対するテンプレートメソッドパターン適用支援手法,” 電子情報通信学会論文誌 D, volume J95-D, number
7, pages 1439-1453, 2012 年 7 月.
[6] Hiroaki Murakami, Keisuke Hotta, Yoshiki Higo, Hiroshi
Igaki, and Shinji Kusumoto, ”Gapped Code Clone Detection with Lightweight Source Code Analysis,” In Proc. ofthe 21st International Conference on Program Comprehension, pages 93-102, May 2013.
[7] S. Bellon. Detection of software clones. Technical Report, Institute for Soft- ware Technology, Universityof Stuttugart, 2003. available at http://www.bauhausstuttgart.de/clones/.
[8] S. Bellon, R. Koschke, G. Antniol, J. Krinke, and E. Merlo.
Comparison and evalua- tion of clone detection tools. IEEE
Trans. on Software Engineering, Vol. 31, No. 10, pp. 804818, October 2007.
[9] N. Goede and R. Koschke, ”Frequency and Risks of Changes
to Clones”, ICSE 2011.
[10] L. Heinemann, F. Deissenboeck, M. Gleirscher, B. Hummel,
M. Irlbeck. On the Extent and Nature of Software Reuse inOpen Source Java Projects. Top Productivity through Software Reuse, pp. 207222, 2011.
[11] 石原 知也, 堀田 圭佑, 肥後 芳樹, 井垣 宏, 楠本 真二 , ”大規模なソフトウェア群を対象とするメソッド単位でのコードクロー
ン検出,” 情報処理学会論文誌, volume 54, number 2, pages
835-844, 2013 年 2 月.
[12] J. Harder and N. Goede, ”Cloned code: stable code”, Journal of Software Evolution and Process 2013.
[13] L. Barbour, F. Khomh, and Y. Zou, ”Late Propagation in
Software Clones”, ICSM 2011.
[14] T. F. Smith and M. S. Waterman.: Identication of common
molecular subsequences. Journal of Molecular Biology, Vol.
147, No. 1, pp. 195-197, Mar. 1981.
[15] ”Eclipse”. http://www.eclipse.org.

—6—