GUIフロントエンドGemXのチュートリアル

著者:神谷 年洋(かみや としひろ)
日付:2008/05/07
連絡先:info@ccfinder.net
著作権:2005-2008 ( C ) Tosihiro Kamiya. All rights reserved.

Contents

1. コードクローンを検出する

メニュー[ファイル]-[クローンを検出]から、対象となるソースファイルのプログラミング言語(に応じたプリプロセススクリプト)および 対象となるディレクトリを指定します。

  • ディレクトリは複数指定することもできます。ドラッグアンドドロップで指定することもできます。
  • CCFinderXは、ディレクトリを再帰的にたどって、ソースファイルを探し出します。
images/fig3.1jt.png

検出オプションの設定では、最初は既定値のままで検出してみてください。検出オプションの詳細については、マニュアルを参照してください。

以上が終わると、コードクローンの検出が始まります。検出が終わると、画面の各部分が更新されます

images/fig3.2jt.png
tip ヒント:もし、検出されるコードクローンが多すぎる場合には、検出オプションの設定で「事前審査を使用する」をチェックしてみてください。
images/fig3.3jt.png
tip ヒント:既定で、ソースファイルの順序はファイルのパスのマルチバイト文字列として表現したときの辞書順になっています。 また、指定されたディレクトリから、あらかじめ決められた拡張子を持つファイルだけを検出対象とします。 (たとえば、C/C++なら、.c, .cc, .cpp, .cxx, .h, .hh, .hpp, .hxx。) ソースファイルの順序を自分で決めたい場合や、特殊な拡張子を持つソースファイルを対象にしたい場合には、 ファイルリスト(1行に1つのファイルのパスを含むテキストファイル)を手作業で作成し、 GemXのメニュー[ファイル]-[ファイルリストからクローンを検出]でコードクローンを検出してください。

2. コードクローンを調べる

検出されたコードクローンを「ファイルテーブル」、 「クローンセットテーブル」 、 「散布図」、「ソーステキスト」、「スクラップブック」、「検索ボックス」を使って調べていきます。

images/fig4.1jt.png
ファイルテーブル:対象となったソースコードの一覧を表示します
クローンセットテーブル:検出されたコードクローンの一覧を表示します
散布図:ソースコードの全体で、コードクローンがどのように分布しているかを見るための散布図を表示します
ソーステキスト:特定のソースファイルのコードを表示し、コードクローンになっている部分をハイライト表示します
スクラップブック:ソーステキストに表示されているコード断片をスクラップブックにコピーすることができます。 ソーステキストとほぼ同じですが、ファイルテーブルやクローンセットテーブル内での選択状態の変化に連動しません。
検索ボックス:ファイルテーブル、クローンセットテーブル、ソーステキスト、スクラップブック内で検索を行います

2.1 散布図

対象となっているソースファイル全体に含まれているコードクローンが表示されています。 上部に散布図のオプションを指定するバーが配置されています。散布図のオプションについてはマニュアルを参照してください。

images/fig4.1.1jt.png
  • 灰色の水平線・垂直線はファイルの境界
  • 黒い正方形(対角線上)はディレクトリの囲い
  • 角丸のラベルはディレクトリ名
  • 斜めの黒い線(点)はコードクローン
    • 対応する水平・垂直の位置のソースファイルの部分が類似していることを意味します

また、対象となっているソースファイルの一覧が、散布図の左のファイルテーブルに表示されています。

ソースファイルの絞り込み(散布図の拡大)

ドラッグでファイルを選択し、右クリックメニュー[選択中のファイルをスコープに]で、対象となるソースファイルを絞り込むことができます。 (この操作により、 ファイルテーブルに表示されるファイルの一覧も変わることに注意してください。)

images/fig4.1.2jt.png

元に戻すには、同じく右クリックメニューの[スコープを一つ戻す]を使ってください。

ソースファイルの絞り込みにより、ファイルテーブル中のファイルIDに欠番が生じることがあります。 そのようなファイルIDの不連続部分について、散布図中の該当するファイル境界は点線で表示されます。

tip ヒント:ディレクトリの正方形の、右上角または左下の角をALT+クリックすることで、そのディレクトリ内のすべてのファイルを選択することができます。

2.2 ファイルテーブル

ファイルテーブルは、対象となっているソースファイルの一覧を表示します。

images/fig4.2.1jt.png

それぞれのファイルについて、以下が表示されます。

  • ファイルに付けられた通し番号(File ID)、
  • ファイルのパス(Path)、
  • ファイルのトークンではかった長さ(LEN)、
  • ファイルが含むコードクローンセットの数(CLN)

上部に表示されているパスは、ファイルテーブルのすべてのファイルについて共通するパスを示します。

右クリックメニューから、対象となるソースファイルを絞り込むことができます。

images/fig4.2.2jt.png
  • (クリック、CTRL+クリック、SHIFT+クリックで) ファイルを選択 ->「選択中のファイルをスコープに」
  • ファイルを選択 -> 「それらとの間にクローンを持つファイルを選択状態に」
  • ファイルを選択 -> 「指定ディレクトリ以下のファイルを選択」-> 「選択中のファイルをスコープに」

いったん絞り込んだソースファイルは、同じ右クリックメニューの「スコープをポップする」で元に戻すことができます。

tip ヒント:より複雑な絞り込み(たとえば、2つのディレクトリのファイルだけを残す、選択していないファイルだけを残す、など)には、 ファイルテーブルのファイル名ぞれぞれに付加されているチェックボックスを利用します。チェックボックスの利用法はマニュアルを参照してください。

ソースファイル検索

ファイルテーブルにフォーカスが当たっている状態(ファイルテーブルの縁が色つきで表示されている状態)で、 検索ボックスにファイル名やパス名を記入すると、ファイルを検索することができます。 また、検索ボックスに「#番号」と記入すると、その番号のFile IDを持つファイルを選択することができます。

images/fig4.2.3jt.png

散布図上のソースファイルの名前を調べるには(散布図 -> ファイルテーブル)

散布図の上でクリックすると、水平・垂直両方の対応するファイルが、ファイルテーブル内で択状態になります。 これにより、散布図上のファイルの名前を調べることができます。

images/fig4.2.4jt.png

2.3 ソーステキスト

ソーステキストは、ソースコードを参照し、コードクローンになっている部分をハイライト表示します。

「ファイルテーブル」中のソースファイルを1つクリックすると、そのソースファイルが「ソーステキスト」に表示されます。

images/fig4.3.1jt.png
  • 左からマップ、行番号、テキストが表示されます(マップについては後述)
  • コードクローンになっているテキストは灰色のハイライトで表示されます
  • 行番号のハイライトは、左半分はそのファイルと別のファイルの間のコードクローンを、右半分はそのファイル内のコードクローンを意味します
  • テキストの中で、プリプロセススクリプトによって除去されたトークン(コメントや、単純なgetter/setterなど)は緑色の文字で、予約語は藍色(暗い赤)の文字で示されます

テキスト検索

ソーステキストにフォーカスが当たっているときに、検索ボックスに単語を記入すると、 表示されているファイル内でその単語を検索することができます。 また、「#番号」と記入すると、その行番号に移動することができます。

images/fig4.3.2jt.png

複数テキストモード

ファイルテーブルまたは散布図で2つ(以上)のファイルを選択すると、ソーステキストにそれら2つが並べて表示されます。

このとき、マップに以下の図形が表示されます。

images/fig4.3.3jt.png
  • 白い縦棒:ファイル
  • その右側にある灰色の縦棒:そのファイル内で閉じているクローンのコード断片
  • 左側にある灰色の縦棒:そのファイルと別のファイルとの間のクローンのコード断片
  • 灰色の縦棒をつなぐ斜めまたはU字型の灰色の線:対応するコード片が同じクローンセットに属することを示す
  • 黄色い角丸の矩形:表示されているテキストの位置
    • 黄色い角丸の矩形の右半分をドラッグすることで、ソーステキストに表示される部分を変更することができます
tip ヒント:ソーステキストのペインの数(同時に表示される最大ファイル数)はメニュー[設定]-[GemX設定]から変更することができます。

スクラップブックへのコピー

ソーステキスト内で右クリックメニュー[スクラップブックにコピーする]により、表示されているコード断片をスクラップブックにコピーすることができます。 スクラップブックはファイルテーブルやクローンセットテーブルの操作に影響されないため、 コード断片を中心に分析を進める場合には、スクラップブックが便利です。

images/fig4.3.4jt.png

2.4 クローンセットテーブル

クローンセットテーブルは、検出されたコードクローンの一覧です。 ここで、クローンセットとは、コード断片の集合であり、その要素であるコード断片の任意のペアがコードクローンになっているものです。 それぞれのクローンセットについて、通し番号(Clone-Set ID)とコード断片の長さ(Length)が表示されます。

images/fig4.4.1jt.png

クローンセットテーブルは、ファイルテーブルに追随します。 つまり、対象となるファイルが(絞り込みによって)取り除かれると、取り除かれたファイルにしか存在しないコードクローンがクローンセットテーブルから削除されます。 (その逆は行いません。つまり、クローンセットテーブルからコードクローンを絞り込んでも、対象となるファイルが削除されることはありません。)

指定したコードクローンのコードを表示させるには(クローンセットテーブル -> ソーステキスト)

左側に「クローンセットテーブル」、右側に「ソーステキスト」を表示させます。

images/fig4.4.2jt.png
  • クローンセットテーブル内でクリックすることで、クローンセットのコード断片のペアをソーステキストに並べて表示することができます。 同じクローンセットをもう一度クリックすると、コード断片の別のペアを表示します。
  • 同じく右メニューの「選択中のクローンセットをスコープに」で、クローンセットを絞り込むことができます。
tip ヒント:あるコードクローンのコード断片を一つだけ表示するには、右クリックメニュー[コード断片を1つ表示]を使います。

2.5 検出されたコードクローンやスコープの保存

ファイルメニューから、スコープやファイルリストを保存することができます。

images/fig4.5.1jt.png
スコープの保存:

スコープとは、ファイルやクローンセットの絞り込みの状態です。画面左の「スコープ履歴」に表示されています。

  • 保存:メニュー[ファイル]-[現在のスコープに名前を付けて保存]により
  • 開く:メニュー[ファイル]-[クローンデータを開く]により
ファイルリストの保存:

ファイルリストとは、ファイルテーブルに表示されているソースファイルのリストです。

  • 保存:メニュー[ファイル]-[ファイルリストを保存]により
  • メニュー[ファイル]-[ファイルリストからクローンを検出]により、保存したファイルリストに含まれるソースファイルからコードクローンを検出することができます。
クローンの再検出:

現在表示しているスコープと同じソースファイルに対して、異なった検出オプションを適用したいときは、メニュー[ファイル]-[クローンを検出し直す]

3. メトリクスによる分析

コードクローンやソースファイルのメトリクスを用いれば、着目すべきコードクローンやソースファイルを見つけやすくなります。 また、行ベースのメトリクスを用いることで、ソースコードの行で数えた統計量を知ることができます。 GemXは、メトリクスの表示およびコードクローンやソースファイルのメトリクスによる絞り込みの機能を備えています。

3.1 ファイルメトリクス

メニュー[メトリクス]-[ファイルメトリクスを表示]により、ファイルテーブルにメトリクスが表示されます。

images/fig5.1.1jt.png
NBR (neighbor):そのファイルとの間にコードクローンを持っているファイルの数
RSA (ratio of similarity between another files):
 そのファイルのテキストが、そのファイル以外との間のコードクローンによって占められている割合。 この値が1に近いものは、ファイル全体をコピーすることによって作られたものである可能性があります。
RSI (ratio of similarity within the file):
 そのファイルのテキストが、そのファイル内のコードクローンによって占められている割合。 この値が1に近いものは、単純な文や定義の繰り返しが並んでいるコードであるか (その場合はRNRも1に近くなります)、あるいは、似たような文や定義が何種類か含まれていて、 それらがそのファイルをほぼ覆っているようなコードになります。
CVR (coverage):そのファイルのテキストが、何らかのコードクローンによって占められている割合。 定義より、max(RSA, RSI) <= CVR <= RSA+RSI。
RNR (ratio of non-repeated code):
 非繰り返し率。1 - (そのファイルのテキストに含まれる繰り返し部分の割合)。 この値が0に近いものは、単純な文や定義の繰り返しが並んでいるコードです。

メニュー[メトリクス]-[ファイルメトリクスによるフィルタリング]からメトリクスの最大値と最小値でファイルを絞り込むことができます。

images/fig5.1.2jt.png
tip ヒント:既定では、ファイルメトリクスを表示した後で、ソースファイルの絞り込みを行うと、ファイルメトリクスが表示されなくなります。 メニュー[設定]-[GemX設定]で表示されるダイアログの、[ファイルメトリクスを常に算出]にチェックをつけると、絞り込みの後、 自動的にファイルメトリクスを再計算し、表示するようになります。

3.2 クローンセットメトリクス

メニュー[メトリクス]-[クローンセットメトリクスを表示]により、クローンセットテーブルにメトリクスが表示されます。

images/fig5.2.1jt.png
LEN (length):そのコードクローンに含まれる一つのコード断片の長さ(トークンで測った)。
POP (population):
 コードクローンになっているコード断片の数。
NIF:そのコードクローンのコード断片を1つ以上含むソースファイルの個数。 定義より、NIF <= POP。 (このメトリクスは、大阪大学の肥後芳樹さんのGeminiから取り入れました。)
RAD (radius):コード断片を持っているソースファイルが、ディレクトリ上でどれだけ広がっているか(RAD=0なら同じソースファイル内)。 RADが大きい場合、そのコードクローンが広い範囲に広がっているため、より注意が必要です。
RNR (ratio of non-repeated tokens):
 コード断片のうち、繰り返し部分に含まれないトークンの割合(百分率)。
TKS (token set size):
 コード断片のトークンの種類数。 TKSが極端に小さなコードクローンは、変数の宣言の連続などである可能性があります。
LOOP, COND, McCabe:
 LOOPはコード断片に含まれるループの数, CONDは条件分岐の数, McCabeはそれらの合計です。 複雑なコードに着目したいときは、このメトリックの値が大きなものを選んでください。

メニュー[メトリクス]-[クローンセットメトリクスによるフィルタリング]から、フィルタリングを行うことができます。

images/fig5.2.2jt.png

クローンセットメトリクスを表示すると、散布図に表示されているコードクローンが、(既定では)メトリックRNRの値に応じてで着色されます。

images/fig5.2.3jt.png
tip ヒント:ファイルメトリクスと同様に、クローンセットメトリクスも、 メニュー[設定]-[GemX設定]によって、ソースファイルの絞り込みの後で、自動的に再計算・再表示させることができます。

3.3 行ベースのメトリクス

メニュー[メトリクス]-[行ベースのメトリクスの表示]から、行ベースのメトリクスを表示することができます。

images/fig5.3.1jt.png
LOC:ソースファイルの行数。
SLOC:トークンを含まない行をのぞいた場合のソースファイルの行数。 ただし、ここでの「トークン」とはCCFinderXによって無視されるものは含まれません。 たとえば、Javaのソースファイルなら、単純なgetter/setterメソッドの定義は無視されます。 ソースコード中でCCFinderXによって無視されている文字は、ソーステキスト内では緑色の文字で表示されます。
CLOC:コードクローンのコード断片のトークンを1つ以上含む行の数。
CVRL:コードクローンのコード断片のトークンを含む行の割合。CVRL = CLOC / SLOC。