コードクローン関連ツール

-> English Page
Last update 2005-01-05, Since 2002
大阪大学大学院情報科学研究科 コンピュータサイエンス専攻 井上研究室

-- もくじ --

• ツール
ICCA
発表
報道など(update)
論文

はじめに

コードクローンとは、ソースコード中の全く同じあるいは類似したコードの断片です。コードクローンが存在するソースコードは、保守が困難になることが指摘されています。 特に、大規模なソフトウェアにおいては、コードクローン問題は深刻であり、手作業では、ソースコード中にコードクローンが存在するかどうかをチェックすることすら困難です。
われわれ研究グループでは、このような大規模なソフトウェアを対象とした、コードクローン対策を研究してきています。本ページは、その成果であるツール類を紹介しています。

関連手法・研究・技術

CloneWarrior

大杉直樹氏(奈良先端科学技術大学院大学 情報科学研究科 ソフトウェア工学講座)によって開発された、 コードクローンを追跡して、ソースコードを修正することを目的とするGUIベースのコードクローン分析ツール。
詳細は、CloneWarrior Webサイトを参照。

コードクローン検出手法およびツール

ツール CLAN
ツール CloneDR I. Baxter, Semantic Design, Inc.
論文[Baxter1998]
ツール Covet J. Bailey, J. Mayrand
ツール Dotplot Accelrys Inc.
ツール Dup B.S. Baker, Bell Lab.
ツールについて述べた論文[Baker1992]
アルゴリズムの詳細について述べた論文[Baker1995]
ツール Duplix
ツール Duploc M. Rieger
論文[Ducasse1999]
ツール JPlag G. Malpohl
論文[Prechelt1999]
ツール Moss A. Aiken
ツール比較
ツールCCFinder, CloneDr, Covet, JPlag, Mossを比較した研究(論文[Burd2002])。

コードクローンと開発プロセス

リエンジニアリング, リファクタリング Refactoring Home Page
Kent Beckは書籍[Fowler1999]の中で、"Programs that have duplicate logic are hard to modify"と述べています。
コードクローンとプロダクトの品質
コードクローンとバグの関係を統計的に調べた研究(論文[Monden2002])。
プロダクトの比較
コードクローンを利用したソフトウェアの類似度比較研究(論文[Yamamoto2001])。
ソフトウェアの変化追跡
ソフトウェアの変化を追跡するためにコードクローンを利用した研究(論文[Johnson1994])。
コードクローンがソフトウェアのバージョンの中でどのように変化するかを観察した研究(論文[Laguë1997])。

技術解説

ここでは、特にCCFinder/Geminiで用いられている技術や定義について説明します。 一般に、コードクローンを検出する手法には、ソースコードの字面の比較によるもの、特徴メトリクスによるものなど、 様々なものがあります(チュートリアル[Inoue2001], 解説記事[Kamiya2004])。

コードクローン

ソースコード中の同一あるいは類似したコード断片を、コードクローンと呼びます。 コードクローンが発生する主な原因は、開発者がソースコードをコピー&ペーストすることですが、 実行時のパフォーマンスを求めて意図的に繰り返しコードを書くこともあり、 エラー処理などの定型処理もコードクローンとなります。 また、コード生成ツール(パーザージェネレータ等)によって生成されたソースファイルもコードクローンを含むことがあります。

コードクローンの存在は、特に大規模なソフトウェアにおいて、ソフトウェアの保守を困難にします。 コードクローンであるコード断片に誤りが含まれていた場合には、そのコードクローンのコード断片について、修正を行う必要があります。 機能拡張や機能変更のためにソースコードを修正する場合も同様で、コードクローンがあればそのすべてのコード断片について修正を行う必要があります。

実際に、20年以上保守されているあるソフトウェアからコードクローンを検出したケーススタディにおいては、 全部で約2000個あるモジュール(ソースファイル)の半数にコードクローンが含まれていました。 特に、長いコードクローン(そのコードクローンが含む個々のソースコード断片の行数が多いもの)は、 ソフトウェアの保守に悪影響を与えていることもわかりました。

現実的には、ソフトウェアを開発する上でコードクローンの発生は避けられない問題です。 複数の開発者が開発すれば、ほぼ確実に定型処理が重複して記述されることになります。 また、一度ソフトウェアを開発して初めてわかるような、繰り返して用いられる処理もあります。 発見されたコードクローンを取り除く(まとめる)ことが常に可能であるとは限らず、 プログラミング言語に適切な機能(構造化例外処理や汎用型、オブジェクト指向、アスペクト指向)が無い場合には、 単一のルーチンとしてまとめることができないコードクローンもあります。

現在、大規模なソフトウェアのソースコードからコードクローンを検出する手法、コードクローンに対処するための手法が盛んに研究されています。

散布図(スキャッタープロット)

Coming soon.

クローンメトリクス

クローンクラス(互いに同じまたは類似しているソースコード断片の集合)を計測対象とするメトリクス

  • RAD ソースコードが階層型ディレクトリに格納されているとき、あるクローンクラスのコード断片の、ディレクトリ階層内での広がり。あるクローンクラスのコード断片がすべて単一のソースファイルにある場合には0、同じディレクトリに格納されている複数のソースファイルにある場合には1。そのようなファイルが異なったディレクトリにある場合には、共通の親ディレクトリまでの深さの最大値。
  • POP クローンクラスに含まれているソースコード断片の数。
  • DFL そのクローンクラスに含まれているソースコード断片が単一のルーチンへの呼び出しに置き換えられた場合に減少するソースコードの予測量(トークン数)。
    {(ソースコード断片の長さ) - (共通ルーチンの呼び出しコードの長さ)} × POP - (共通ルーチンの長さ)

モジュール(ソースファイル)を計測対象とするメトリクス

  • RST
  • RSA
  • MAXLEN (最大コードクローン行数:Maximum length of code clone) モジュールに含まれるコードクローン列のうち,最大のものの行数.長いコード列のコピー&ペーストを行うと,この値が大きくなる.
  • COVERAGE (コードクローンカバレッジ:Coverage of code clone) モジュールに含まれる行のうち,コードクローン列に含まれる行の割合(パーセントで表す).一つのモジュール全体をコピー&ペーストした場合には,コピー元のモジュールのCOVERAGEは100%となる.

よくある質問

Q1: どこからダウンロードできるのですか?

A1: 現在、諸般の事情のため、CCFinder/Geminiの配布は厳密な管理の下におかれています。研究に協力して頂けるという条件付きで配布しております。詳細は以下の連絡先にどうぞ。
mail to: y-higo AT ist DOT osaka-u DOT ac DOT jp

Q2: 論文[Kamiya2002]で、CCFinderの実行時間の計測は何回か実行した平均ですか?アルゴリズムの複雑さの評価としては、接尾辞木(suffix tree)の節点の数や深さで評価する方がよいのではないですか?

A2: 実行時間は、PCを再起動した直後にCCFinderを実行して計測しました。何度か実行してみて、ディスクキャッシュが最も大きく影響していると分ったので、時間計測はこの方法で行いました。接尾辞木の節点の数で評価する方法は、一見、客観的に見えるかも知れませんが、以下の理由により採用しませんでした。(1)何が節点になるかは検出アルゴリズムによって違うためあまり参考にならない、(2)接尾辞木を操作している時間は検出アルゴリズム全体からみてそれほど大きな割合を占めていない。

発表

報道など

[受賞] 第7回プログラミングおよびプログラミング言語ワークショップ(PPL2005) 発表賞(一般の部)受賞。
プレゼンテーション

[その他] 2004年度第2回未踏ソフトウェア創造事業に「コードクローン検出ツールCCFinderNexGenの開発」が採択される。(2004/12/22)
Webページ, 公表資料

[受賞] 第35回市村学術賞貢献賞に選ばれる。(2003/04/25)

[Award] International Conference on Software Maintenance(ICSM) 2002併設ワークショップWorkshop on Detection of Software Cloneにおいて、CCFinderがClones Award 2002の1つに選ばれる。(2002/10/02)

[新聞記事] "阪大『修正点、100倍速く検索』 ", 日経産業新聞 2002年5月17日(金)日刊 8面, 2002.5.17.

[新聞記事] "コンピュータソフト 『コピー部分高速検出法』 阪大教授ら開発", 讀賣新聞 2002年5月8日(水)朝刊 総合2面, 2002.5.2.

論文

2004
2003
2002
2001
[Ueda2001] 植田泰士, 神谷年洋, 楠本真二, 井上克郎: "クローン検出ツールを用いたソースコード分析ツールの試作", 電子情報通信学会技術研究報告, SS2001-14, Vol.101, No.240, pp.17-24, (2001-7).
[Kamiya2001-3] Toshihiro Kamiya, Fumiaki Ohata, Kazuhiro Kondou, Shinji Kusumoto, and Katuro Inoue: "Maintenance support tools for Java programs: CCFinder and JAAT", Proc. of The 23rd Int'l Conf. on Software Eng. (ICSE'2001), pp. 837-838, Toronto, Canada, (May, 2001).
[Kamiya2001-2] 神谷年洋, "コードクローンの検出手法," 情報処理学会ソフトウェア工学研究会 ウィンターワークショップ・イン・金沢論文集, pp.21-22, (2001-1).
[Kamiya2001] 神谷年洋, 楠本真二, 井上克郎: "コードクローン検出における新手法の提案及び評価実験", 電子情報通信学会技術研究報告、SS2000-42〜52, Vol.100, No.570, pp. 41-48, (2001-1).
[Nakae2001] 中江大海, 神谷年洋, 門田暁人, 加藤裕史, 佐藤慎一, 井上克郎, "レガシーソフトウェアを対象とするクローンコード分析," 電子情報通信学会技術研究報告, ソフトウェアサイエンス研究会, Vol. 100, No. 570, SS2000-49, pp. 57-64, (2001-1).

参考文献

謝辞

これらの研究は、平成16年度〜平成20年度の研究期間については、 日本学術振興会科学研究費補助金基盤研究(A)(課題番号:17200001)の助成を得ています。

更新履歴

2005/03/18
サイトの構成を大幅に修正。