情報処理学会論文誌

Vol.56 No.6 1471–1480 (June 2015)

メソッド呼び出しの差異に基づくコードクローンの分類手法
石尾 隆1,a)

伊達 浩典1,b)

井上 克郎1,c)

受付日 2014年9月19日, 採録日 2015年3月4日

概要：本論文は，Java プログラムに出現するコードクローンの分類として，コードクローンが出現するメ
ソッドに共通の振舞いを提供するかどうかという基準を提案する．この基準によって，メソッド呼び出しに差異があるコードクローンを，多少の差異はあっても共通の振舞いを提供するコードクローンと，異なる振舞いを提供するコードクローンとに分類することを可能とする．分類を自動的に行うために，メソッ
ドのサマリ抽出技術として提案されている既存の経験的な基準を応用して，コードクローンに出現するメ
ソッド呼び出しがメソッドの振舞いに与える影響を調べる手法を定義した．
キーワード：コードクローン，Java，静的解析，ソースコード差分抽出

Classiﬁcation of Code Clones based on Method Call Diﬀerences
Takashi Ishio1,a)Hironori Date1,b)Katsuro Inoue1,c)Received: September 19, 2014, Accepted: March 4, 2015

Abstract: This paper proposes a classiﬁcation technique for code clone in Java program using a new criterion: whether a clone set provides the same behavior to methods or not. The criterion distinguishes code
clones that provide the same behavior from code clones that provide diﬀerent behavior. To automate theclassiﬁcation process, this paper deﬁnes a technique to analyze the relationship between method calls in code
clones and behavior of methods including the code clones. The technique employs heuristics originally used
for automatic summarization of a Java method.
Keywords: code clone, Java, static analysis, source code diﬀerencing

1. はじめにローンを検出する [4] が，許容する差異は，検出方法に基づいて定義されたものであり，開発者の意図に対応するわ

コードクローンとは，ソースコード中に存在する互いにけではない．たとえば，CCFinder [5] は識別子などの名前一致または類似した部分を持つコード片のことである．1の違いを無視すると同一のトークンの系列となるようなつの変更を行うために複数のコードクローンを一貫して

コード片をコードクローンとして検出するツールであり，修正する必要が生じる場合があるため，コードクローンはコピーされたソースコードに名前の変更があってもコード「不吉なにおい」の 1 つであると認識されている [1]．コー

クローンとして検出することができる．しかし，名前だけドクローンの検出を目的としたツールは多数存在しておが異なるという字句的な特徴を持つコードクローンが，開り，企業におけるソフトウェア製品の分析にも活用されて発者にとってどのような意味があるかは明らかではなく，いる [2], [3]．

その中から分析する価値のあるコードクローンを選定する

多くのコードクローン検出ツールは，ソースコードの比ことは困難である．開発者が分析対象のコードクローンを較において多少の差異を許容することで有用なコードク

効果的に選択するためには，コードクローンの意味的な特1徴に基づく分類が必要である．

a)
b)
c)

大阪大学
Osaka University, Suita, Osaka 565–0871, Japanishio@ist.osaka-u.ac.jp
h-date@ist.osaka-u.ac.jp
inoue@ist.osaka-u.ac.jp

c 2015 Information Processing Society of Japan


本研究では，コードクローンの意味に基づく分類方法として，コードクローンに含まれるメソッド呼び出しに着目

1471

情報処理学会論文誌

Vol.56 No.6 1471–1480 (June 2015)

し，メソッド呼び出しの差異がコードクローンを含むメ

コードクローン検出は，複製されたソースコードを自動

ソッドの振舞いに影響を与えるかどうかという基準での的に検出する技術である．複数の人間が同一の機能を実装

コードクローンの分類を提案する．これにより，多少の差したとしても同一のコードになることは珍しい [11] ことか

異はあっても共通の振舞いを提供するコードクローンと，ら，ソースコード断片を何らかの基準で比較して類似した

異なる振舞いを提供するコードクローンとを区別する．前ものを選び出すと，多くは意図的にコピーされたものであ者のクローンはアプリケーション固有の処理やビジネスロると期待できる．一方で，ソースコードをコピーしたとしジックに関連し，リファクタリングや変更時の影響波及のても，それが元のコードと同一であるとは限らない．たと分析に有益な情報であることが見込まれる．また，後者はえばコピー先で使用している変数名に合わせて，コピーし複数の機能の実装に共通する実装上の特徴を理解するためたソースコード中の変数名を変更することがある [4].

に有益であると考えられる．分類を自動的に行う方法とし

コードクローンにおけるソースコードの差異の度合いにて，Java のメソッドのサマリを自動抽出する Sridhara ら

ついては，以下の分類が知られている [12], [13]．

の手法 [6] で提案された経験的な基準を応用する．この基タイプ 1 空白やタブの有無などのコーディングスタイル

準を用いると，メソッドの振舞いを説明するサマリに含めを除き，内容が完全に一致するコードクローン．

るべき重要なメソッド呼び出しの列を抽出することができ

タイプ 2 変数名やメソッド名などのユーザ定義名，またるため，コードクローンの範囲に含まれるメソッド呼び出

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

しが複数のメソッドに同一のサマリの内容を提供するな

タイプ 3 タイプ 2 の変更に加え，任意の文の挿入や削除

ら，それらのコードクローンは共通の振舞いを提供すると判定する．
提 案 手 法 を コ ー ド ク ロ ー ン 検 出 ツ ー ル CCFinder のが行われたコードクローン．
タイプ 4 類似した処理を実行するが，構文上の実装が異なるコードクローン．

コードクローンを対象として実装し，Qualitas Corpus

検出できるコードクローンのタイプはツールによって異な20130901r [7] に収録されたソフトウェアを対象とした分析

り，Roy ら [13] はツールが複製されたコード片への変更をを実施した．その結果，(1) メソッドのサマリに影響するどれだけ許容するか，という観点からツールの機能を特徴

メソッド呼び出しと，そうでない呼び出しに差異がある確付けている．

率に違いはなく，偏った分類にはならないこと，(2) 提案

本研究で使用する CCFinder [5] は，識別子などの名前を手法で得られる分類が，同一の振舞いを異なる変数や定数無視すると同一となるトークン列を探索し，一定以上の長などを参照して実行するためのコードクローンと，同一のさのものをタイプ 2 のコードクローンとして検出するツー

変数や定数を用いて異なる振舞いを実行するためのコードルである．CCFinder は多くの研究や企業で使用されておクローンとを区別していること，(3) リファクタリング対り [14]，後継ソフトウェアに当たる AIST CCFinderX [15]象となるコードクローンを選定するために使用されたメトも広く利用可能であることから，CCFinder が検出するコー

リクス [8] による単純な並べ替えなどで特定の分類に属す

ドクローンを調査対象とした．

るコードクローンを取り出すことは期待できないことを確認した．

CCFinder が検出するコードクローンを効果的に分析するために，コードクローンの長さ（LEN）や同一と見なさ本論文の構成は次のとおりである．2 章では研究の背景れるコードクローンの数（POP），より小さなコード片のであるコードクローン検出技術とメソッドのサマリ抽出技

繰り返しでないことを示す指標（RNR）などのメトリクス

術について解説する．3 章では本研究の提案であるコードが提案されており，単純な代入文の繰り返しなどによってクローンの自動分類手法について記述する．4 章では手法

偶然発生するコードクローンは，RNR の値を用いたフィを実際のコードクローンに適用した結果を示す．5 章で妥

ルタリングによってその多くを結果から取り除くことがで当性への脅威について整理し，6 章でまとめを述べる．

きる [16]．取り出されたコードクローンからリファクタリ

2. 背景
2.1 コードクローン検出
開発者がソースコードをよく複製して再利用すること

ング対象の候補を選定するためにこれらのメトリクスを組み合わせた事例も報告されている [8] が，リファクタリン
グの判断自体は開発者が個別に確認しており，メトリクスに基づく自動的な分類がなされているわけではない．

は，Kim らによって報告されている [9]．Zhang らによるインタビュー調査 [10] では，開発者がソースコードを複製

2.2 コードクローン内部のコードの比較する理由として，再利用による作業時間の節約に加えて，検出されたコードクローンのコード内容を比較すること

機能ごとに利用するコードを複製しておくことで各機能をで，そのコードクローンの特徴を理解しようという研究は独立して変更できる状態に保ちたいという要求があげられ

いくつか行われている．Hayase ら [17] は，コードクローている．

ンに出現する識別子の対応関係を分析し，1 つのコード片

c 2015 Information Processing Society of Japan

1472

情報処理学会論文誌

Vol.56 No.6 1471–1480 (June 2015)

でのある変数 x の出現が，そのコードとクローンであるよ
うな他のコード片で x と y の 2 つに対応している場合，変数の名前の変更し忘れの可能性があるとして警告を出す
ツールを提案している．Xing ら [18] は，開発者がコードクローンの意味的な差異を分析するツールとして，一対のコードクローンの制御フローやデータフローの違いを可視化するビューアを提案した．開発者は可視化された結果から差分を理解する必要があり，本研究のような機械的な分図 1

サマリ抽出のコード例 [6]Fig. 1 An example code for summary extraction [6].

類とは目的が異なる．Lin ら [19] は，3 つ以上のコード片が互いにコードクローンであるような場合に，それらの共pileRegex というような同一の動詞を持つメソッド呼通部分と差分とを効果的に閲覧できるツールを提案していび出しは，実装の詳細を表現しているため重要である．

る．このツールも，差分から機能の差異を理解する作業そControlling：上記の基準で選ばれたプログラム文の実行のものは開発者に委ねている．

を直接制御するプログラム文は重要である．

Choi ら [20] は，検出されたコードクローンの字句的なData-Facilitating：上記の基準で選ばれたプログラム文

類似度の違いと，コードクローンに対して適用されるリに直接データを供給するプログラム文は重要である．

ファクタリングに関係があることを報告している．字句的Filtering：log や debug などの特定の名前で始まるメソッ

な類似度だけでは使用されるリファクタリングを特定する

ド呼び出しは，その動作がメソッドの目的に合致しなことはできないとも報告しており，字句的な特徴がコード

い限り，重要ではないと考える．また，例外ハンドラ

クローンの分類には不十分であることを示している．

に出現する文や，x==null の形の条件文で実行される

工藤ら [21] は，コードクローンにおける変数名やメソッ

例外処理と思われる文も，重要ではないと考える．

ド名の差異の有無を調査し，1 つのコード片が他の場所にそれぞれの経験的な基準の先頭に表記した名称は，それぞコピーされて変更されたとしても，識別子に 1 対 1 の対応

れ実装の詳細について述べる際のルールの識別に用いる．

関係があることを報告している．そのため，コードクロー

本来の Sridhara らの手法は，これらの条件で選ばれたプンとして抽出されたコード片に出現するメソッド名などに

ログラム文に出現する単語を収集し，自然言語の文章へと差異があっても，何らかの関係がある可能性が高いが，具変換する．プログラム文には一般的な代入文や四則演算も体的にどのような差異があるかまでは調査に含まれてい含まれるが，それらはコメントに反映されることがなく，ない．また，工藤ら [22] は，コードクローンに含まれるメ

メソッド呼び出しを主な情報源として用いていることから，

ソッド呼び出しの比較において，Sridhara らの手法 [6] を本研究ではメソッド呼び出しの分類手法として適用する．

元にして選択されるメソッド呼び出しのほうがコードク

本研究では，この手法で抽出されるメソッド呼び出しのローン間で差異が少ないと報告している．本研究では，工列を，単に「メソッドのサマリ」と呼ぶ．2 つのメソッド

藤ら [22] のサマリ抽出のアイディアをコードクローンの分のサマリが同一であればそれらの振舞いが同一であると期類手法へと拡張し，分類結果の妥当性についての議論も新待できるため，コードクローンに由来するサマリが同一で規に行っている．

あれば，コードクローンがそれらのメソッドに同一の振舞いを提供するためのものであると判断できると考えた．

2.3 メソッドのサマリの抽出

メソッドのサマリの抽出例を，図 1 に示すメソッドを用

Sridhara ら [6] は，「メソッドの振舞いを説明するコメン

いて説明する．まず，このメソッドの 6 行目で呼び出されトの内容としてふさわしい」プログラム文を抽出し，それる append メソッドが，メソッドの末尾で実行されているをコメントに変換する技術を提案した．プログラム文にはため，メソッドのサマリに含まれる．この呼び出しの引数

様々なものがあるが，Sridhara らはサマリに対する重要性である result は 5 行目で計算されているため，そこで呼として，以下の経験的な選択基準をあげている．

び出される evaluate もメソッドのサマリに含まれる．4

Ending：多くのメソッドでは，何らかの準備を行ってか

行目の addElement は戻り値が利用されておらず，副作用

ら実際の処理を実行するため，メソッドの末尾に出現に意味があると考えられるため，メソッドのサマリに含まするプログラム文は重要である．

れる．3 行目の getEnteredText はそれにデータを供給すVoid-Return：戻り値が使われていないか，戻り値の型る役割を持っているが，get から始まる名前のメソッドなのが void であるメソッド呼び出し文は，システムに対すで，メソッドのサマリには含まれない．2 行目の getShell

る副作用を持つため重要である．

は，サマリに含めない 3 行目へのデータ供給であり，同Same-Action：メソッドと同じ意味の操作をするプログ様にメソッドのサマリには含まれない．結果として，このラム文，たとえば compile というメソッド中で com-メソッドのサマリに含まれるメソッド呼び出しは 4 行目

c 2015 Information Processing Society of Japan


1473

情報処理学会論文誌

Vol.56 No.6 1471–1480 (June 2015)の addElement，5 行目の evaluate，6 行目の append とのメソッド呼び出しが，クローンセットに含まれる他なる．Sridhara らのサマリ抽出手法で最終的に出力されるのコードクローンすべてと同一であるか．

サマリは，これらのメソッド呼び出しとその引数を文章のコードの差異を分析するときには，すべての出現に共通な雛形に当てはめてつなげたもの，すなわち「Add input to

コードとそれ以外の可変部分を分けて考えることが重要と

history. Evaluate input, and get result. Append result toなる [23] ため，クローンセット全体で同一であることを判

Shell.」という文となる．開発者がこのメソッド全体をコ定基準としている．いずれの基準も，メソッド呼び出しのピーして新しいメソッドを定義したとき，これら 3 つのメ同一性として定義されるので，クローンセット C について，

ソッド呼び出しを変更せず同一のメソッド呼び出しがサマ分類結果を S（Same），D（Diﬀerent），N（Not Available）

リに含まれる場合，コードクローンが共通の振舞いを提供の 3 種類で表現する．コードクローンで互いに対応するしていると見なす．

位置に出現するメソッド呼び出しを比較したとき，複数の

3. コードクローンの自動分類

メソッドのサマリに含まれているものがすべて同名のメ
ソッド呼び出しであれば（同一のサマリを提供するなら）本研究では，コードクローンが複数のメソッドに共通

P1 (C) = S ，1 つでも異なる名前のメソッド呼び出しであの振舞いを提供しているかどうかを判定する．対象となれば（その結果サマリが異なるなら）P1 (C) = D，そもそるコードクローンは，CCFinder が検出する，互いに類似もクローンセット C の中のどの位置のメソッド呼び出し

または一致するコード片の集合（クローンセット）のリもサマリに含まれていなければ P1 (C) = N とする．同様

ストである．1 つのクローンセット C = {c1 , · · · , cn } はに，クローンセット C に含まれるメソッド呼び出しのう∀ci , cj ∈ C : ci  cj を満たすような n 個のコード片の集合

ち，メソッドのサマリに含まれない範囲がすべて同名のメである．ここで ci  cj は，コード片に出現するコメント

ソッド呼び出しであれば P2 (C) = S ，1 つでも異なる名前と空白を取り除き，すべての名前（型名の予約語を含む）のメソッド呼び出しであれば P2 (C) = D，サマリに含まれやリテラルを単一の記号（たとえば $p という文字列）で正ない範囲にメソッド呼び出しが存在しなければ P2 (C) = N

規化すると完全一致することを表す．論文中では，各コーとする．この比較では，呼び出すメソッドの名前だけを使

ド片 ci のことをコードクローンと呼ぶ．たとえば，図 1 に用し，所属するクラス名や引数の型は含まない．

示したコードの 2 行目から 7 行目は，図 2 に示したコード

クローンセットの分類例を，図 1 と図 2 のコードを用の 3 行目から 8 行目までと，呼び出しているメソッドの名いて説明する．図 2 のメソッドは，図 1 のコードの 1 行

前を除くと一致するため，これら 2 つのコード片は同一の目と 2 行目の間に debug メソッド呼び出しを追加し，さクローンセットに属するコードクローンである．クローンらに 4 行目となったメソッドの呼び出し先を変更している

セットのうち，各コードクローンの出現位置がそれぞれ異（図 2 中の下線部）．CCFinder は，図 1 の 2 行目から 7 行

なる単一メソッドに収まっているものだけを本研究の対象

目と，図 2 の 3 行目から 8 行目をコードクローンとして検とし，たとえばファイル全体が複製されている場合や，単出する．この 2 つのメソッドからは 2.3 節で述べた基準に一メソッド内部の 2 カ所が同一の記述となっている場合なより同一のサマリが得られるため，P1 (C) = S である．まどは扱わない．

た，サマリに含まれていないコードクローン内のメソッド

コードクローンの振舞いに関する判定の基準は，コード呼び出しは図 1 では getShell，getEnteredText であり，クローンに含まれるメソッド呼び出しについての以下の 2

図 2 では getShell，getInputText と 1 つ異なることかつの観点である．

ら，P2 (C) = D である．つまり，このクローンセットは，• P1 ：メソッドのサマリに含まれるコードクローン内のメソッド呼び出しが，クローンセットに含まれる他の
コードクローンすべてと同一であるか．

• P2 ：メソッドのサマリに含まれないコードクローン内

共通の振舞いを 2 つのメソッドに提供している一方，それ以外の点で処理内容に違いがあると分類される．
本研究で用いるこれらの基準で，コードクローンは 3 × 3の 9 通りに分類されるが，コードクローンに含まれるメ
ソッド呼び出しの列を比較するだけでもメソッド呼び出しが同一である（P1 (C) = S ，P2 (C) = S ）グループとメ
ソッド呼び出しを含まない（P1 (C) = N ，P2 (C) = N ）グ
ループは分類することが可能である．本研究の分類の新規性は，コードクローンに含まれるメソッド呼び出しが 1 つ以上異なる場合に，それが P1 (C) = D なのか，それとも

P2 (C) = D なのかを区別することにある．
図 2

図 1 のメソッドとサマリが同一であるクローンの例

Fig. 2 An example clone that has the same summary as Fig. 1.

c 2015 Information Processing Society of Japan


1474

Vol.56 No.6 1471–1480 (June 2015)

情報処理学会論文誌

表 1

コードクローンに含まれるメソッド呼び出しの系列の例

Table 1 Lists of method calls in code clones.

if L = φif ∀i, j ∈ [1, n], ∀l ∈ L : Mi [l] = Mj [l]l

M1 [l]

1

getShell2

getEnteredText

3

addElement

Yes

addElementYes

表 1 のデータについて上記基準を求めると，M1 [3] =4evaluateYes

evaluateYes

5

appendYesappendYes

M2 [3] =addElement，M1 [4] = M2 [4] =evaluate，M1 [5] =サマリ

M2 [l]⎧⎪⎨ N
P2 (C) =
S
⎪
⎩
D

サマリ

otherwise

getShell

ただし L = {l ∈ [1, m]|l ∈/ L} である．

getInputText

M2 [5] =append で あ る か ら ，P1 (C) = S と な る ．また，L = {1, 2} であり，M1 [2] = M2 [2] となることから

P2 (C) = D となる．

3.1 分類方法
クローンセット C = {c1 , · · · , cn } に対して，各コード
クローンの内部に出現するメソッド呼び出しの系列の集

3.2 メソッドに対するサマリ抽出の実装

合 M1 , · · · , Mn を求める．CCFinder で抽出するコードク

本研究では，サマリ抽出を Java バイトコードに対して実

ローンはトークンの並びが名前を除いて一致するため，装した．Java のソースコードからバイトコードへのコンパ

Java の構文解析で同じ意味を持つ．つまり，呼び出し列

イルの時点では大きな最適化が行われることはなく，分割

M1 , · · · , Mn の長さはいずれも同じであり，それを m とすコンパイルやデバッグ支援のためにソースコード上での行

ると，個々の呼び出しを Mi [l](1 ≤ i ≤ n, 1 ≤ l ≤ m) と表

番号や変数名に関する多くの情報も保っていることから，現できる．

本研究ではバイトコードを解析の容易な中間表現と見なし

続いて，コードクローンの出現位置である各メソッドにた．経験的な基準については，文献 [6] には厳密なルール

対してメソッドのサマリを計算し，コードクローン内部にが記述されていなかったため，可能な限り同一であること

出現しているそれぞれのメソッド呼び出しを，サマリに属を目指しているが，実装としては独自のものとなっている．

するか，属さないかの 2 値に分類する．例として，図 1 のサマリ抽出は，1 つの Java のメソッドを入力とする手

2 行目から 7 行目と図 2 の 3 行目から 8 行目からなるク

続き単位の解析である．メソッド内部に出現するメソッド

ローンセットから得られるメソッド呼び出しの系列の集合

呼び出し命令の系列 M = m1 , · · · , m|M |  から，部分系列と，サマリの計算結果を表 1 に示す．「サマリ」列に Yesであるようなサマリ S(M ) を抽出する．各メソッド呼び出と書かれたメソッド呼び出しは，そのコードクローンを含し命令は，Java バイトコードにおける INVOKE 命令群であむメソッドのサマリに含まれていることを示している．

る．本節の言及に登場する「文」は，抽象構文木上で定義

コードクローン ci の中の l 番目に出現するメソッド呼される文ではなく，仮想マシンのオペランドスタックに値び出しがサマリに属することを isSummary(i, l) という述を積み上げてそれを使用する一連の命令であり，オペラン

語で表現し，すべてのメソッドのサマリに影響するようなドスタックが空になる時点を文の境界と見なす．これは，コードクローン中のメソッド呼び出し位置の集合 L を以下デバッガにおける 1 ステップの実行にほぼ対応しており，のように定義する．

たとえば for 文における初期化，条件評価，インクリメン

L = {l ∈ [1, m] | ∀i ∈ [1, n] : isSummary(i, l)}クローンセットに含まれるすべてのコードクローンの l 番
目のメソッド呼び出しが，各出現位置のメソッドでサマリに含まれているとき，l が L の要素となる．表 1 の場合，

L = {3, 4, 5} である．
基準 P1 として，クローンセット C がメソッドのサマリ

トの各節はそれぞれ個別の文と見なす．
本研究では，文献 [6] と同様に，まず 3 つの経験的な基準

Ending（END ），Void-Return（VR ），Same-Action（SA）
によってメソッド呼び出し集合 M から部分集合を抽出す
る．これらの基準で選択されたメソッド呼び出し集合を Hとすると，H に含まれるメソッド呼び出しの実行を制御す
る，あるいは呼び出しに引数を提供するメソッド呼び出しに同一のメソッド呼び出しを提供しているかどうかを，以集合を H に加えたものをサマリとして求める．具体的な下のように求める．

式は以下のとおりである．

⎧⎪⎨ N
P1 (C) =S⎪⎩
D

if L = φH(M ) = filter (END(M ) ∪ VR(M ) ∪ SA(M ))if ∀i, j ∈ [1, n], ∀l ∈ L : Mi [l] = Mj [l]S(M ) = H(M ) ∪ CTRL(H(M )) ∪ DF (H(M ))otherwise

この式に登場する経験的な基準の定義を以下に示す．

同様に基準 P2 として，クローンセット C がメソッドのサ• END(M ) はメソッド内部で RETURN 命令の直前に実行

マリ以外の部分に同一のメソッド呼び出しを提供しているされる文か，あるいは ARETURN，LRETURN，IRETURN，かどうかを，以下のように求める．

FRETURN，DRETURN のいずれかの命令を含む文の中に

c 2015 Information Processing Society of Japan


1475

情報処理学会論文誌

Vol.56 No.6 1471–1480 (June 2015)

出現するメソッド呼び出しを取り出す．

CCFinder が検出したコードクローンとの対応付けを行う．

• VR(M ) は戻り値を持たない（戻り値の型が void で具体的には，コードクローンの範囲に含まれるメソッド名ある）か，戻り値を持つが使用されずに破棄されるメに対して，対応する行番号のバイトコードに同名のメソッ

ソッド呼び出しを取り出す．ただし，set メソッドにドの呼び出し命令があれば，そのメソッド呼び出し命令がついては，オブジェクトの初期化など中間的な計算でソースコードに対応すると考える．この方式により，ソーもよく使用されるため除外する．

スコードに出現しないがバイトコード上には出現するよう• SA(M ) は解析対象メソッドの名前と呼び出し先のメなメソッド呼び出し，たとえば拡張 for 文に対して生成さソッドの名前をそれぞれ大文字およびアンダースコア

れる Iterator に対する操作などをコードクローン内のサで単語に分解したとき，先頭の単語が一致するものだ

マリからは除外している．

けを取り出す．ただし，get と set から始まるメソッ
ドと，<init>（コンストラクタ）に関しては，使われる頻度が高く偶然の一致が多く見られるため，この計算からは除外する．

4. コードクローンの分類結果の調査提案手法で得られるコードクローンの分類について，以下の観点から妥当性の評価を行う．

• filter は，経験的な基準 Filtering に対応し，上記 3 つ• 共通の振舞いを提供するクローンとそうでないクローの基準で選択されたメソッド呼び出しの中から，以下ンの割合に差がないか．差がない（一方が大多数を占の条件のいずれかに合致する呼び出しを除外する．

めない）ほうが，調査対象などの絞り込みの用途では( 1 ) メ ソ ッ ド 名 に log，trace，error，debug，

有用性が高い．

exception，close のいずれかが含まれる．
( 2 ) メソッド呼び出しが catch ブロック内部にある．
( 3 ) メソッド呼び出しが，何らかのオブジェクト参照
が null であると判定されたときにのみ（ifnull
命令か ifnonnull 命令による条件分岐によって• 2 つの分類から取り出したクローンが実際に振舞いの共通性に関係しているか．

• 既存のコードクローン分析用のメトリクスでは同様の分類を得ることが難しいか．
評価対象として，Qualitas Corpus 20130901r [7] に収録のみ）到達する制御パスに出現している．

された各プログラムについて提案手法を適用する．同コー• CTRL(H(M )) は Controlling に対応し，H(M ) に含

パスは，複数のプログラムのコンパイル元のソースコード

まれるメソッド呼び出しに対して直接の制御依存辺をとコンパイル後のバイトコードとを組で収録しており，以持つ条件分岐の判定文に出現するメソッド呼び出しの下の手順で手法の適用を行う．

集合である．制御依存辺は，メソッドの実行開始と終( 1 ) 対象プログラムのソースコードから拡張子が.java であ了をそれぞれ単一の入口と出口とする制御フローグラ

るファイルをすべて列挙し，それらに対して CCFinder

フ上で，通常のプログラム依存グラフ [24] と同じ方法を実行する．CCFinder の検出オプションは，デフォで計算する．ただし，メソッド呼び出しによって生じる例外は考慮しない．また，throw 文はメソッドの実行終了と見なす．

ルト設定の最小トークン数 30 を用いる．

( 2 ) CCFinder が検出したすべてのコードクローンから，本研究の対象とするコードクローンのみを抽出する．

• DF (H(M )) は Data-Facilitating に対応し，H(M ) に( a ) RNR 値が 0.5 より大きいコードクローンのみを含まれるメソッド呼び出しの引数に使われる値を計算抽出し，偶然の一致によって生じた可能性の高いするメソッド呼び出しと，引数として参照されるロー

コードクローンを取り除く [16]．

カル変数の値を定義する文の計算式に含まれるメソッ
ド呼び出しの集合である．文間で直接の依存関係があ( b ) 複数のメソッド定義をまたぐコードクローンを取り除く．

るものだけを扱い，推移的な依存関係は取り扱わない．

( c ) 同一クローンセットのコードクローンが 1 つのまた，get，set から始まるメソッドとコンストラク

メソッドに 2 つ以上含まれる場合は，ソースコー

タは結果に含めない．

ド上で最初に開始するものだけを使用し，1 つの結果として得られたメソッドのサマリとコードクローン

クローンセットに含まれるコードクローンがそれの範囲とを対応付けることで，コードクローン ci に含まぞれ異なるメソッドに出現する状態とする．ソーれるメソッドのサマリの集合を得る．

スコード上で早く出現するコードクローンのほうが，メソッドの末尾の文を含まず，サマリに含ま3.3 メソッドのサマリとコードクローンの対応付けの実装

れないコードとしての出現である可能性が高い．

サマリの計算は Java バイトコード上で実行されるため，

コードクローンの分類において，コードクローン

バイトコードに格納されたデバッグ情報，すなわち各バイ

によって対応付けられた位置にあるメソッド呼び

トコードの元になったソースファイル名と行番号を用いて，出しがすべてサマリに含まれる場合だけを「サマc 2015 Information Processing Society of Japan


1476

情報処理学会論文誌

Vol.56 No.6 1471–1480 (June 2015)

表 2 コードクローンの分類結果（86 プログラムの合計）

Table 2 Classification result of code clones (Total of 86
projects).
P2 (C) = D

P2 (C) = S

P2 (C) = N

P1 (C) = D

1,097

2,840

3,087

P1 (C) = S

3,759

15,6364,881

P1 (C) = N

6,818

15,214

2,382

リに影響する」と判定しているため，サマリに含まれない可能性が高いクローンのほうを解析対象として採用している．

( 3 ) 対象ソフトウェアのバイナリファイルのうち，デバッ

図 3

P1 (C) = D および P2 (C) = D であるクローンセットの割合（プログラム別）

Fig. 3 Ratio of code clones whose P1 (C) = D or P2 (C) = D(for each program).

グ情報からコードクローンのソースファイルに対応付けることができたものを使って各コードクローンにうが差異が少ないという報告 [22] と結果が異なる．これ対応するメソッドサマリを計算する．デバッグ情報をは，文献 [22] では P1 (C) = S と P1 (C) = N の場合が区別持ったバイナリが収録されておらず，サマリが計算でされておらず「差異なし」とまとめられていること，本研きなかったコードクローンは，解析から除外した．

究で解析対象プログラム数を増やしたことの影響であると( 4 ) メソッドサマリの情報を用いて，各クローンセット C

考えられる．

について，分類基準 P1 (C)，P2 (C) の値を求めた．
解析したコードクローンは 86 個のプログラムから抽出された計 55,714 個のクローンセットである．P1 ，P2 の値

4.2 分類ごとのコードクローンの内容の比較本研究で導入した分類では，異なるメソッド呼び出しがによって 9 通りに分類した結果を表 2 に示す．

使用されたクローンセットについて，そのメソッド呼び出

4.1 分類の偏りの調査

外の部分に当たるか（P2 (C) = D であるか）を調べるこしがサマリに当たるか（P1 (C) = D であるか），サマリ以
メソッド呼び出しに何らかの差異を含んでいる（P1 (C) =とができる．この 2 つの分類が，開発者にとって意味的にD または P2 (C) = D である）クローンセットは，全体の異なる特徴を持つクローンセットであるかどうかを調査す

31.6%に当たる．メソッド呼び出しの差異は，サマリまたるために，P1 (C) = D，P2 (C) = S であるクローンセット

はサマリではないメソッド呼び出しのどちらか一方だけがと P1 (C) = S ，P2 (C) = D であるクローンセットから，サ

異なる場合が多く，両方が異なるコードは全体の 2.0%にンプリングによる分析を行った．具体的には，データセッ

当たる 1,097 クローンセットだけに限られる．このことか

トに収録されているプログラム群からランダムに選択したら，サマリに該当する部分か，サマリに該当しない部分か，

Ant，Azureus，JHotDraw，Sandmark，Weka に対して，

いずれか一方の内容を再利用するためにコードクローンが該当する分類に含まれるクローンセットを 5 つずつ，合計作成されている可能性が考えられる．

で 50 個選び出し，以下の基準で分類を行った．

サマリを含む（P1 (C) = S または D である）クローン

クローンセットで使用されているデータの同一性．クロー

セットのうちサマリ部分が異なる（P1 (C) = D である）ク

ンセットで同型・同名の変数，同一の定数，同名の get

ローンセットの割合と，サマリ以外のメソッド呼び出しをメソッドを使用している場合を「同一データ」とし，含む（P2 (C) = S または D である）クローンセットのうち別名だが同一型であれば「同一型」，それ以外を「異なそれらの呼び出しが異なる（P2 (C) = D である）クローン

るデータ」として分類した．

セットの割合は，それぞれ 22.4%，25.7%である．これらのクローンセットが実行する処理の同一性．入力データの取割合を解析対象プログラムごとに求めた場合の分布を図 3得と思われる処理を除き，クローンセットで同名のメに示す．この分布に対して Wilcoxon の順位和検定を行っ

ソッドを使っている場合を「同一処理」，異なるメソッ

たところ p=0.2633 となり，統計的に差があるとはいえなドを使用していても動詞が共通するなど同種の機能

かった．このことから，サマリに含まれるメソッド呼び出と思われる場合（たとえば reset と resetOptions な

しと，サマリに含まれないメソッド呼び出しで，どちらかど）を「類似処理」，それ以外のメソッド名を使用して一方に差異が発生しやすいということはない．つまり，観いる場合を「異なる処理」と分類した．

点 P1 と P2 によって，P1 (C) = D と P2 (C) = D の 2 つに偏りなくコードクローンを分類すると期待できる．
上記の結果は，サマリに含まれるメソッド呼び出しのほc 2015 Information Processing Society of Japan

データに関する分類結果を表 3 に，処理に関する分類結果を表 4 に示す．表 3 から，P2 (C) = S であるクローンのほうが同一データを使用しているものが多いことが分か

1477

情報処理学会論文誌

Vol.56 No.6 1471–1480 (June 2015)

表 3 コードクローンが使用するデータの比較結果

Table 3 Comparison of data used by code clones.
クローンの分類

同一データ

同一型

異なるデータ合計

P1 = S, P2 = D

0

15

10

25

P1 = D, P2 = S

14

7

4

25

表 4 コードクローンの処理内容の比較結果

Table 4 Comparison of functionality by code clones.
クローンの分類

同一処理

類似処理

異なる処理

合計

P1 = S, P2 = D

12

13

0

25

P1 = D, P2 = S

0

14

11

25

図 5 分類ごとの LEN の分布

Fig. 5 The distributions of code clone length for each category.
表 5

クローンに関するメトリクスのカテゴリ別分布の統計値

Table 5 Quantile values.

LEN

1st Qu.

Median3rd Qu.

代表値の差

32–36

37–45

48–64

6.00003

POP

2

2–3

3–4

0.00009

RNR

0.71–0.88

0.88–0.93

0.94–0.97

0.04878

共通のデータを取り出す方法として同様のコードを記述して利用できる可能性もある．以上の結果は手作業での確認をともなう調査のため，サンプル数に限りはあるという制限はあるが，機械的な分類結果が意味的な違いを反映していることを示している．

4.3 分類ごとのメトリクス値の比較
図 4

Ant に含まれる P1 = D ，P2 = S であるクローンの例

Fig. 4 An example P1 = D, P2 = S clone set in Ant.

提案手法で得られた分類がコードクローンに対するメ
トリクスによる分類では得られないことを確認するために，既存研究でリファクタリングすべきコードクローンのる．これは，サマリに含まれないメソッド呼び出しとして，選定 [8] に使われたメトリクス LEN，RNR，POP についメソッドの先頭部分でデータを読みだす get メソッドが多て，コードクローン全体の分布と，各分類に属するクロー

いことが影響している．一方で，表 4 では，P1 (C) = S でンセットだけで，メトリクス値の分布の比較を行った．例

あるグループのほうが，共通の処理を行っているクローン

として，コードクローンの長さ LEN の分布を比較したもセットであることが示されている．このグループのクローのを図 5 に示す．図中の分類名は，P1 と P2 の文字を連結ンの多くは，get メソッドなどで異なるデータを参照する

した表記であり，たとえば SD は P1 (C) = S ，P2 (C) = Dが同一の処理を実行しており，サマリとして該当コードであるクローンの LEN の分布を表す．メトリクスの最小片の主要な機能が正しく分類に反映されたと考えられる．

値はどの分類でもフィルタリング基準の 30 となっており，

P2 (C) = S のクローンセットでは，主にデータ構造へのア

中央値が 37 から 45 までと狭い範囲に収まっていることか

クセスに関するメソッドが共通しており，最後に実行する

ら，分布に大きな差がないことが読み取れる．LEN，RNR，メソッドが異なるという事例が多かった．たとえば，AntPOP それぞれについて，コードクローンの分類ごとに四には，図 4 のようなメソッドの組が存在した（スペース

分位点の範囲を求めた結果を表 5 に示す．表における「代の都合上，ソースコードの行数が短くなるようレイアウト

表値の差」は，9 つのコードクローンの分類から任意の 2などを変更している）．これらのメソッドは，同じ制御構

つの分類を選んだときのメトリクス値の分布の差のうち造を持つが，最後に出力する数値の選択だけが異なっていの最大値である．この値は，2 群からすべての値の組み合

る．類似した例として，JHotDraw では，同一の制御構造

わせを取り出したときの差の中央値に当たり，R における

で特定のオブジェクトを取得した後，addListener でリス

wilcox.test を使用して信頼区間 99%で求めた．この値

ナを追加する処理と，removeListener でリスナを削除す

が分布の範囲に比べて小さいことから，異なる分類のコーる処理がコードクローンとなっていた．このように共通のドクローンだからといってメトリクスの値に大きな差があ

データを使用し，互いに関係した処理であっても，異なるるわけではなく，メトリクスによる単純な並べ替えなどで処理を実行している場合はリファクタリングなどで共通化

特定の分類に属するコードクローンを取り出すことは期待

することは難しい．その一方で，新機能の拡張の際には，できないと考えられる．

c 2015 Information Processing Society of Japan

1478

情報処理学会論文誌

Vol.56 No.6 1471–1480 (June 2015)

表 6 LEN の値で上位 10 件となるコードクローンの分類

本研究で使用したサマリ抽出技術と本研究での議論は，Table 6 Classification of top-10 code clones filtered by LEN.

いずれもメソッド名を重要な手がかりとして使用している．

P2 (C) = D

P2 (C) = S

P2 (C) = N

メソッドの処理内容はメソッドに付与された動詞と一貫性

P1 (C) = D

17

92

14

があることが多いことが知られており [25], [26]，メソッド

P1 (C) = S

78

383

29

P1 (C) = Nの概要に当たるキーワードとメソッド名が合致することも

47

169

31

表 7 POP の値で上位 10 件となるコードクローンの分類

Table 7 Classification of top-10 code clones filtered by POP.
P2 (C) = D

P2 (C) = S

P2 (C) = N

P1 (C) = D

11

56

62

P1 (C) = S

62

167

61

P1 (C) = N

172

229

40

多い [27] ことから，単一プログラム内部のコードクローンの分析において名前の一致を判断に用いることには妥当性がある．ただし，メソッド名が一致してもその振舞いが同一であるという保証はなく，開発者による不適切なメソッドの命名の影響を受けている可能性がある．
本研究ではバイナリとソースコードの対応が取れなかったコードクローンを調査対象から除外しており，コーパスに収録されたプログラムのすべてのコードクローンが調査

表 8

RNR の値で上位 10 件となるコードクローンの分類

Table 8 Classification of top-10 code clones filtered by RNR.

対象となっているわけではない．そのため，すべてのコー
ドクローンを対象とした場合に結果が変わる可能性がある．

P2 (C) = D

P2 (C) = S

P2 (C) = N

P1 (C) = D

10

48

11

P1 (C) = S

63

249

83

本研究では，複数のメソッドに共通の振舞いを提供する

P1 (C) = N

83

278

35

コードクローンと，異なる振舞いの実現に共通する処理だ

6. おわりにけを提供するコードクローンとを自動的に分類する手法を解析対象であった 86 個のプログラムから抽出されたコー

提案した．メソッドのサマリに含まれるメソッド呼び出し

ドクローンに対して，LEN，POP，RNR の値で上位 10 件と，含まれないメソッド呼び出しのそれぞれが異なる確率であるようなクローンセットをそれぞれ抽出した結果を提に大きな違いはなく，従来研究では単に「メソッド呼び出

案手法で分類したものを表 6，表 7，表 8 に示す．既存

しが異なる」という一括りにされていたコードクローンをのコードクローンの選定方法 [8] では，これらのコードク

2 つのグループに分類することができる．

ローンが優先的に調査対象となるが，提案手法での 9 つの

自動分類の結果が開発者の活動にもたらす有用性の評価

分類が混在した結果を提示していたと考えられる．本研究は今後の課題である．コードクローンに対するリファクタの分類によって，たとえば共通のデータを取り出す処理をリングや，1 つのコード片への修正を他のコードクローン

探したいのであれば P1 = D，P2 = S のコードクローンのにも適用するといった活動において，対策を取るコードク

中から探す，共通処理を探したい場合は P1 = S ，P2 = D

ローンを絞り込むために使用することが考えられる．まのコードクローンの中から調査する，というように，注目た，本研究で導入した分類は，メソッド呼び出しの差異にしたいコードクローンの性質が決まっている場合には，さのみ基づいており，コードクローン中に出現する変数や定らに調査対象の範囲となるコードクローンを絞り込むこと

数，型名の違いは反映していない．このようなメソッド呼ができる．

び出し以外の情報を考慮した意味的な分類の拡張も，今後5. 妥当性への脅威
本研究ではコードクローンに含まれるメソッド呼び出しの課題である．
謝辞

本研究は科研費 Nos.25220003，26280021 の助成を得た．

が 1 つでもメソッドのサマリに含まれていれば，それを共通機能を実現するためのクローンに分類している．実際に参考文献

は，メソッドのサマリにはクローンに含まれないメソッド[1]

呼び出しも含まれている場合があり，完全に共通機能を実現するためだけのクローン以外もこの分類に含めている可[2]能性がある．

CCFinder が検出するコードクローンはタイプ 2 であり，
ソースコードがコピーされた後に命令の挿入や削除が行わ[3]

れると，該当部分がコードクローンに含まれない場合がある．そのため，実際にコピーされたコードの範囲よりも狭[4]

Fowler, M.: Refactoring: Improving the Design of Existing Code, Addison Wesley (1999).
Yoshida, N., Higo, Y., Kusumoto, S. and Inoue, K.:
An Experience Report on Analyzing Industrial Software
Systems Using Code Clone Detection Techniques, Proc.
APSEC, pp.310–313 (2012).
Yoshida, N., Choi, E., Yamanaka, Y. and Inoue, K.: How
We Know the Practical Impact of Clone Analysis, Proc.
IWSC, pp.1–5 (2014).
Roy, C.K. and Cordy, J.R.: Scenario-Based Comparisonof Clone Detection Techniques, Proc. ICPC, pp.153–162

い範囲だけに解析が限定されている可能性がある．

c 2015 Information Processing Society of Japan

1479

情報処理学会論文誌

[5]

[6]

[7]

[8]

[9]

[10]

[11]

[12]

[13]

[14]
[15]
[16]

[17]

[18]

[19]

[20]

[21]

[22]

[23]

[24]

Vol.56 No.6 1471–1480 (June 2015)(2008).
Kamiya, T., Kusumoto, S. and Inoue, K.: CCFinder: A
Multi-Linguistic Token-based Code Clone Detection System for Large Scale Source Code, IEEE Trans. Software
Engineering, Vol.28, No.7, pp.654–670 (2002).
Sridhara, G., Hill, E., Muppaneni, D. and Pollick, L.:
Towards Automatically Generating Summary Comments
for Java Methods, Proc. ASE, pp.43–52 (2010).
Tempero, E., Anslow, C., Dietrich, J., Han, T., Li, J.,
Lumpe, M., Melton, H. and Noble, J.: Qualitas Corpus:
A Curated Collection of Java Code for Empirical Studies,
Proc. APSEC, pp.336–345 (2010).
Choi, E., Yoshida, N., Ishio, T., Inoue, K. and Sano, T.:
Extracting Code Clones for Refactoring Using Combinations of Clone Metrics, Proc. IWSC, pp.7–13 (2011).
Kim, M., Bergman, L., Lau, T. and Notkin, D.: An
Ethnographic Study of Copy and Paste Programming
Practices in OOPL, Proc. ISESE, pp.83–92 (2004).
Zhang, G., Peng, X., Xing, Z. and Zhao, W.: Cloning
practices: Why developers clone and what can bechanged, Proc. ICSM, pp.285–294 (2012).
Juergens, E., Deissenboeck, F. and Hummel, B.: Code
Similarities Beyond Copy and Paste, Proc. CSMR,
pp.78–87 (2010).
Kim, H., Jung, Y., Kim, S. and Yi, K.: MeCC: Memory
Comparison-based Clone Detector, Proc. ICSE, pp.301–
310 (2011).
Roy, C.K., Cordy, J.R. and Koschke, R.: Comparison
and Evaluation of Code Clone Detection Techniques andTools: A Qualitative Approach, Science of Computer
Programming, Vol.74, No.7, pp.470–495 (2009).
CCFinder in Articles, available fromhttp://www.ccﬁnder.net/ccﬁnderinarticle.html.
AIST CCFinderX, available fromhttp://www.ccﬁnder.net/ccﬁnderx-j.html.
Higo, Y., Kamiya, T., Kusumoto, S. and Inoue, K.:
Method and Implementation for Investigating CodeClones in a Software System, Information and Software
Technology, Vol.49, No.9-10, pp.985–998 (2007).
Hayase, Y., Lee, Y.Y. and Inoue, K.: A Criterion for
Filtering Code Clone Related Bugs, Proc. DEFECTS,
pp.37–38 (2008).
Xing, Z., Xue, Y. and Jarzabek, S.: CloneDiﬀerentiator:
Analyzing Clones by Diﬀerentiation, Proc. ASE, pp.576–
579 (2011).
Lin, Y., Xing, Z., Xue, Y., Liu, Y., Peng, X., Sun, J.
and Zhao, W.: Detecting Diﬀerences across Multiple Instances of Code Clones, Proc. ICSE, pp.164–174 (2014).
Choi, E., Yoshida, N. and Inoue, K.: An Investigation
into the Characteristics of Merged Code Clones during
Software Evolution, IEICE Trans. Information and Systems, Vol.E97-D, No.5, pp.1244–1253 (2014).
工藤良介，伊達浩典，石尾 隆，井上克郎：リファクタリ
ング支援のためのコードクローン間の識別子名の対応関
係分析，情報処理学会研究報告，Vol.2011-SE-173, No.8,
pp.1–8 (2011).
工藤良介，伊達浩典，石尾 隆，井上克郎：コードクロー
ンに含まれるメソッド呼び出しの変更度合の調査，情報処
理学会研究報告，Vol.2013-SE-179, No.15, pp.1–8 (2013).
Duszynski, S., Knodel, J. and Becker, M.: Analyzing
the Source Code of Multiple Software Variants for Reuse
Potential, Proc. WCRE, pp.303–307 (2011).
Horwitz, S., Reps, T. and Binkley, D.: Interprocedural Slicing Using Dependence Graphs, ACM Trans. Programming Languages and Systems, Vol.12, No.1, pp.26–

c 2015 Information Processing Society of Japan


[25]

[26]

[27]

60 (1990).
Høst, E.W. and Østvold, B.M.: The Programmer’s Lexicon, Volume I: The Verbs, Proc. SCAM, pp.193–202(2007).
Yu, S., Zhang, R. and Guan, J.: Properly and Automatically Naming Java Methods: A Machine Learning
Based Approach, Advanced Data Mining and Applications, Lecture Notes in Computer Science, Vol.7713,
Springer Berlin Heidelberg, pp.235–246 (2012).
De Lucia, A., Di Penta, M., Oliveto, R., Panichella, A.
and Panichella, S.: Using IR methods for labeling sourcecode artifacts: Is it worthwhile?, Proc. ICPC, pp.193–
202 (2012).

石尾 隆 （正会員）
2003 年大阪大学大学院基礎工学研究科博士前期課程修了．2006 年同大学
大学院情報科学研究科博士後期課程修了．同年日本学術振興会特別研究員（PD）．2007 年大阪大学大学院情報科
学研究科コンピュータサイエンス専攻
助教．博士（情報科学）．プログラム解析，プログラム理解に関する研究に従事．

伊達 浩典 （正会員）
2007 年関西大学総合情報学部卒業．
2009 年大阪大学大学院情報科学研究科博士前期課程修了．2014 年同大学
大学院情報科学研究科博士後期課程退学．プログラム解析，ソフトウェアパ
ターンに関する研究に従事．

井上 克郎 （フェロー）
1956 年生．1979 年大阪大学基礎工学
部情報工学科卒業．1984 年同大学大学院博士課程修了．同年同大学基礎工学部助手．1984〜1986 年ハワイ大学
マノア校情報工学科助教授．1989 年
大阪大学基礎工学部講師．1991 年同助教授．1995 年同教授．2002 年大阪大学大学院情報科学研究科教授．2012 年同大学大学院情報科学研究科・研究科
長．工学博士．ソフトウェア工学，特に，ソフトウェア開発手法，プログラム解析，再利用技術の研究に従事．

1480