クローン検出法として抽象構文木(Abstract Syntax tree,AST)を用いることを提案する論文.

既存の手法として行単位の検出とメトリックベースの検出が提案されている. しかし前者はニアミスクローンの検出に弱い上に,構文を無視して検出するためリファクタリングに向かない. 後者はご検出が多い.

基本的なアイデアとして,ソースコードからASTを構築し,それぞれの部分木の比較によってクローンを検出する. クローン検出の速度を上げ,かつニアミスクローンを検出できるように3つのアイデアを紹介している.

一つ目のアイデアは,部分木毎にハッシュ値を計算することで,検出にかかる時間を短かくするアイデアである. 馬鹿正直に一致する部分木を計算しようとすると,ノードの数Nに対して一つの部分木の比較にすらO(N^3)の時間がかかってしまう. そこで,各部分木にハッシュ値を割り振り,O(N)の時間に収めた.

二つ目のアイデアは,部分木だけでは検出できないクローンを検出するために,木の構造を変換するアイデアである. 部分木の比較のみでは,部分木として現れない連続した文などで構成されたクローンを検出することはできない. そこで,木の構造を変換し,連続した文を部分木として扱えるようにする. こうすることで,文の連続からなるクローンを検出することができる.

三つ目のアイデアは,クローンを統合するアイデアである. ある部分木同士が閾値を満たさずクローンとして検出されなかったが,その子がクローンとして検出されていれば, その部分木もクローンとして検出する. こうすることで,より大きい(最大一致する)クローンを検出することができる.

手法としては面白く,各アイデアもよく考えられている. しかし,いくらクローン検出の速度を上げたところで,がっつり構文解析を行うのであまりスケールしなさそうではあると感じた. また,ニアミスクローンを検出することはできるが,変数の正規化などは行なっていないため,がっつりリネームされたタイプ2クローンの検出は苦手そう(閾値を下回りそう).