コードクローン(Code Clone)
コードクローンとは
コードクローンとはソースコード中での類似または一致した部分を表します. コードクローンは,「コピーとペースト」によるプログラミングや,意図的に同一処理を繰り返して書くことにより,プログラムテキスト中に作りこまれます. 例えば,約20年間保守されている,ある大規模ソフトウェアシステム(約100万行,2000個のモジュールから構成されている)では,約半数のモジュールに何らかのコードクローンが存在していることが確認されています.
コードクローンの弊害
一般的に,コードクローンはソフトウェアの保守を困難にする要因の一つである,といわれています. 例えば,あるコードクローン上にフォールトが発見された場合に,開発者はそれと対応する全てのコードクローンを確認して,必要があれば全てのコードクローンに同様の修正を行う必要があるからです. 特に大規模システムでは,チームによる開発が通常行われており,上述したように一人の開発者がサブシステムを確認し,全てのコードクローンに対して一貫した修正を行うことはきわめて困難な作業であるといえます.
これまでの取り組み
肥後研究室ではコードクローンを対象とした保守支援を実現するためにコードクローン検出ツールCCFinderといくつかのコードクローン分析ツールを開発してきています.
CCFinderはソースコードをトークン単位で直接比較することによってコードクローンを検出します. CCFinderは変数名や関数名などが異なるコード片もコードクローンとして検出することができます. また,CCFinderの検出処理は非常に高速であり,数百万行規模のシステムであっても実用的な時間でコードクローンを検出することができます. 下図は二つのUNIX系OSとLinux間でのコードクローンの検出結果を表しています. このソースコードは全体で約700万行ありますが,CCFinderを用いると約十数分で検出を行うことができます.
肥後研究室ではこれまでに多くのコードクローンに関する研究を行ってきています. それらは大きく以下の三つに分類することができます.
- 理解支援
コードクローンをさまざまな観点から視覚的に表示を行い,ソフトウェア中のどの部分にどの程度のコードクローンが存在しているかをわかり易く表現します. これにより,開発者はさまざまな粒度・尺度からコードクローンの状態を把握することができます. また,設計情報や開発者の知識などと突き合わせることにより,設計が悪い部分,保守のボトルネックとなっている部分などを知ることができます.
- 集約支援
一般的に,コードクローンは最も優先してリファクタリングすべきものの一つといわれています.コードクローン対して特徴づけを行うことにより,それらがどのように集約できるのかを予測します.コードクローンを集約することにより,将来的な修正にかかるコストの削減が期待できます.
- 修正支援
デバッグ時や機能追加を行う場合,修正箇所が決まった時,その部分とコードクローンになっている部分をソースコード中から検出することによって,漏れなく修正を行うことができます.
これまでに国内外の多くの個人・組織にCCFinderを配布し,多くのフィードバックを得ることができました. CCFinderはコードクローン情報を用いる研究を行っている多くの研究者によって用いられ,コードクローン検出ツールのデファクトスタンダードになりつつあります.
今後の課題
これまでの研究と配布先からのフィードバッグにより,全てのコードクローンがソフトウェアに悪影響を及ぼしているわけではないことがわかってきました. 今後は,"良いクローン"と"悪いクローン"をどのように効率的に判断するか,ということが課題となっています. また,現在の技術では検出できないようなコードクローンも存在します. 下図はコピーアンドペーストを行った後の処理の例を挙げています. 現在の技術ではこのうち,ペースト後に全く修正が加えられていないクローンと,変数名の変更が行われたクローンしか検出することができません. しかし,実際はペースト後に文を追加・削除といった変更は頻繁に行われていると思われます. 今後はこのようなコードクローンも検出できるように検出技術を改良する必要があります.
参考文献
- コードクローン検出法(井上克郎)
- コードクローン問題に対処する技術の動向(神谷年洋)
- コードクローン検出技術を用いたLinuxカーネル進化の調査(リビエリ シモネ)
- 大規模ソースコードを対象としたコードクローンの検出と可視化(肥後芳樹)
- 版管理システムを用いたクローン履歴分析手法の提案(川口真司)
- 開発保守支援を目指したコードクローン分析環境(植田泰士)
- ソフトウェアシステムの類似度とその計測ツールSMMT(山本哲男)
リンク
- コードクローン関連ツール
肥後研究室で開発したCCFinder,Gemini,ICCAなどのコードクローンに関連したツールについては,こちらをご覧下さい.
- 複数のコードクローンに対する集約支援
関連研究「複数のコードクローンに対する集約支援」については,こちらをご覧下さい.