• 検索結果がありません。

sum += parseNumber(exp.getParen(0));

17. }

18. System.out.println("sum = " + sum);

4-6

行目と

13-15

行目

8-10

行目

17-19

行目

Java 向けの変形ルール

RJ1

:パッケージ名除去

( PackageName ‘.’ )+ ClassName → ClassName RJ2:Callee

挿入

NDotOrNew NClassName ‘(‘

→ NDotOrNew CalleeIdentifier ‘.’ NClassName ‘(‘

RJ3:

テーブル初期化除去

'=' '{' InitalizationList, '}' → '=' '{' UniqueIdentifier '}‘

']' '{' InitalizationList, '}' → ']' '{' UniqueIdentifier '}' RJ4:

モジュールの分離

トップレベルの定義や宣言の終わりに

UniqueIdentifier

を挿 入する

最適化

Suffix-tree

による

O(n log n)

のマッチングアルゴリ ズム

(

入力ソースファイルの大きさを

として

)

簡便なアルゴリズム

(

最適アルゴリズムは

O(n))

メモリ使用量を削減

「文の最初のトークンだけがクローンの開始位置 となることができる」制約によりメモリ使用量を 削減

大規模なソースファイルには分割して処理を行う

JDK のライブラリへの適用

JDK

Java Development Kit

1.2.2

(サンプル とデモプログラムを除く)

入力ファイルは

164

8個,約

50

万行

ツールの実行には,

Pentium III 650MHz

および

1GB

RAM

を持つ

PC

で約

3

分を要した

クローンの散布図

両軸はソースファイ ルを辞書順に並べた もの

20

行以上のクローン を図示

多くのクローンが密 集している(

A)

最長のクローン

B

A

B

クローンが密集している部分

( A )

src/javax/swing/plaf/multi/*.java

29

のファイル コード生成ツールによって生成された

いくつかはクラス名を除いてまったく同じクラ スの定義を含んでいた

31| */

32| public class MultiButtonUI extends ButtonUI { 33|

160| public static ComponentUI createUI(JComponent a) { 161| ComponentUI mui = new MultiButtonUI();

162| return MultiLookAndFeel.createUIs(mui, 163| ((MultiButtonUI) mui).uis,

164| a);

165| }

最長のクローン( B )

最長のクローン(

349

行)

src/java/util/Arrays.java

18

の“

sort”

メソッド シグネチャ(引数の型と数)が異なる

アルゴリズムは同一

変形ルールの評価

変形/置換なしでは発見されるクローンは半減す る

0 200 400 600 800 1000

20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 10 0. .

クローンの長さ

(LOC)

変形ルールを適用

適用せず

その他の適用実験

オープンソース

Qt(C++

2

4万行

)

C++

向けの変形ルールの効果を確認した

Linux

FreeBSD

のカーネルとドライバ

(C

160

万行+

130

万行

)

ドライバ部分にクローン「ファイル」が多数存在する システム間で名前が異なるファイル

商用

NTT

データ

(

出入国管理システム

) COBOL

120

万行

NASDA(

ロケットの制御・管制

)

C

50

万行

結論と課題

結論

ソースコードの変形を用いるコードクローン検出 手法を提案した

実験では,提案する手法が

JDK

のライブラリか ら効果的にコードクローンを検出することが確認 された

課題

構文によるクローン選別 クローン除去

クローン検出の保守プロセスでの利用

「横並びリスト」を補完する手段

むすび

複雑度メトリクスによるフォールト予測 再利用を考慮した構造メトリクス計測法

CK

メトリクスを開発プロセスの初期に計測する手法 フレームワークを用いた開発においてクラス分類を行 い予測精度を高める手法

→ フレームワークによってクラス分類を行う手法を提案 し,実験によってフォールト修正時間予測精度を評価 コードクローン検出

オブジェクト指向プログラミング言語向けのコードク ローン検出手法

→ 検出手法を提案し,

JDK

のソースファイルに適用した

関連したドキュメント