研究速報
ローン情報をコメントとしてソースコード中に付加するツールを提案する．更に，本ツールを実システムのプログラム変更支援を目的としたコードクローン情報付加ツールの実装と評価
佐々木亨†神谷年洋††（正員）

井上克郎†（正員）修正事例に対して適用し，その有用性を確認する．

肥後 芳樹†

2. コードクローン検出ツール CCFinder楠本 真二†（正員）

コードクローン検出ツール CCFinder は，単一または複数のソースコード中からすべてのコードクローン

A code clone information supplement tool to support programchangeの主な特徴は以下の通りである．

Toru SASAKI† , Yoshiki HIGO† , Nonmembers,
Toshihiro KAMIYA

††

•

†

, Shinji KUSUMOTO , andKatsuro INOUE† , Members†

ソースコードをトークン単位で直接比較することによりクローンを検出する．

大阪大学大学院情報科学研究科 コンピュータサイエンス専攻，豊中市

Graduate School of Information and Science Technology, Os††を検出し，コードクローンの位置情報を出力する．そ•クローン検出アルゴリズムにサフィックス木 [1]aka University, Toyonaka-shi, 560-8531 Japanを用いて高速化を図り，数百万行規模のシステムにも科学技術振興機構実用時間で解析可能である．

さきがけ

PRESTO, Japan Science and Technology Agency•

実用上意味のないクローン（モジュール先頭のテーブル初期化文の繰り返し等）は検出しない．
あらまし

本論文では，コードクローン検出ツール•

複数のプログラミング言語 (C/C++, JAVA,CCFinder で検出されたコードクローン情報をコメン

COBOL, Fortran, EmacsLisp, Plain text) へ対応しトとしてソースコード中に付加するツールを提案する．ている．

また，適用例を通じて本ツールの有用性を示す．
キーワード

コードクローン，ソフトウェア保守，

3. コードクローン情報付加ツール
3. 1 基 本 方 針

コメント，ツール

本ツールは，プログラム変更時の利用を想定してい1. ま え が きる．具体的には，次の (1)〜(5) の作業を支援する．

ソフトウェアの保守を困難にする要因の一つとして（ 1 ） CCFinder から得られた解析結果を基にソーコードクローンがある．コードクローンとは，ソーススコード中にクローン情報をコメントとして付加する．

コード中に存在するコード片で，同形のコード片が他

コメントにはクローンクラス (クローンの同値類 [2])に存在するものであり，既存コードの「コピーとペー毎に一意に割り付けた ID を利用する．

スト」による再利用等によりプログラム中に作りこ（ 2 ） 変更箇所を特定し，変更を行う．

まれる．あるコード片に対する変更を行う場合，その（ 3 ） 変更箇所のコメント部分のクローンクラスのコードクローンすべてに対して同一の変更を検討する

ID を調べ，それを手がかりにそのクローンクラスに必要があるが，大規模ソフトウェアに対してはそのよ属している別のコード片の先頭箇所を特定する．
（ 4 ） 先頭箇所から修正すべき箇所を特定し，必要うな作業はきわめて困難である．
我々は，ソフトウェア保守支援を目的としてソーならば修正を行う．

スコード中のコードクローンを検出するツール（ 5 ） すべての箇所に修正を行った後，不要となっ(CCFinder [3]) を開発してきている．その出力では，たコメントを除去する．

コードクローンの位置情報はソースコード中での行番号で提示されており，その情報を利用して機能追加等のためにソースコードを修正することを考えると，コードクローン情報とソースコードとの間に行番号のずれが生じる．従って，複数箇所の修正（機能追加）を一度に行う場合には，その行番号のずれを意識しな

3. 2 概要3. 1 で挙げた利用状況を実現するために以下の 5 つの機能を実装したツールを開発した．
コメント追加機能 : クローンの位置情報をコメントとしてソースコード中に付加する機能．
コメントの形式として，クローンクラスの先頭行にがら作業しなければならず，作業効率が悪くなってしは “//@$クローンクラスの ID@” を，先頭行以外にまう．

は “//@ クローンクラスの ID@” の形式をとる．

そこで本論文では，行番号のずれを意識せずにソフ

クローンクラス検索機能 : 指定したクローンクラス

トウェアの一貫した変更を支援するために，コードクの ID を含むコメントが存在するファイル情報を検索・

電子情報通信学会論文誌

X Vol. Jxx–X No. xx pp. 1–3 xxxx 年 xx 月

1

電子情報通信学会論文誌 xxxx/xx Vol. Jxx–X No. xx
2399: static //@$1311@,@$1318@
2400: ProcWideReq7(buf) //@1311@,@1318@
2401: BYTE *buf ; //@1311@,@1318@
2402: { //@1311@,@1318@
2403:
ir_debug( Dmsg(10, "ProcWideReq7 start!!\n") ); //@1311@,@1318@
2404: //@1311@,@1318@
2405:
if(Request.type7.datalen != SIZEOFSHORT * 3)2406:
return( -1 );2407:
buf += HEADER_SIZE; Request.type7.context = S2TOS(buf); //@1311@,@1318@
2408:
buf += SIZEOFSHORT; Request.type7.number = S2TOS(buf); //@1311@,@1318@
2409:
buf += SIZEOFSHORT; Request.type7.yomilen = (short)S2TOS(buf); //@1311@,@1318@2410:
ir_debug( Dmsg(10, "req->context =%d\n", Request.type7.context) ); //@$1317@
2411:
ir_debug( Dmsg(10, "req->number =%d\n", Request.type7.number) ); //@1317@
2412:
ir_debug( Dmsg(10, "req->yomilen =%d\n", Request.type7.yomilen) ); //@1317@
2413: //@1317@
2414:return( 0 ) ; //@1317@
2415: } //@1317@

BAFig. 1

図 1 コメント追加・修正後のソースコード
The source code after a comment addition and correction

表示する機能．

次に，本ツールはある修正箇所から他の修正箇所を一時ファイル編集機能 : 付加されたクローン情報を探すという情報検索的な利用をする点から，f 値 [4] に利用して編集するため，利用者の選択したエディタでよる評価を行う．f 値とは完全性と効率性から検索結ファイルを開く機能．

果の精度を評価するもので，次式で求められ，その値コメント除去機能 : 指定したクローンクラスの IDを含むコメントを除去する機能．
一時ファイル書き戻し機能 : 編集用の一時的ファイルで行った変更を元のファイルに反映する機能．

4. 適 用 例が大きいほど情報検索の精度が高いとされる．

f 値=

2 × 完全性 × 効率性
完全性 + 効率性

また，ここでは「完全性」を修正が必要な箇所のうち実際に検出された箇所の割合，「効率性」を検出された箇所のうち実際に修正箇所であった割合とした．また，擬似デバッグにより本ツールの適用例を示す．ここ本ツールにおける「検出された」の意味を，ある修正

では日本語入力システム「かんな」のバージョン 3.6 と箇所を特定したときに，その箇所にあるコメント内の3.6p1 の間での修正を例題とした．この修正は，バックローンクラスの ID をたどってたどり着ける箇所とファオーバーフローを調べる処理の追加であり，全 20した．適用事例に対する，検出された修正箇所の数，f箇所にほぼ同様の修正をしている．ある１つの修正値を計算し，標準的な検索ツールである grep と比較箇所から残りの 19 箇所を探すデバッグ作業を考える．

する．grep 検索の引数には，バッファ処理時に使われまず，バージョン 3.6 の全ソースコード (92 ファイル，る変数名の共通部分 “Request.type”を用いた．

約 9 万行) に対して本ツールでクローン情報をコメン

結果を表 1 に示す．この結果から，本ツールは grep

トとして追加し，次に、バッファオーバーフローを調よりも修正が不要な部分を検出しないことにより f 値

べる処理を追加する．コメント，処理を追加した後のが大きくなっている（精度が高くなっている）といえソースコードの一部を図 1 に示す．太字で示される箇る．なお，検出されなかった 2 箇所も，CCFinder で所が本ツールの機能で追加されたコメントであり，A検出するコードクローンの長さを小さくすることで，の部分が追加した処理である．次に，利用者は修正箇検出することができた．

所の前後にあるコメント部分のクローンクラスの ID（図中の B）を調べる．すると，クローンクラス 1311

Table 1

表 1 検出結果と f 値
Detection result and F-valueと 1318 の中にこの修正処理を追加したことがわかる
ので，この後，1311 と 1318 のクローンクラスに属しているコード片に対して同様の修正を行えばよいとわかる．この作業の間，利用者は行番号のずれを意識せずに作業することができる．
2

総修正箇所
grep
20 箇所
本ツール 20 箇所

全検出箇所
61 箇所
18 箇所

検出修
正箇所
19 箇所
18 箇所

完全性
95 ％
90 ％

効率性
31 ％
100 ％

f値
0.50
0.95

レター

5. む す び
本論文では，複数箇所のプログラム修正作業を支援するためのコードクローン情報付加ツールについて述
べ，有用性を確認した．今後の課題としては，実際の開発・保守現場での適用実験と評価が考えられる．
文
[1]

献

D.Gusﬁeld, Algorithms on Strings, Trees, And Sequences, Cambridge University Press, 1997.

[2]

井上克郎, 神谷年洋, 楠本真二, “コードクローン検出法”,
コンピュータソフトウェア, vol.18, no.5, pp.47-54, 2001.

[3]

T. Kamiya, S. Kusumoto, and K. Inoue, “CCFinder:
A multilinguistic token-based code clone detection
system for large scale source code”,IEEE Trans.

Softw. Eng., vol28, no.7, pp.654-670, 2002.
[4]

徳永健伸, “情報検索と言語処理”, 東京大学出版会, 2002.
（平成 xx 年 xx 月 xx 日受付）

3

Abstract This letter proposes a method to append the information of code clone to source code ascomments to support software change. We have implemented a tool based on the proposed method andapplied it to data from a certain software project. The result show the usefulness of it.
Key words code clone, software maintenance, comment, tool