コードクローン(Code Clone)

コードクローンとは

コードクローンとはソースコード中での類似または一致した部分を表します. コードクローンは,「コピーとペースト」によるプログラミングや,意図的に同一処理を繰り返して書くことにより,プログラムテキスト中に作りこまれます. 例えば,約20年間保守されている,ある大規模ソフトウェアシステム(約100万行,2000個のモジュールから構成されている)では,約半数のモジュールに何らかのコードクローンが存在していることが確認されています.

メトリクスグラフ
コードクローン

コードクローンの弊害

一般的に,コードクローンはソフトウェアの保守を困難にする要因の一つである,といわれています. 例えば,あるコードクローン上にフォールトが発見された場合に,開発者はそれと対応する全てのコードクローンを確認して,必要があれば全てのコードクローンに同様の修正を行う必要があるからです. 特に大規模システムでは,チームによる開発が通常行われており,上述したように一人の開発者がサブシステムを確認し,全てのコードクローンに対して一貫した修正を行うことはきわめて困難な作業であるといえます.

これまでの取り組み

肥後研究室ではコードクローンを対象とした保守支援を実現するためにコードクローン検出ツールCCFinderといくつかのコードクローン分析ツールを開発してきています.

CCFinderはソースコードをトークン単位で直接比較することによってコードクローンを検出します. CCFinderは変数名や関数名などが異なるコード片もコードクローンとして検出することができます. また,CCFinderの検出処理は非常に高速であり,数百万行規模のシステムであっても実用的な時間でコードクローンを検出することができます. 下図は二つのUNIX系OSとLinux間でのコードクローンの検出結果を表しています. このソースコードは全体で約700万行ありますが,CCFinderを用いると約十数分で検出を行うことができます.

UNIX系OS,Linux間のコードクローン
UNIX系OS,Linux間のコードクローン

肥後研究室ではこれまでに多くのコードクローンに関する研究を行ってきています. それらは大きく以下の三つに分類することができます.

これまでに国内外の多くの個人・組織にCCFinderを配布し,多くのフィードバックを得ることができました. CCFinderはコードクローン情報を用いる研究を行っている多くの研究者によって用いられ,コードクローン検出ツールのデファクトスタンダードになりつつあります.

今後の課題

これまでの研究と配布先からのフィードバッグにより,全てのコードクローンがソフトウェアに悪影響を及ぼしているわけではないことがわかってきました. 今後は,"良いクローン"と"悪いクローン"をどのように効率的に判断するか,ということが課題となっています. また,現在の技術では検出できないようなコードクローンも存在します. 下図はコピーアンドペーストを行った後の処理の例を挙げています. 現在の技術ではこのうち,ペースト後に全く修正が加えられていないクローンと,変数名の変更が行われたクローンしか検出することができません. しかし,実際はペースト後に文を追加・削除といった変更は頻繁に行われていると思われます. 今後はこのようなコードクローンも検出できるように検出技術を改良する必要があります.

ペースト後の処理例
ペースト後の処理例

研究紹介に戻る