肥後研究室志望の方へ

コードクローン検出

コードクローンとは

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

コードクローン
コードクローン

コードクローンの弊害

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

これまでの取り組み

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

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

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

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

  • 理解支援
  • コードクローンをさまざまな観点から視覚的に表示を行い,ソフトウェア中のどの部分にどの程度のコードクローンが存在しているかをわかり易く表現します. これにより,開発者はさまざまな粒度・尺度からコードクローンの状態を把握することができます. また,設計情報や開発者の知識などと突き合わせることにより,設計が悪い部分,保守のボトルネックとなっている部分などを知ることができます.

  • 集約支援
  • 一般的に,コードクローンは最も優先してリファクタリングすべきものの一つといわれています.コードクローン対して特徴づけを行うことにより,それらがどのように集約できるのかを予測します.コードクローンを集約することにより,将来的な修正にかかるコストの削減が期待できます.

  • 修正支援
  • デバッグ時や機能追加を行う場合,修正箇所が決まった時,その部分とコードクローンになっている部分をソースコード中から検出することによって,漏れなく修正を行うことができます.

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

今後の課題

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

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

関連研究:複数のコードクローンの集約を支援するツール

コードクローンの集約

コードクローン(Code Clone)とは,プログラム中に存在する形や構造の似た部分のことです. プログラムにコードクローンがたくさん存在すると,そのプログラムに新機能を付け加えたり,プログラムからバグを取り除いたりすることが困難になります. このようなコードクローンが引き起こす問題への対策として,コードクローンを1つに集約する方法があります.

しかし,銀行や人工衛星で使われているような巨大なプログラムの場合,コードクローンを1つに集約する作業は,簡単ではありません. なぜなら,巨大なプログラムからコードクローンを探し出し,そのコードクローンの特徴に適した方法で集約することは難しいからです.

そこで私達は,コードクローンを集約するソフトウェア開発者を支援するツールを開発しています.

コードクローンのグループを探し出す

巨大なプログラムの中には,たくさんのコードクローンが存在します.これらコードクローンを1つ1つ集約することは大変です.もっと効率的に作業を進めるには,複数のコードクローンを1つのグループにまとめ,一度に集約する必要があります.

一度に集約できるコードクローンのグループは,類似した機能を表すプログラム間に存在することがあります.下図は,そのようなコードクローンのグループの例です.下図は,機能1と機能2の間に存在する3つのコードクローンを表しています.2つの機能に含まれる長方形は,コード片(プログラムの一部)を表しています.全てのコード片がコードクローンになっており,機能1と機能2はかなり似ていることから,一度に集約するべきです.

これらを踏まえて,プログラムから一度に集約できるコードクローンのグループを探し出すツールを開発しました.

コードクローンのグループの例
コードクローンのグループの例

適切な集約先の提示

一度に集約できるコードクローンのグループを見つけた後は,プログラムの中のどこにそれらを集約するかが問題となります.

例えば,あるグループは既に存在するファイルに集約すると良いが,もう一方のグループは,新しいファイルを作成し,そのファイルに集約すると良いというように,グループごとに適切な集約先が異なります. しかし,集約先を判断するには,コードクローンだけでなくプログラム全体を考慮する必要があり,簡単に適切な集約先を決定することはできません.

そこで,プログラム全体を分析することにより,グループの特徴を調査し,適切な集約先を開発者に提示する機能をツールに追加しました.

今後の課題

今後の課題は,主に2つあります. 1つ目は,更に大きなコードクローンのグループを探し,その適切な集約先を提示する方法を考案することです. 2つ目は,適切な集約先を提示するだけでなく,その集約を行うリスクや効果を開発者に提示することです.

このような技術を実現することができれば,より効率的にコードクローンを集約することができると考えられます.

参考文献

リンク

  • コードクローン関連ツール
  • 肥後研究室で開発したCCFinder,Gemini,ICCAなどのコードクローンに関連したツールについては,こちらをご覧下さい.


研究紹介に戻る

肥後研究室

大阪大学 大学院情報科学研究科

コンピュータサイエンス専攻

ソフトウェア工学講座