Gemini概要 - Software Engineering Laboratory

Download Report

Transcript Gemini概要 - Software Engineering Laboratory

Gemini
http://sel.ist.osaka-u.ac.jp/cdtools/
植田泰士†, 肥後芳樹†, 神谷年洋‡, 楠本真二†, 井上克郎†
†大阪大学 大学院情報科学研究科
{y-ueda, y-higo, kusumoto, inoue}@ist.osaka-u.ac.jp
‡科学技術振興事業団 さきがけ研究21
[email protected]
ソフトウェア工学工房
1
内容

Gemini








概要
Scatter plot
Metric graph
Gapped clone
CCFinder/Gemini利用手順
コードクローン情報活用方法
今後の展開
参考文献
ソフトウェア工学工房
2
Gemini - 概要(1/2)

GUIベースのコードクローン分析環境


CCFinderをコードクローン検出エンジンとして使用
各種インターフェース
• Scatter plot
• マウスドラッグによるコードクローン選択
• ソート機能,ズーム機能...
• Metric graph
• メトリクス値の範囲指定によるコードクローン選択
• Source code view
• クローンペアのソースコードを対で表示

実装言語
• Java
ソフトウェア工学工房
3
Gemini - 概要(2/2)
Gemini
Interfaces
Clone pair manager
Clone selection
information
Scatter plot view
(Clone pair list view)
CCFinder
Code clone detector
User
Source code manager
Source code view
Source files
Code clone
Information
Clone selection
information
Metrics manager
ソフトウェア工学工房
Metric graph views
(Clone class list view)
4
Gemini - Scatter plot(1/2)





主対角線上では自己比較が
行われるため,常に主対角線
が描画される
CCFinderから検出されてくる
ようなクローンペアは,対角線
分として現れる
点の分布は主対角線に対し
て線対称
a b c a b c a d e c
a b c a b c a d e c

原点は左上角
水平軸,垂直軸はソース
コードのトークン列を表す
黒い点は,両軸の対応した
トークンが一致していること
を表す
a, b, c, ... : tokens
: matched position
ソフトウェア工学工房
5
Gemini - Scatter plot(2/2)
ファイルソート機能



複数ファイルがscatter plot 上で比較される場合,両軸にファイルの区切りが
存在する
両軸上でのファイルの並びによっては,点が全体に広く分散する
類似したファイルはできるだけ近くに配置することでクローン分布を密集させる
ソフトウェア工学工房
6
Gemini - Metric Graph(1/2)



LEN(C): Clone class C 内の1要素のトークン数
POP(C): Clone class C 内の要素数
DFL(C): Clone class C 内の全要素を新しい一つのサ
ブルーチンにマージした場合のトークン減少数の予測値
new sub routine
caller statements

RAD(C): Clone class C 内の各要素がファイルシステ
ム内でどれだけ分散しているか
ソフトウェア工学工房
7
Gemini - Metric Graph(2/2)

パラレルコーディネーショングラフ


各メトリクス値毎に並行座標軸
1 clone class につき,1本の折れ線を描画
RAD
LEN
POP
DFL
ソフトウェア工学工房
8
Gemini – Gapped clone(1/3)

Gapped clone とは互いに不一
致なコードを部分的に含むクローン


Copy&Paste後の編集
(挿入,削除,変更)
CCFinderでは複数のクローンペ
アに分割されて検出される
If (a > b) { b++; a=1;}
resued
resued by
by ‘copy-andpaste’
‘copy-and-paste’
renamed
inserted
deleted
modified
If (a > b)
{
//comment
b++;
a=1;
}
If (i > j)
{
//comment
j++;
i=0;
}
If (i > j)
{
i = i / 2;
//comment
j++;
i=0;
}
If (i > j)
{
//comment
i=0;
}
If (i > j)
{
//comment
j = j + 1;
i=0;
}
Exact clone
Renamed clone
Gapped clone
Gapped clone
Gapped clone
ソフトウェア工学工房
gaps
9
Gemini – Gapped clone(2/3)


Gapped cloneはCCFinderで検出されたクローン
(exact clone, renamed clone)の組み合わせと
考えられる
個々の組み合わせを全て調べ尽くす手間は膨大
2
X
ソフトウェア工学工房
3
X
4
10
code fragment Y
1
2
3
4
5
6
7
8
9
10 11 12
Gemini
–
Gapped
clone(3/3)
1 A
A

B
8
E
9
F
10
G
11
H
12
J
D
E
F
G H
D
F
G H
個々のgapped
3 C clone の組み合わせを調べるの
ではなく,gap自体の位置を調べる
I
4
5 G
CCFinderの検出したクローンペアとgapをscatter
6 H
plot上に表示することで,個々のgapped
cloneの
7 D
位置を視覚的には知ることができる
code fragment X

2
B C
: gapped clone
ソフトウェア工学工房
11
CCFinder/Gemini利用手順
(1/12)

インストール方法

実行ファイル(*.exe)を任意のディレクトリへ保
存し,環境変数Pathに当ディレクトリを設定
• “ccfinder.exe”, “ccfinder_i_*.exe”, ”shaper.exe”

“gemini.jar”を任意のディレクトリに保存し,環
境変数CLASSPATHに当jarファイルへの絶対
パスを設定
ソフトウェア工学工房
12
CCFinder/Gemini利用手順
(2/12)

Gemini起動方法

コマンドプロンプトを起動後, 任意ディレクトリへ移
動し,「java Gemini」を実行
• (VMの使用メモリ上限を増やす場合)
「java –mx512m Gemini」
• (環境変数でCLASSPATHを通していない場合)
「java –cp c:\bin\gemini.jar Gemini」

もしくは「gemini.jar」のアイコンをダブルクリック
ソフトウェア工学工房
13
CCFinder/Gemini利用手順
(3/12)

(コードクローン検出手順1) クローン検出オプション設定


メニュー[Settings] - [Clone Detection Option]
「Language」:解析対象言語
• Java,C/C++,COBOL,...

「Memory Resource Limit」:CCFinder使用メモリの上限
• 推奨は実メモリの1/10
• 設定しない場合は実メモリの1/50


「Minimum Clone Size」:検出対象クローンの最小一致トークン数
「Relation of Clone Pair」:検出対象クローンペア
• File Interior : 同一ファイル内クローンペア検出
• Cross Files : 同一グループ内の任意の異なる2ファイル間のクローンペア検出
• Cross Groups : 異なるグループ間の任意の異なる2ファイル間のクローンペア検出

「Analysis Result」:CCFinder解析結果のリダイレクト先
• デフォルトは環境変数TMPで指定された一時フォルダ内ファイル“_CCFINDER”へ
ソフトウェア工学工房
14
CCFinder/Gemini利用手順
(4/12)

(コードクローン検出手順2) クローン検出対象設定


メニュー[File] - [New Detection]
(ファイルから一覧を読み込んで自動設定する場合) (推奨)
• 「Load List」:解析対象ファイルリスト読込
• リストファイルのフォーマット
• 1行に1ファイルパス
• 絶対パスもしくは,JavaVMカレントディレクトリからの相対パス
• “-ns”:グループ区切り記号
• リストファイル作成ヒント:「dir /s /b *.java > list.txt」

(手動で設定する場合)
•
•
•
•
「New Group」:新しいグループの作成
「Add Target」:解析対象ファイル新規追加
「Remove」:選択されたファイル(グループ)を解析対象から削除
「Save List」:現在の解析対象設定を保存
ソフトウェア工学工房
15
CCFinder/Gemini利用手順
(5/12)

(コードクローン検出手順3) CCFinderの起動と解析結果の
読込み

「Target File」ウィンドウの「OK」ボタンをクリック
• CCFinderが起動され「Output Window」ウィンドウにプログレスが表
示される
• 解析が終了すると自動的に解析結果が読み込まれ,結果が表示される

既存解析結果が存在し,その結果を直接読み込む場合
• メニュー[File] - [Load Result] によりファイルを指定
• 「java Gemini」 を実行する際に引数で解析結果ファイルパスを指定
例:「java Gemini “c:\result.txt”」
ソフトウェア工学工房
16
CCFinder/Gemini利用手順
(6/12)

解析結果表示内容

左側パネル
• 「Clone Pair」
• 「Clone Class」
• 「File List」

選択状態
同期
右側パネル
•
•
•
•
「Scatter Plot」
「Metric Graph」
「File Similarity Graph」
「Source Code」
左側パネル
ソフトウェア工学工房
右側パネル
17
CCFinder/Gemini利用手順
(7/12)

左側パネル

「Clone Pair」:クローンペアの位置情報一覧
• 「Fragment1」と「Fragment2」がクローンペアで,その大きさは
「Token Size」
• “0.0 : 157, 477 – 162, 539”:
0.0 ファイルの157行目から162行目までのコード片
(477,539は先頭からのトークンインデックス)

「Clone Class」:クローンクラス要素一覧
• ツリーの各ルートノードが各クローンクラス
• ツリーの各葉がクローンクラス内の要素(コード片)
• “0.0 : 157 – 162”:
0.0 ファイルの157行目から162行目までのコード片

「File List」: ファイルパス一覧
• 「ID」:各ファイルにCCFinderで割り振られた番号
• “0.0”:0番グループ内の0番ファイル
ソフトウェア工学工房
18
CCFinder/Gemini利用手順
(8/12)

右側パネル

「ScatterPlot」
• 「Vertical」「Horizontal」:マウスポインタが指す位置で比較されている各ファイルパス
• グリッド線:ファイル区切り(灰色),グループ区切り(黒色)
• 右クリックメニュー
• 「Reset To Overview」:ズーム表示状態から全体表示に戻る
• 「Zoom」:マウスポインタがズーム状態に変わる(左マウスドラッグで領域を選択し
ズーム)
• 「Sort by ...」:両座標軸でのファイル並びを類似率に基づいて並べ替え
File Index:
ユーザが設定した順番(デフォルト)
Clone Coverage about All Files:
全てのファイルをソート
Clone Coverage about Files in Group:
各グループ内でファイルをソート
Clone Coverage about Group:
各グループの並びをソート
ソフトウェア工学工房
19
CCFinder/Gemini利用手順
(9/12)
• ~右クリックメニュー
• 「Display」:各項目の表示の有無
ファイル,グループ区切り,クローンの全く存在しないファイル
• メニュー[Settings] - [Scatter Plot Option]
• 「Clone Pair Filter」:表示するクローンペアの最小一致トークン数を指定
(Gapが表示中の際には,連結集合のサイズが対象)
• 「Gap」:Gapの表示の有無 (「Upper Limit」以下のgapが対象)
• 「Border Line」:ファイルグループ区切りの表示の有無
• クローンペア選択
• 左マウスドラッグで領域選択を行うと,その領域内に少しでも含まれたクローンペ
アが選択状態(赤い長方形)になる
(注: 現在,Clone Pair Filterにより非表示中のクローンペアも選択される)
• 選択されたクローンペアのソースコードは「Source code」タブを表示することに
より参照できる
ソフトウェア工学工房
20
CCFinder/Gemini利用手順
(10/12)

「Clone Class Metric Graph」
•
フィルタリング手順
1.
2.
3.
4.
5.
•
グラフ左下部分の「Filtering Mode : OFF」部分を左クリック
グラフ全体にフィルタ(濃紫)がかかる(全クローンクラスが選択状態)
各座標軸の上下端の部分をドラッグしてフィルタの範囲選択を行う
選択範囲内のクローンクラスのみが選択状態になる
「Source code」タブ表示によるソースコード参照等を行う
その他,軸反転機能,色変更機能...
ソフトウェア工学工房
21
CCFinder/Gemini利用手順
(11/12)

「File Similarity Graph」
• RSA(f):ファイルfのソースコードがf以外の任意のファイルとの
コードクローンでどれだけカバーされているか
• RST(f1,f2):ファイルf1のソースコードがファイルf2とのコードクローン
でどれだけカバーされているか
• RSA,RST値はScatter Plotの類似率ソート基準に併用
• 「Sort」:指定「Metric」の値を基準に降順ソート
RSA
RST
ソフトウェア工学工房
22
CCFinder/Gemini利用手順
(12/12)

「Source Code」
• クローンペアは対で表示
• 選択コードクローン片はハイライト表示
• 編集は不可(オリジナルソースファイルには未反映)
タブトップにマウスを
置くとファイルパス
ソフトウェア工学工房
23
コードクローン情報活用方法(1/3)

ソフトウェア保守目的の分類 [2]

修正のための保守(Correction): 発見された問題を修正するために、納
入後に実施される、ソフトウェア・プロダクトの対処的改変

適応のための保守(Adaptation): 変化した、または変化しつつある環境
において、ソフトウェア・プロダクトを続けて使用可能なように維持するた
めに、納入後に実施される、ソフトウェア・プロダクトの改変

完全化のための保守(Perfection): 性能または保守性を改善するため、
納入後に実施される、ソフトウェア・プロダクトの改変

予防のための保守(Prevention): ソフトウェア・プロダクトのなかに潜む、
潜在的なフォールトが、効果的なフォールトに転じる前に、それを検出し、
修正するために、納入後に実施される、ソフトウェア・プロダクトの改変
ソフトウェア工学工房
24
コードクローン情報活用方法(2/3)
各保守目的に対するコードクローン情報利用ケース





Case1[Correction, Prevention]: あるフォールトが見つかった際に,類
似コード片に含まれる類似フォールトも修正したい.
Case2[Adaptation]:変化した環境に合わせ,ある変更を行った際に,同
じような変更を行うべき箇所を探したい.
Case3[Perfection]:類似コードを関数等に抽出したり,類似機能をもつ
コードをマージすることで保守性を向上したい.
Case4[Prevention]:将来的に問題を起こすかもしれない潜在的に問題
を含む信頼性の低いコードを探したい.
ソフトウェア工学工房
25
コードクローン情報活用方法(3/3)
各ケースに対するGeminiの利用方法ヒント


Case1,Case2
•
•

Case3:
•
•

この利用に特化したインターフェースは現在備えていない(現在,試作中)
探したい特定のコード片を新規ファイルとして作成し,検索対象ファイル群を1グ
ループ,当新規ファイルを1グループとして,グループ間クローンペアのみ検出す
ることで代用可能
「Clone Class Metric Graph」による関数抽出の候補選出
DFL値が高いクローンクラス
高POP値かつ低RAD値を持つクローンクラス
「File Similarity Graph」の高いRSA値を持つファイルから不要なコンポーネン
トを探す
Case4:
•
•
「Clone Class Metric Graph」のLEN値の高いコードクローンを探す
大きなクローンほどよりフォールトを含む傾向がある[4]
複数バージョン間を比較し「File Similarity Graph」の低いRST値を持つファイ
ルから,アップグレードの際の変更点が多く信頼性が低いコンポーネントを探す
ソフトウェア工学工房
26
今後の展開(1/3)

現在のGeminiの問題点


スケーラビリティが低い
開発現場等からの要求









大規模プログラムへの適用可能性
不一致部分の許容
ライブラリ化・サブルーチン化対象となる部品抽出
Google的インターフェース
• コード断片,構文,正規表現のようなパターンを入力
Webインターフェース
クローンクラスベースの分析ツール
ユーザ定義名を残して,それ以外をパラメータ化(COBOL)
抽出されたクローン間の世代関係を把握
フレームワークに追加されたコードパターンの確認
ソフトウェア工学工房
27
今後の展開(2/3)

SPARS(ソフトウェアプロダクトの収集・解析・検索
システム)との統合

http://sel.ist.osaka-u.ac.jp/SPARS/
解析依頼
リポジトリ管理部
定期的またはイベント
による更新
Webページ
結果
解析
依頼
結果
Eclipseなどの
統合開発環境
リポジトリ群
ソフトウェア工学工房
28
今後の展開(3/3)
編集
User
Source code
クローン情報
Web ページ,Eclipse などのIDE
Source code repository
トリガ(デーモン)
定期的または
イベントにより起動
粒度調整ツール
絞り込みツール
(ブロック抽出, 構文等)
CCFinder
SPARS
database
との連携
Code clone database
ソフトウェア工学工房
29
保守作業(類似コード片分布)
開発部品
リポジトリ
クローン
解析
キーワード
検索
コード片
検索
解析プログラム群
20年間使われ
続けているコード
中に冗長なコー
ドはどれくらいあ
るのかな?
/home/project/leg1
ソフトウェア工学工房
解析
30
保守作業(類似コード片分布)
開発部品
リポジトリ
それなりに多く
あるようだ.リ
ファクタリングし
よう.
選択
ソフトウェア工学工房
31
保守作業(リファクタリング)
開発部品
リポジトリ
この部分はどう
なっているの
か?
選択
ソフトウェア工学工房
32
保守作業(リファクタリング)
開発部品
リポジトリ
なんとなく抽出
できそうなメソッ
ドだ.どのファイ
ルにあるのか
な?
public final void mOPEN_ELEMENT_OPTION(boolean
_createToken)
throws RecognitionException, CharStreamException,
TokenStreamException {
int _ttype;
Token _token=null;
int _begin=text.length();
ttype = OPEN_ELEMENT_OPTION;
int _saveIndex;
}
match('<');
if ( _createToken && _token==null &&
_ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(),
_begin, text.length()-_begin));
}
_returnToken = _token;
ソフトウェア工学工房
詳細表示
33
保守作業(リファクタリング)
開発部品
リポジトリ
かなり多くある
のでまとめた方
がよさそうだ.
clone class ID 107
ファイル名
開始,終了行
MSVab.java
10, 30
amay.java
15, 35
ogih.java
12, 32
adeu.java
5, 25
meu.java
33, 53
...
ソフトウェア工学工房
34
保守作業(機能追加)
開発部品
リポジトリ
クローン
解析
キーワード
検索
コード片
検索
検索コード名
機能追加には,
MSVab.javaを変
更したらよいみた
いだ.このコードの
クローンを持って
いる部品はどれく
らいあるかな?
/home/project/leg2/MSVab.java
ソフトウェア工学工房
35
保守作業(機能追加)
開発部品
リポジトリ
部品一覧
キーワード
検索
コード片
検索
部品名
・waka.java
・・・・・・・・・・・・・・・・・・・
1個だけか.簡
単に変更できる
な.
ソフトウェア工学工房
36
保守作業(機能追加)
開発部品
リポジトリ
たくさんありすぎ
るので,これは
新しい部品で実
装した方がよさ
そうだ.
部品一覧
キーワード
検索
部品名
コード片
検索
重要度
・waka.java
・・・・・・・・・・・・・・・・・・・
・taka.java
・・・・・・・・・・・・・・・・・・・
・shinihi.java
・・・・・・・・・・・・・・・・・・・
他,1353個
ソフトウェア工学工房
37
部品一覧
開発部品
リポジトリ
ソートに使える
開発した部品の
中で重要な部品
部品はないのか
はなんだろう?
な?
部品一覧
キーワード
検索
部品名
コード片
検索
重要度
・object.java
・・・・・・・・・・・・・・・・・・・
・class.java
・・・・・・・・・・・・・・・・・・・
・exception.java
・・・・・・・・・・・・・・・・・・・
ソフトウェア工学工房
38
部品の検索機能(キーワード)
開発部品
リポジトリ
キーワード
検索
コード片
検索
検索キーワード
ソートに使える
部品はないのか
な?
sort
ソフトウェア工学工房
検索
39
部品の検索機能(キーワード)
開発部品
リポジトリ
ソートに使える
部品はないのか
な?
部品一覧
キーワード
検索
部品名
コード片
検索
重要度
・quicksort.java
・・・・・・・・・・・・・・・・・・・
・samplesort.java
・・・・・・・・・・・・・・・・・・・
・sorting.java
・・・・・・・・・・・・・・・・・・・
ソフトウェア工学工房
40
部品の検索機能(コード片)
開発部品
リポジトリ
キーワード
検索
コード片
検索
検索コード片
Process ps = r.exec(name);
このコード片を
新しいプロセス
使用している部
を起動して出力
品はないのか
を得るコードな
な?
んだけど…
InputStream in =
ps.getInputStream();
BufferedReader bufin =
new BufferedReader(
new InputStreamReader(in));
ソフトウェア工学工房
検索
41
部品の検索機能(コード片)
開発部品
リポジトリ
どのような部品
このコード片を
なのかな?
使用している部
品はないのか
な?
部品一覧
キーワード
検索
部品名
コード片
検索
重要度
・exec.java
・・・・・・・・・・・・・・・・・・・
・execution.java
・・・・・・・・・・・・・・・・・・・
・process.java
・・・・・・・・・・・・・・・・・・・
ソフトウェア工学工房
42
類似部品群検索機能
開発部品
リポジトリ
どのような部品
類似部品はある
のかな?
なのかな?
部品詳細
キーワード
検索
コード片
検索
exec.java
import java.io.*;
public class Exec {
/** 最初に呼び出されるメソッド */
public static void main( String argv[] ) {
try {
Runtime runtime =
Runtime.getRuntime();
Process process =
runtime.exec( argv );
// 呼び出したプログラムの出力を標準
ソフトウェア工学工房
類似
部品群
被利用
部品群
43
類似部品群検索機能
開発部品
リポジトリ
類似部品はある
のかな?
部品一覧
キーワード
検索
コード片
検索
部品名
・exec.java
・・・・・・・・・・・・・・・・・・・
・exec2.java
・・・・・・・・・・・・・・・・・・・
ソフトウェア工学工房
44
被利用部品群検索機能
開発部品
リポジトリ
どのように利用
すればいいのか
な?
部品詳細
キーワード
検索
コード片
検索
exec.java
import java.io.*;
public class Exec {
/** 最初に呼び出されるメソッド */
public static void main( String argv[] ) {
try {
Runtime runtime =
Runtime.getRuntime();
Process process =
runtime.exec( argv );
// 呼び出したプログラムの出力を標準
ソフトウェア工学工房
類似
部品群
被利用
部品群
45
被利用部品群検索機能
開発部品
リポジトリ
これらの部品が
利用しているの
か
部品一覧
キーワード
検索
部品名
コード片
検索
重要度
・system.java
・・・・・・・・・・・・・・・・・・・
・newprocess.java
・・・・・・・・・・・・・・・・・・・
・newsystem.java
・・・・・・・・・・・・・・・・・・・
ソフトウェア工学工房
46
参考文献
[1] Y. Higo, Y. Ueda, T. Kamiya, S. Kusumoto, K. Inoue, “On Software Maintenance Process
Improvement Based on Code Clone Analysis”, Proc. of the 4th International Conference on
Product Focused Software Process Improvement, 2002, (to appear).
[2] IEEE Std 1219: Standard for Software Maintenance, 1997.
[3] T. Kamiya, S. Kusumoto, and K. Inoue, “CCFinder: A Multilinguistic Token-Based Code Clone
Detection System for Large Scale Source Code”, IEEE Transactions on Software Engineering,
Vol.28, No.7, pp. 654-670, 2002.
[4] A. Monden, D. Nakae, T. Kamiya, S. Sato, K. Matsumoto, “Software Quality Analysis by Code
Clones in Industrial Legacy Software”, Proc. of the 8th IEEE International Symposium on Software
Metrics, pp. 87-94, 2002.
[5] Y. Ueda, T. Kamiya, S. Kusumoto, K. Inoue, “Gemini: Maintenance Support Environment
Based on Code Clone Analysis”, Proc. of the 8th International Symposium on Software Metrics,
pp.67-76, 2002.
[6] Y. Ueda, T. Kamiya, S. Kusumoto, K. Inoue, “On Detection of Gapped Code Clones using Gap
Locations”, Proc. of the 9th Asia-Pacific Software Engineering Conference, 2002, (to appear).
ソフトウェア工学工房
47