- はじめに
- よくいただくご質問
- 対応言語を教えてください。
- ロジックが同じであれば、検出できますか?
- 類似度に影響しない違いはありますか?
- どのような方法で比較しているのですか?
- どのように関数間の類似度を計測しているのですか?
- 記事「(続)クローンコードを検出する」の出力結果にあるCountLine, CountLineCodeとは何ですか?
- 出力にある”Token Distance”とは何ですか?
- 設定値”Contents Similarity”(類似度)とは何ですか?
- Token DistanceとContents Similarityの関係は?
- 関数の比較はどこからどこまでを対象にしていますか?
- 設定値”Function Name Similarity”とはなんですか?
- 終わりに
はじめに
クローンコードプラグインの記事「クローンコードを検出する」およびその続編である「(続)クローンコードを検出する」について、有難いことに多くのお問い合わせをいただいております。
そこで、今回はいただいたお客様からのご質問のうち、いくつかをピックアップして回答をさせていただきたいと思います。
よくいただくご質問
対応言語を教えてください。
対応言語は、C/C++, Java, C#, VB.NET, Fortran, Ada のみです。
※XML, TypeScript, CSS, Dependency Injection には対応しておりません。
ロジックが同じであれば、検出できますか?
クローンコードプラグインは関数の構造の類似度を比較してクローンコードの判定をしております。
このため、関数名や変数名が異なる場合でもクローンコードを見つけることができます。
類似度に影響しない違いはありますか?
はい、以下の違いは類似度に影響しません。
・大文字/小文字の違い
・空白・改行の違い
・文字列リテラル・数値リテラルの違い
・演算子の違い
・関数名の違い
・変数名の違い
どのような方法で比較しているのですか?
Understand APIのlexer関数を使用して、字句解析による比較しています。
その方法としては以下のような手順となります。
1. 検査対象の関数内に登場する字句を、その種類(予約語/演算子/リテラル/文字列など)ごとに固有の識別子に置き換える。
2. 上記処理をすべての関数に対しておこなう。
3. すべての関数ペアに対して比較をおこない、類似度が高いものをクローンコードとして出力する。
どのように関数間の類似度を計測しているのですか?
レーベンシュタイン距離を利用しています。
記事「(続)クローンコードを検出する」の出力結果にあるCountLine, CountLineCodeとは何ですか?
これらの説明は、こちらの記事にてご案内しておりますのでご確認ください。
出力にある”Token Distance”とは何ですか?
レーベンシュタイン距離(=編集距離)です。簡潔に言うと、文字列同士を一致させるために必要な編集回数です。
この値が小さいと、関数の類似の度合いがより高いということになります。
設定値”Contents Similarity”(類似度)とは何ですか?
関数の内容がどの程度似ていたらクローンコードとみなすかの閾値です。
類似度は関数にあらわれる字句の種類を使用して評価するため、関数内にあらわれる変数名や関数名に差がある場合でも、クローン関数として抽出できます。
Token DistanceとContents Similarityの関係は?
Token Distance(距離)が0であると、Contents Similarity(類似度)は100%となります。
距離が離れると、Contents Similarity(類似度)の値は下がります。
小さな関数の場合、距離が1や2でも編集箇所が関数全体に占める割合は相対的に大きいため、類似度はほどほどにしか高くなりません。
非常に大きな関数の場合、距離が1や2の場合は編集箇所が関数全体に占める割合は相対的に小さいため、類似度は限りなく100%に近くなります。
関数の比較はどこからどこまでを対象にしていますか?
関数定義行の開始行から終了行すべてとなります。このため、関数名やシグネチャも含まれます。
ただし、構造に着目しているため、関数名や変数名自体が合致しているかどうかは類似度や距離には影響しません。
設定値”Function Name Similarity”とはなんですか?
クローンコードの出力対象関数の決定の際に、関数名を考慮するかどうかの設定です。
同名関数のみを検査対象としたい場合には、プラグイン実行時の設定”Function Name Similarity”の閾値を100と設定します。
“Function Name Similarity”を0に設定すると、全く異なる関数名の場合でも関数内部の構造が同じであれば、出力されます。
| Function Name Similarity | 内容 | 利用シーン |
|---|---|---|
| 0 | 名称が異なる関数も出力される | 関数名の類似度を考慮しない |
| 100 | 同名関数のみが検査対象となる | 関数名の類似度も考慮したい |
オーバーロード関数の場合
関数名からシグネチャは除外されるため、以下のようにオーバーロードして定義された関数Funcの場合、関数名がすべて合致しているとみなされます。
| 関数名(シグネチャあり) | 関数名(シグネチャなし) |
|---|---|
| Func(int x) | Func |
| Func(int x, str y) | Func |
終わりに
今回はクローンコードプラグインについて、よくいただくご質問を解説いたしました。
その他、ご不明な点やご質問などありましたら、SciTools 製品カスタマーセンター までお気軽にお問合せください。
