大きな変化が加えられたType-3クローンを検出するツールLVMapperの論文.
large-gapped cloneを検出するツールとしてCCAlignerが有名だが, CCAlignerはギャップが一箇所のみの場合にしか強くなく,かつスケーラビリティが低いという問題があった. そこで,複数箇所に大きなギャップが存在してもクローンを検出できる手法を提案している. この論文では,そのようなクローンをLVクローン(large-variance clone)と呼んでいる. LVクローンの定義は以下のとおり
手法はLocate,Filter,Verifyの3段階で構成されている. まず初めにソースコード中からブロックを抽出し,pretty-printした上で3行ずつハッシュ値(シードと呼ばれている)をとる.
Locateでは,それぞれのブロックに対して,クローンになる可能性があるブロックを特定する. 対象のブロックのシードと同じシードを含むブロックを持ってくる.
Filterでは,特定したブロックのうち,クローンでなさそうなものを排除する. 二つのブロックに対して,シードを共有している割合が閾値以上ならVerifyに進む.
Verifyでは,二つのブロックで順番を保ったまま共通している行を計算し,
共通行数 / 小さい方のブロックの行数 が閾値を超えていればクローンとする.
この閾値は,行数が多いほど小さくなるように動的に変化する.
1 - 0.03 * 行数また,このような共通行数はLCSを用いて計算できるが,LCSの計算量は行数がそれぞれMとNの時O(MN)になる.
そのため,経験則を用いてO(M + N)まで落とす.
経験則
実験結果から,LVMapperはSourcererCCやCCAlignerと比較してLVクローンを検出するのに長けていることを示した. また,それなりに高いrecallと,許容できるprecision(88.5%),それなりに高いスケーラビリティを示した.