ソフトウェアエンジニアリングシンポジウム 2012

コードクローン変更管理システムの開発と実プロジェクトへの適用
山中 裕樹1崔 恩瀞1吉田 則裕2

井上 克郎1

佐野 建樹3

概要：ソフトウェア保守における大きな問題の一つとしてコードクローンが指摘されている．コードク
ローンとは，ソースコード中に，互いに一致または類似した部分を持つコード片のことである．コードク
ローンに対する主な保守作業として，クローンセット（互いにコードクローンとなっているコード片の集合）に含まれる全てのコード片を一貫して編集する同時修正と，クローンセットを 1 つのサブルーチンにまとめる集約が挙げられる．本研究では，コードクローンに対する保守作業を支援することを目的とした
コードクローン変更管理システムの開発を行った．そして，企業で行われているソフトウェア開発に適用することによって，本システムの有用性を確かめることができた．
キーワード：コードクローン，ソフトウェア保守，変更管理A Development of Clone Change Management System
and Its Application to Actual Project
Yuki Yamanaka1

Eunjong Choi1

Norihiro Yoshida2

Katsuro Inoue1

Tateki Sano3

Abstract: Code clone is one of the major problems for software maintenance. A code clone is a code fragment that has identical or similar portion in source code. In order to manage code clones, software developers
should consider consistent modification of clone sets(i.e., a set of code clones identical or similar to each other)and merging clone set into a single function. In this study, we developed a code clone change management
system for maintenance to them. Moreover, we confirmed the usefulness of the developed system by applying
to industrial software development.
Keywords: Code Clone, Software Maintenance, Change Management

1. まえがき片の集合）に含まれる全てのコード片を一貫して編集することである．例えば，クローンセット中の 1 つのコード片

ソフトウェアの保守工程における大きな問題の一つとしに欠陥が含まれている場合，そのコード片とコードクローてコードクローンが指摘されている．コードクローンとは，ンになっている他のコード片も一貫した修正を行う必要

ソースコード中に互いに一致または類似した部分を持つが考えられる．また，集約とはクローンセットを 1 つのサ

コード片のことであり，主にコピーアンドペーストなどにブルーチンにまとめることである．集約を行うことによっよって発生する [1]．コードクローンに対する主な保守作業て，ソースコード中のコードクローンを削減することが可として，同時修正と集約が挙げられる．同時修正とは，ク能である．

ローンセット（互いにコードクローンとなっているコード
1

2

3

大阪大学
Osaka University
奈良先端科学技術大学院大学
Nara Institute of Science and Technology
日本電気株式会社
NEC Corporationc 1959 Information Processing Society of Japan

上述したコードクローンに対する保守作業を効率良く行うために，コードクローンの変更管理が必要である．例えば，欠陥を含むクローンセット中の一部のコード片が編集された場合，同時修正が行われておらず，修正漏れの可能性がある．また，ソフトウェア開発企業では，システムテ

1

ソフトウェアエンジニアリングシンポジウム 2012

ストに大きなコストを要した場合，コードクローンを集約的なコードクローン検出が行われる．本研究では，字句解し再度システムテストを行うということは，コスト面の問析ベースの検出ツールである CCFinder [2] を用いてコー

題から避けられることが多い．従って，システムテスト前

ドクローンの検出を行っている．CCFinder は，字句解析に発生したコードクローンを発見・集約することで，大きでソースコードをトークン列に変換し，変換処理で変数名なコストをかけずコードクローンを削減する必要がある．

や関数名などを同一のトークンに変換する．そして，閾値しかし，検出されたコードクローンの量が膨大となる場合，以上の長さの共通トークン列を探索し，全てのコードク同時修正が行われていないクローンセットや，新たに発生ローンの対のリストを出力する．CCFinder を用いることしたクローンセットなどの変更情報を人手で確認することによって，空白やタブの有無などのコーディングスタイ

は困難である．

ルを除いて完全に一致するコードクローンだけではなく，そこで本研究では，コード片の追加，編集，削除といった変更情報に基づいたコードクローンの分類手法を提案す

ユーザ定義名や一部の予約語のみが異なるコードクローンを検出することが可能である [3]．

る．そして，分類に基づいて，保守作業の対象となるコー
ドクローンの変更情報を定期的に開発者に通知するコード
クローン変更管理システムの開発を行った．評価実験とし

2.3 コードクローンの変更管理の必要性
コードクローンに対する主な保守作業として，以下の項て，開発したシステムを企業で行われているソフトウェア

目が挙げられる．

開発に約 40 日間適用した. 実験の結果，本システムを用い

同時修正: クローンセット中のコード片を一貫して編集ることによって，開発者は保守作業の対象となる 11 個のクローンセットを確認することができた.
本稿の構成は次のとおりである．2 節では，本研究の背景を述べる．3 節では，コードクローンの分類手法について説明する．4 節では，本研究で開発したコードクローン変すること．
集約: クローンセット中のコード片に共通するロジックを実装するサブルーチンを作り，各コード片をそのサ
ブルーチンの呼び出し文に置き換えること.
位置情報の記録: ソースコードにコメントとして，コード

更管理システムの概要について説明する．5 節では，コークローンとなっている他のコード片の位置を書くこと．

ドクローン変更管理システムの実プロジェクトに対する適上述したコードクローンに対する保守作業を効率良く行

用実験について述べる．6 節では，本研究の関連研究につうために，コードクローンの変更管理が必要である. 例えいて述べる．7 節では，本研究のまとめと今後の課題につば，欠陥を含むクローンセットの一部のコード片が修正さいて述べる．

れた場合，そのクローンセットに含まれる他のコード片に

2. 背景

ついても同様の修正を検討する必要がある．また，ソフト
ウェアのテスト終了後におけるクローンセットの集約は，

本節では，本研究の背景として，コードクローンとその不具合を生む可能性がありコストが大きい. 新たに発生し検出ツール CCFinder，および，コードクローンの変更管たクローンセットを集約の対象とすることで，バグを生む

理の必要性について述べる．

コストを小さくすることが可能である. また，集約することが困難である場合，新たに発生したコードクローンは位

2.1 コードクローン

置情報の記録の対象になる可能性がある.

コードクローン (Code clone) とは，ソースコード中にもし検出されたコードクローンの量が膨大となる場合，

存在する，互いに一致または類似した部分を持つコード片

その中から，同時修正が行われていないクローンセットやのことである [1]．一般的に，コードクローンの存在はソ新たに発生したクローンセットなど，保守作業が必要とな

フトウェアの保守を困難にすると言われている．例えば，る可能性が高いコードクローンの変更情報を人手で確認す

コードクローンとなっているコード片中に欠陥が存在するることは困難である．コードクローンの変更管理を行うこ場合，そのコード片と一致または類似した他のコード片にとによって，保守作業の対象となるコードクローンの確認

ついても同様の欠陥が含まれている可能性があり，確認がコストを削減することが可能になると考えられる．

必要である．
一般的に，互いに一致または類似したコードクローンの3. コードクローンの分類手法

対をクローンペア (Clone pair) と呼び，クローンペアにお本研究では，コードクローンの変更情報を開発者に提供いて推移関係が成り立つコードクローンの集合をクローンするため，コード片の追加，編集，削除といった変更に基

セット (Clone set) と呼ぶ．

づいたコードクローンの分類手法を提案する. 以下に，本手法の手順を示す．入力は，分析の対象となる 2 バージョ

2.2 コードクローン検出ツール CCFinder
ソフトウェアの規模が大きい場合，ツールを用いた自動c 1959 Information Processing Society of Japan

ンのソースコード Vt−1 ，Vt である．Vt は最新バージョンのソースコード，また，Vt−1 は 1 つ前のバージョンのソー2

ソフトウェアエンジニアリングシンポジウム 2012

るコード片をその開始行番号と終了行番号の対応に基づい2行削除て求め，そのコード片 B がコードクローンとなっている場

4行挿入

A

de

de

A

B
2行挿入

B

Vt-1

係を定義する．
Vt-1

Vt

Vt

Δt

Δt

(a) ケース 1(b) ケース 2

図 1

合，コードクローン A とコードクローン B の間に親子関

コードクローンの親子関係

Fig. 1 Parent-child relationship of code clones

3.2 コードクローンの分類
まず最初に，任意のコードクローン X について以下の 4つの命題を定める．

• P (X) : X の親クローンが存在する
スコードを表す．また，Vi のソースコードに含まれる全て• C(X) : X の子クローンが存在するのコードクローンの集合を Ci と表す．

• M (X) : 2 バージョン間で X が編集されている

手順 1:• CP (X) : X の親クローンと X がクローンペアである

Vt−1 ，Vt に CCFinder を適用し，コードクローン

集合 Ct−1 ，Ct の検出を行う．
手順 2:

コードクローンの変更情報を分析するために，本手法では, これらの命題を用いて 2 バージョン間のソースコード Vt−1 ，Vt に含まれる全てのコードクローンを以Ct−1 に含まれるコードクローンと Ct に含まれるコー

下の 5 項目に分類している．

ドクローンの対応関係を求める必要がある．そこで，

Stable Clone: P (X) ∧ ¬M (X) を充足するコードクロー

3.1 節で説明する定義に基づいて，コードクローンのン X ∈ Ct とその親クローンを指す．すなわち，Stable

親子関係を求める．

Clone は，2 バージョン間で変更がないコードクロー

手順 3:

3.2 節で説明する定義に基づいて，2 バージョンのソースコードに含まれる全てのコードクローンを分類する．

ンを意味する．

Modified Clone: P (X) ∧ M (X) ∧ CP (X) を充足する
コードクローン X ∈ Ct とその親クローンを指す．す3.3 節で説明する定義に基づいて，2 バージョン

なわち，Modified Clone は，変数名の変更などの編集のソースコードに含まれる全てのクローンセットを分がなされたが，編集後も同じクローンセットに属する

類する．

コードクローンを意味する．

手順 4:

Moved Clone: P (X) ∧ M (X) ∧ ¬CP (X) を充足する
3.1 コードクローンの親子関係

コードクローン X ∈ Ct とその親クローンを指す．すコードクローンの変更情報を分析するためには，Ct−1 になわち，Moved Clone は，文の挿入など大幅な編集が含まれるコードクローンと Ct に含まれるコードクローン

なされたため，異なるクローンセットに属するようにの対応関係を求める必要がある．本手法では，文献 [4] のなったコードクローンを意味する．

コードクローンの履歴分析と同様の手法を用いてコードク

Added Clone: ¬P (X) を充足するコードクローン X ∈ローンの親子関係を求める．ここでは，あるコードクロー

Ct を指す．すなわち，Added Clone は，コード片のン A ∈ Ct−1 に対応するコードクローンが B ∈ Ct である

コピーアンドペーストなどによって Vt で新たに発生場合，コードクローン B をコードクローン A の子クローン，コードクローン A をコードクローン B の親クローンと定義する．
図 1 はコードクローンの親子関係の例を示している. 図

1(a) では，コードクローン A ∈ Ct−1 の前で 4 行の挿入としたコードクローンを意味する．

Deleted Clone: ¬C(X) を 充 足 す る コ ー ド ク ロ ー ン
X ∈ Ct−1 を指す．すなわち，Deleted Clone は，クローンセットの集約やコード片の削除などによって除去されたコードクローンを意味する．

2 行の削除が行われているため，A に対応するコード片 Bの開始行番号と終了行番号は，それぞれ A の開始行番号と3.3 クローンセットの分類

終了行番号に 2 行追加した値となる．B が Ct に含まれる

本手法では, 2 バージョン間のソースコード Vt−1 ，Vt に場合，コードクローン A の子クローンはコードクローン B

含まれる全てのクローンセットを以下の 4 項目に分類してとなる．また，図 1(b) では，コードクローン A の前で編いる（図 2）．

集操作は行われていないため，対応するコード片 B の開始

Stable Clone Set: 図 2 のクローンセット A のように，

行番号は A の開始行番号と同じになる．一方 A に 2 行のVt−1 ，Vt の 2 バージョンに渡って存在するクローン

挿入が行われているために，B の終了行番号は A の終了

セットで，属するコードクローンが全て Stable Clone

行番号に 2 行追加した値となる．B が Ct に含まれる場合，に分類されるクローンセットを指す．

コードクローン A の子クローンはコードクローン B とな

Changed Clone Set: Vt−1 ，Vt の 2 バージョンに渡っる．このように，あるコードクローン A ∈ Ct−1 に対応すて存在するクローンセットで，属するコードクローン

c 1959 Information Processing Society of Japan3

ソフトウェアエンジニアリングシンポジウム 2012

Clone Set A

Clone Set A

StableStableStableStableClone Set B

Clone Set B

ソースコードの取得
ソースコードの更新

版管理システム

StableModified

Modified

変数名の変更StableClone Set C

Changed

コードクローン
変更管理システム

開発者( ユーザ )

Added

ウェブサーバ

Added

コピー

Clone Set D
DeletedDeleted

HTMLファイル生成

ウェブユーザインタフェースの提供

StableNew
テキストファイル生成

集約
テキストベースの
電子メールによる通知
メールサーバ

DeletedClone Set E
Clone Set E

図 3

StableStableStableStableコードクローン変更管理システムの処理の流れ

Fig. 3 Process of code clone change management system
Changed

Moved
文の挿入

Moved

Clone Set F
Moved

文の挿入

フェースの提供を実現している．

Moved

Vt-1

Vt

コードクローン変更管理システムの処理手順を以下に示Newす（図 3）．なお，本システムでは，ソフトウェア開発に
Δt

CVS*1 ，Subversion*2 などの版管理システムを用いることを想定している．
手順 1: 最新バージョンのソースコード Vt を版管理シス

クローンセット

コードクローン

コード片テムから取得する．Vt−1 は過去のバージョンのソース

親子関係

コードであるため，前回の分析時に最新バージョンと

図 2 コードクローン・クローンセットの分類例

して分析したソースコードを Vt−1 として用いる．

Fig. 2 Example of categorization of code clones and clone sets

手順 2: 3 節で説明した手法で，Vt−1 と Vt のソースコーに１つでも Stable Clone 以外のコードクローンが含ドに含まれるコードクローン，および，クローンセッ

まれるクローンセットを指す．例えば，図 2 のクロートの分類を行う．

ンセット B は一部のコードクローンのみが編集され，

手順 3: 手順 2 の分類結果に基づいて，HTML ファイル

Modified Clone に分類されている．また，クローンと電子メールによる通知のためのテキストファイルのセット E では，一部のコードクローンに対して文の生成を行う．

挿入がなされたため，Vt では異なるクローンセット

本システムでは，手順 3 で生成したテキストファイルを添

F を形成している．このように，同時修正がなされ付した電子メールを送信することによって，開発者への通ておらず，修正漏れの可能性があるクローンセットは知を行なっている．また，情報提示に必要な HTML ファ

Changed Clone Set に分類される．

イルをウェブサーバ上に生成することによって，開発者は

New Clone Set: Vt のみに存在するクローンセットを指す．例えば，図 2 のクローンセット C のようにコー

ウェブブラウザを通して保守作業の対象となるコードク
ローンの変更情報を詳細に確認することが可能となる．

ド片のコピーアンドペーストなどによって新たに発生したクローンセットを意味する．

本システムによって，変更されたコードクローンの分類
情報を開発者に提供する利点を以下に示す．

Deleted Clone Set: Vt−1 のみに存在するクローンセッ• 新たに発生したクローンセットは，保守作業の対象とトを指す．例えば，図 2 のクローンセット D のようなる可能性がある．従って，New Clone Set に分類さに集約などによって除去されたクローンセットを意味れたクローンセットを確認することで，集約，あるいする．

は，位置情報の記録が必要となるクローンセットを把4. コードクローン変更管理システム

握することができる．

• Stable Clone と Modified Clone, Moved Clone が同時

本研究では，3 節で説明したコードクローンの分類に基に含まれる Changed Clone Set を確認することで，同づいて，保守作業の対象となるコードクローンの変更情報

時修正が行われていないクローンセットを把握するこを開発者に提供するコードクローン変更管理システムの開とができる．

発を行った．分析結果の提供方法として，テキストベースの電子メールによる通知とウェブベースのユーザインタ

c 1959 Information Processing Society of Japan*1*2

http://www.cvshome.org/.
http://subversion.tigris.org/

4ソフトウェアエンジニアリングシンポジウム 2012*************************************************************@1*************************************************************@1.0:MODIFIED ¥src¥main¥org¥apache¥tools¥ant¥listener¥MailLogger.java 375.9‐380.34@1.1:STABLE ¥src¥main¥org¥apache¥tools¥ant¥ﬁlters¥FixCrLfFilter.java 143.13‐148.34@1.2:STABLE ¥src¥main¥org¥apache¥tools¥ant¥ﬁlters¥FixCrLfFilter.java 144.13‐149.43@1.3:STABLE ¥src¥main¥org¥apache¥tools¥ant¥taskdefs¥MacroInstance.java 248.9‐253.25‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐### @1.0### ¥src¥main¥org¥apache¥tools¥ant¥listener¥MailLogger.java
372
}
373
// convert the replyTo string into a vector of emailaddresses
374
Vector replyToList = vectorizeEmailAddresses(values.replytoList());<START MODIFIED CLONE>
375
mailer.setHost(values.mailhost());
376
mailer.setPort(values.port());
377
mailer.setUser(values.user());
378
mailer.setPassword(values.password());
379
mailer.setSSL(values.ssl());
380 +mailer.setEnableStartTLS(values.star ls());<END MODIFIED CLONE>‐
mailer.setEnableStartTLS(values.ssl());
381
Message mymessage =382
new Message(values.body().length() > 0 ? values.body() : message);383
mymessage.setProject(project);‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐#######################################
䝥䝻䝆䜵䜽䝖ྡ:Ant
2012/XX/XX#######################################
䛆䝣䜯䜲䝹᝟ሗ䛇⥲䝣䜯䜲䝹ᩘ䠖1193㏣ຍ䝣䜯䜲䝹ᩘ䠖8๐㝖䝣䜯䜲䝹ᩘ䠖1䝁䞊䝗䜽䝻䞊䞁䜢ྵ䜐䝣䜯䜲䝹ᩘ䠖506
䛆䜽䝻䞊䞁䝉䝑䝖ศ㢮᝟ሗ 䛇
Stable Clone Set䠖1676
Changed Clone Set䠖29
New Clone Set䠖34
Deleted Clone Set䠖10䛆䝁䞊䝗䜽䝻䞊䞁ศ㢮᝟ሗ䛇
Stable Clone䠖5578
Modified Clone:21
Moved Clone䠖60
Added Clone䠖40
Deleted Clone䠖25(a) プロジェクト情報(b) クローンセット一覧
図 4

テキストファイルの出力例

Fig. 4 Example of text-based visualization

4.1 電子メールを用いた通知
電子メールに添付されるテキストファイルの例として，

Apach Ant プロジェクト*3 のある 2 バージョン間に適用した結果を図 4 に示す．テキストファイルには以下の情報が出力される．

• プロジェクト情報（図 4(a))– ファイル情報: 総ファイル数，追加ファイル数，削除ファイル数，コードクローンを含むファイル数を示す．

– コードクローン分類情報: コードクローンの各々の分類数を示す.
(a) クローンセット一覧ページ– クローンセット分類情報: クローンセットの各々の分類数を示す．

• クローンセット一覧 (図 4(b))
Changed Clone Set, New Clone Set, Deleted Clone
Set に分類されたクローンセットの一覧が出力される*4 ．図 4(b) は Changed Clone Set に分類されたク
ローンセットの一例を示している．各々のクローンセットに関して，ク以下の情報を出力している．

– クローンセット ID– クローンセットに属するコードクローンの一覧– コードクローンとなっているコード片4.2 ウェブユーザインタフェースの提供
ウェブユーザインタフェースの例として，Apach Ant プ(b) ソースファイルページ
図 5 ウェブユーザインタフェースの例

Fig. 5 Example of web-based user interface• Deleted Clone Set は，集約された事によってクローン

ロジェクトのある 2 バージョン間に適用した結果を図 5 に示す．本稿では紙面の都合上，クローンセット一覧ページとソースファイルページについて説明する．

• クローンセット一覧ページ（図 5(a)）
2 バージョン間に含まれるクローンセットの一覧が，セットを形成しなくなった可能がある．従って Deleted

Clone Set を確認することで，集約されたクローンセッ
トを把握することができる．

c 1959 Information Processing Society of Japan*3*4

http://ant.apache.org/.
Stable Clone Set は変更がないクローンセットであるため，ユー
ザに提供する価値は低くテキストベースの通知では省略している.

5

ソフトウェアエンジニアリングシンポジウム 2012

図 6

クローンセットの分類

Fig. 6 Categorization of clone sets

Changed Clone Set，New Clone Set，Deleted Clone

トウェアの実装言語は Java であり，ファイル数は約 350，

Set，Stable Clone Set の順で表示される．また，各々行数は約 12 万である．コードクローン変更管理システムをのクローンセットに関して，属するコードクローン

2011/12/18 から 2012/01/31 の約 40 日間適用し，1 日毎の一覧が表示される．各々のコードクローンは，ID，に，電子メールによる開発者への通知とウェブユーザイン

分類，コードクローンが含まれるソースファイル名，

タフェースの更新を行った．なお，本実験では CCFinder

ソースファイル中のコードクローンの位置が表示さのトークンの閾値をデフォルトである 30 に設定した．それる．Modified Clone，Moved Clone，Added Clone，して，コードクローン変更管理システムの有用性を評価す

Deleted Clone の 2 バージョン間で変更されたコードク

るために，アンケートを実施した．アンケートの対象者は，ローンはハイライトされ，見やすくなっている．コー

Java 言語の経験が 10 年以上のプロジェクトマネージャー

ドクローン ID をクリックすることによって，そのコーであり，コードクローンの管理を行っている．主なアン

ドクローンが含まれるソースファイルページへ移動

ケート内容を以下に示す．

する．

Q1 保守作業の対象となったコードクローンの存在を既• ソースファイルページ（図 5(b)）
コードクローンが含まれるソースファイルが表示されに知っていたかQ2 どのような保守作業を行ったかる. コードクローンとなっているコード片は黄色の背• 集約

景色が付いている．“+”は追加行を，“-”は削除行を示• 同時修正し，削除行は灰色の背景色がついている．

• 位置情報の記録

5. 適用実験• その他
5.1.2 結果と考察

実験として，企業で行われているソフトウェア開発に対アンケートの結果，開発者はコードクローン変更管理

してコードクローン変更管理システムの適用を行った. 適システムを用いて保守作業の対象となる 11 個のクローン用実験の目的は以下の通りである．

セットを発見することができたことがわかった. 表 1 左部

• 開発者がコードクローン変更管理システムを用いて保は，保守作業の対象となった各々のクローンセットに対す守作業が必要となるコードクローンを発見することがるアンケートの回答を示している．保守作業の対象となっできたか，本システムの有用性を評価する．

たのは，主に機能追加によって発生したコードクローンで• 保守作業の対象となったコードクローンの特徴を調査する．

ある．Q1 に対する回答は全て “NO” であり，これらのク
ローンセットは本システムを用いて新たに発見することができたものである. この結果から，本システムの有用性が5.1 実プロジェクトに対する評価実験
5.1.1 実験内容評価できる.
図 6 は，1 日毎のクローンセット数の遷移と，それぞれ

本研究では，日本電気株式会社のウェブアプリケーショのクローンセットの分類数を示している．この結果，実際

ンソフト開発を対象に評価実験を行った．対象としたソフに変更があったクローンセットは最大でも全体の 8.9%であc 1959 Information Processing Society of Japan6

ソフトウェアエンジニアリングシンポジウム 2012

表 1

保守作業の対象となったクローンセット

Table 1 Clone sets that required additional maintenance
検出日

Q1

Q2

RAD(S)LEN(S)RNR(S)

NIF(S)

POP(S)DFL(S)’11/12/28

NO

集約

1

36

83

2

2

36

’11/12/28

NO

集約

0

141

78

1

2

141

’12/01/13

NO

集約

1

48

95

7

7

288

’12/01/13

NO

位置情報の記録

3

54

90

2

2

54

’12/01/13

NO

集約

0

52

61

1

2

52

’12/01/13

NO

集約

0

57

94

1

2

57

’12/01/13

NO

集約

0

32

93

1

2

32

’12/01/16

NO

集約

0

37

83

1

2

37

’12/01/16

NO

集約

2

32

84

2

3

64

’12/01/18

NO

集約

0

53

90

1

2

53

’12/01/24

NO

集約

0

72

86

1

3

144

表 2

マンホイットニー U 検定の結果

Table 2 Result of Mann-Whitney U test
RAD(S)LEN(S)RNR(S)

NIF(S)

POP(S)DFL(S)

p値

0.51060.24190.03680.59550.27930.2283

帰無仮説

採択

採択

棄却

採択

採択

採択

ファイル集合が，ファイルシステムの中でディレクト
リ構造的にどれだけ分散しているかを表す．

RNR(S)
100

LEN(S): クローンセット S 中のコード片のトークン数

90の平均値を表す．

80

RNR(S): クローンセット S 中のコード片がどの程度非

70
60
50

繰り返しであるかを表す．f をクローンセット S 中の40

コード片，T OC(f ) をコード片 f を構成している字句

30の数，T OCrepeated(f ) をコード片 f を構成している

20

字句のうち，繰り返し要素の字句の数を表すとする．

10
0

集約対象
のクローンセット

集約対象以外のクローンセット

図 7 RNR(S) メトリックの比較

Fig. 7 Comparison of RNR(S) metric

このとき RNR(S) は以下の式で表される．
∑
f ∈S T OCrepeated(f )∑RN R(S) = 1 −f ∈S T OC(f )RNR(S) が低い場合，“ソフトウェア開発・保守を行う視点でコードクローン情報を扱う場合に特に対象とする必要が無いもの”である可能性が高いことがわかっることがわかった．従って，全クローンセット数は約 850
から 950 であり，その全ての中から保守作業の対象となる
コードクローンの変更情報を人手で発見することは困難であると考えられる．従って，本システムを用いることによって保守作業の対象となるクローンセットの変更情報を確認するコストを削減できたと考えられる．

ている [7]．

NIF(S): クローンセット S 中のコードクローンを所有するファイルの数を表す.

POP(S): クローンセット S 中のコード片単位の要素数を表す．

DFL(S): クローンセット S 中の全コード片を集約した
5.2 保守作業の対象となったコードクローンの調査
5.2.1 調査方法

場合，減少が予測されるトークン数を表す．
本実験では，集約対象のクローンセットと保守作業の対本実験では，Gemini [5], [6] を用いてクローンセットメ

象以外のクローンセットの各々のメトリクス値の分布に対トリクスの抽出を行った．あるクローンセット S が与えらして違いがあるか否か，マンホイットニー U 検定を用いれたとき，Gemini で分析することができるクローンセッて調査した．なお，同時修正が必要であったクローンセッ

トメトリクスを以下に示す．

トは確認できなかったため，集約の対象となったクローン

RAD(S): クローンセット S 中のコード片が含まれるセットについてのみ分析を行う. ここでは，“集約対象のクc 1959 Information Processing Society of Japan7

ソフトウェアエンジニアリングシンポジウム 2012

ローンセットと集約対象以外のクローンセットの間でメト

企業で行われているソフトウェア開発に適用し，その有用リクス値による違いがない”という帰無仮説が棄却される性を確かめることができた．

か否か，有意水準 0.05 で片側検定を行った．

今後の課題として，以下が考えられる．

5.2.2 調査結果

• 長期に渡る適用と，様々なプロジェクトに対して本シ

表 1 の右部に保守作業の対象となったクローンセットのステムの有用性を評価する必要がある．また，コード

各々のメトリクス値を示す. また，表 2 に各々のメトリク

クローン，クローンセットの分類の妥当性も評価する

ス値におけるマンホイットニー U 検定の結果を示す．

必要がある．

この結果，RNR(S) のみが帰無仮説が棄却され，集約対• 今回のアンケート対象者はプロジェクトマネージャ一

象のクローンセットと集約対象以外のクローンセットの間人であったが，他の開発者からのフィードバックも調で違いが大きいことがわかった．図 7 では，集約対象と査する必要がある．

なったクローンセットの RNR(S) メトリック値とそれ以外• 保守作業の対象となる可能性が高いコードクローンのの RNR(S) メトリック値の分布を比較している．この図か情報を開発者に提示できるように，システムを改善す

ら，RNR(S) のメトリック値が比較的大きいクローンセッ

る必要がある．具体的には，RNR(S) メトリック値にトが集約の対象として選ばれていることがわかる．開発者

基づいたフィルタリングが考えられる．

からも，変数宣言の羅列などのコードクローンが多く検出

謝辞 本研究において様々な御協力を頂いた日本電気株

されているとフィードバックがあった．これらの結果か

式会社 三橋二彩子 氏，岩崎新一 氏に深く感謝する．また，ら，RNR(S) メトリック値によるフィルタリングを行うこ

本研究は日本学術振興会 科学研究費補助金 基盤研究（A）とによって，集約の対象となる可能性が高いクローンセッ（課題番号:21240002），基盤研究（C)（課題番号:22500026）

トを開発者に提示することが可能となると考えられる．

の助成を得た．

6. 関連研究
本研究と同様にコードクローンの履歴を調査する研究と

参考文献
[1]

して，文献 [8] がある．この研究では，クローンセットの履歴に対してモデルを定義し，長期間に渡って分析するこ[2]とによってコードクローンの存在する期間とその特徴の関係について調査を行っている．文献 [8] では，分析の対象となっているのはクローンセットのみであるが，本研究で[3]はコードクローンも詳細に分類を行っている．また，本研
究はソフトウェア開発者への保守作業の対象となるコード
クローンの変更情報の提供を目的としている．そのため，[4]

コードクローン変更管理システムの開発を行い，企業で行われているソフトウェア開発に適用することによって，そ[5]の有用性を評価している．
また，本研究と同様に，企業のソフトウェア開発に適用した研究として文献 [7], [9] が挙げられる．文献 [7] では，[6]

産業界への適用と意見交換に基づいて，本研究でも利用した Gemini の改良を行っている．本研究では，ユーザである日本電気株式会社の開発者からのフィードバックに基づ[7]

いて，コードクローン変更管理システムの有用性の評価，および，保守作業の対象となったコードクローンの特徴の[8]調査を行っている．

7. まとめと今後の課題
本研究では 2 バージョン間のコード片の変更に基づいた[9]

肥後芳樹，楠本真二，井上克郎：コードクローン検出とその関連技術，電子情報通信学会論文誌，Vol. J91-D, No. 6,
pp. 1465–1481 (2008).
Kamiya, T., Kusumoto, S. and Inoue, K.: CCFinder: A
multilinguistic token-based code clone detection system
for large scale source code, IEEE Transactions on Software Engineering, Vol. 28, No. 1, pp. 654–670 (2002).
Bellon, S., Koschke, R., Antoniol, G., Krinke, J. andMerlo, E.: Comparison and evaluation of clone detection tools, IEEE Transactions on Software Engineering,Vol. 31, No. 10, pp. 804–818 (2007).
川口真司，松下誠，井上克郎：版管理システムを用いたクローン履歴分析手法の提案，電子情報通信学会論文誌，Vol. J89-D, No. 10, pp. 2279–2287 (2006).
Ueda, Y., Kamiya, T., Kusumoto, S. and Inoue, K.: Gemini: Maintenance support environment based on code
clone analysis, Proc. of METRICS ’02, pp. 67–76 (2002).
Higo, Y., Kamiya, T., Kusumoto, S. and Inoue, K.:
Method and Implementation for Investigating Code, Information and Software Technology, Vol. 49, No. 9-10,
pp. 95–98 (2007).
肥後芳樹，吉田則裕，楠本真二，井上克郎：産学連携に基づいたコードクローン可視化手法の改良と実装，情報処理学会論文誌，Vol. 48, No. 2, pp. 811–822 (2007).
Kim, M., Sazawal, V., Notkin, D. and Murphy, G. C.: An
empirical study of code clone genealogies, Proc. of SIGSOFT/FSE ’05, pp. 187–196 (2005).
吉村健太郎，ガネサンダルマリンガム，ムーティックディ
ルク：プロダクトライン導入に向けたレガシーソフトウェ
アの共通性・可変性分析法，情報処理学会論文誌，Vol. 48,
No. 8, pp. 2482–2491 (2007).

コードクローンの分類手法を提案した．そして，分類に基づき，保守作業の対象となる可能性があるコードクローンの変更情報を開発者に提供することを目的としたコードク
ローン変更管理システムの開発を行った．さらに，実際に

c 1959 Information Processing Society of Japan

8