本論文では,意図的に作り込まれたタイプ3までのコードクローンを検出する手法およびその実装であるNICADを紹介している.

提案手法では,まずソースコードをクローンとして検出する単位に分解し,それに対して処理を施し,閾値以上に行が一致するコード片をクローンとして検出する.クローンとして検出する単位はメソッドやブロックといった単位がある.

施す処理として,3つの工夫を紹介している. 1つ目の工夫は,コード行の整形である. そのままのコードで行を比較すると検出漏れが多く発生する. 整形とは,例えばif文を1行にしたり,for文を変数宣言部,条件文,更新文ごとに1行毎に配置し直したりすることをさす. この整形は完全なパースを必要としないため,高速に行うことができる. また,ここで空白や空行は正規化される.

2つ目の工夫は変数の正規化である. そもそもNICADでは,コードクローン間の変数が変更されることは滅多になく,特に意図的に作り込まれたクローンの変数名は一致するという経験則に基づいて,ほとんどの変数の正規化を行わない. 正規化を行うものとして,if文の条件文が例としてあげられる. NICADでは,if文の条件などはどのような形であっても同一の形に正規化している.

3つ目の工夫が,見る意味のないクローンを検出ししないようにする工夫である. 例えば,連続した変数宣言や変数代入は見るべきでない(意図して作り込まれた)クローンでない場合が多い. NICADではこのようなクローンを無視する.

以上の3つの処理を施したコード片に対して,LCSアルゴリズムに基づいてクローンを検出する. LCSアルゴリズムとは最長共通部分列を求めるアルゴリズムをさす. 各行をUnix Diff(メイヤーのアルゴリズム?)と似たアルゴリズムで一致するかしないかを判定し,閾値以上に一致した部分が最長になるようにクローンを検出する.

上記の過程を経て,軽量でType3のクローンを検出する. 結果もある程度スケールして精度も十分に高い. 凄い. しかしFuture Workでも述べているが,変数の正規化を行わないため,検出漏れが多く出るように感じた. 筆者らはそのようなクローンは検出する意味のないクローンのように扱っているが,そのようなクローンも多いことを述べている既存研究もあるため,がっつりリネームされてるクローンには弱そうだなと感じた. NICADは現在でもアップデートが行われているため,その辺はもしかしたら克服されているかもしれない.