Microsoft PowerPoint _01.ppt

Similar documents
SES2012.pdf

発表内容 背景 コードクローン 研究目的 4 つのテーマ 研究内容 テーマ毎に, 概要と成果 まとめ 2

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

米澤研究室全体ミーティング (2005/11/08) M1 佐藤秀明 1

ソフトウェアエンジニアリングシンポジウム 2013 Smith-Waterman 1,a) 1,b) 1,c) 1,d) 1,e) LCS Smith-Waterman Bellon Gapped Code Clone Detection Using The Smith-Waterman Algor

Prog1_6th

5-3- 応統合開発環境に関する知識 1 独立行政法人情報処理推進機構

Microsoft PowerPoint - 計算機言語 第7回.ppt

Microsoft Word - Javacc.docx

. 1.,, Gemini[12].,.,,.,,.,.,,., 1,, [9], [13].,,,., 2., 3, 4., ,., [4].,,,.,, 1 Fig. 1 [5]. Gemini Example of scatter plot in Gemini.,,. 1 [

Prog1_10th

文字列操作と正規表現

プログラム圧縮による ソースコード流用の検出

Prog1_15th

PowerPoint Presentation

研究成果報告書

Prog2_9th

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

2 概要 市場で不具合が発生にした時 修正箇所は正常に動作するようにしたけど将来のことを考えるとメンテナンス性を向上させたいと考えた リファクタリングを実施して改善しようと考えた レガシーコードなのでどこから手をつけて良いものかわからない メトリクスを使ってリファクタリング対象を自動抽出する仕組みを

Prog2_10th

プログラミング実習I

_unix_text_command.pptx

Microsoft Word - problem3.doc

Java講座

中間報告

Prog1_10th

2006年10月5日(木)実施

JavaプログラミングⅠ

Brekeke PBX - Version 2.1 ARSプラグイン開発ガイド

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

PowerPoint プレゼンテーション

kiso2-03.key

Prog1_12th

ソフトウェア基礎 Ⅰ Report#2 提出日 : 2009 年 8 月 11 日 所属 : 工学部情報工学科 学籍番号 : K 氏名 : 當銘孔太

26 editor.putint(pref_count_key, executecount); 27 // 変更した Preference を確定させる 28 editor.commit(); 29 } (c) 実行の様子実装して実行した様子を図 1 と図 2 に示す. 一度実行するごとに, カウン

JEB Plugin 開発チュートリアル 第4回

ポインタ変数

ポインタ変数

メディプロ1 Javaプログラミング補足資料.ppt

Javaの作成の前に

PowerPoint プレゼンテーション

Microsoft PowerPoint - 11.pptx

PowerPoint プレゼンテーション

Microsoft PowerPoint ppt

slide5.pptx

Java言語 第1回

Microsoft PowerPoint - prog03.ppt

Microsoft PowerPoint - 09.pptx

基本情報STEP UP演習Java対策

VBコンバータ利用方法

ファイル入出力

プログラミング入門1

プログラミング基礎I(再)

情報技術 Java の特徴 Java は現在 事務処理計算用プログラミング言語として開発された COBOL に取って代わり C 言語や C++ と並んで 現在最も使われているプログラミング言語の一つである Java は Write Once, Run Anywhere( プログラムを一度作成したらど

オブジェクト指向プログラミング・同演習 5月21日演習課題

C#の基本2 ~プログラムの制御構造~

Microsoft認定資格問題集(70-483_demo)

intra-mart Accel Platform — IM-BloomMaker プログラミングガイド   初版  

Prog1_11th

メソッドのまとめ

ファイル操作

Sort-of-List-Map(A)

Prog1_2nd

トレーサビリティとインパクト分析 2011 年 7 月 13 日 海谷治彦 1

Java プログラミング Ⅰ 3 回目変 数 今日の講義講義で学ぶ内容 変数とは 変数の使い方 キーボード入力の仕方 変 数 変 数 一時的に値を記憶させておく機能 変数は 型 ( データ型 ) と識別子をもちます 2 型 ( データ型 ) 変数に記憶する値の種類変数の型は 記憶できる値の種類と範囲

PowerPoint Presentation

Prog1_3rd

ファイル入出力

情報処理Ⅰ

JavaプログラミングⅠ

Microsoft PowerPoint - kougi6.ppt

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

V8.1新規機能紹介記事

<4D F736F F F696E74202D20352D335F8D5C90AC CF909482CC90B690AC82C695D28F572E707074>

概要 ABAP 開発者が SAP システム内の SAP ソースまたは SAP ディクショナリーオブジェクトを変更しようとすると 2 つのアクセスキーを入力するよう求められます 1 特定のユーザーを開発者として登録する開発者キー このキーは一度だけ入力します 2 SAP ソースまたは SAP ディクシ

タブ or スペース? インデントには タブ文字を使用する方法と半角スペースを使用する方法があります インデントにタ ブ文字を使うか半角スペースを使うかは 各プロジェクトで決められていることもありますが プログラ ムを書く人の好みだったりすることもあります まともなエディタであれば タブキーを押下し

デジタル表現論・第4回

C3 データ可視化とツール

プレポスト【解説】

JavaプログラミングⅠ

このルールをそのまま正規表現として書くと 下記のようになります ^A[0-9]{2}00[0-9]{3}([0-9]{2})?$ ちょっと難しく見えるかもしれませんが 下記のような対応になっています 最初 固定 年度 固定 通番 ( 枝番 ) 最後 ルール "A" 数字 2 桁 0 を 2 桁 数字

できるプログラマーを本気で育てる Java 超 Webプログラマーへの第 歩 第 3 回コレクションと例外処理 テクノロジックアート 瀬嘉秀

Android Layout SDK プログラミング マニュアル

フローチャート自動生成ツール yflowgen の使い方 目次 1 はじめに 本ツールの機能 yflowgen.exe の使い方 yflowgen.exe の実行方法 制限事項 生成したファイル (gml ファイル形式 ) の開

Microsoft PowerPoint - 5Chap15.ppt

GEC-Java

テキストファイルの入出力1

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

基礎計算機演習 実習課題No6

TestDesign for Web

Microsoft PowerPoint - CproNt02.ppt [互換モード]

メソッドのまとめ

デザインパターン第一章「生成《

プログラミングI第10回

PowerPoint Template

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

Java Scriptプログラミング入門 3.6~ 茨城大学工学部情報工学科 08T4018Y 小幡智裕

ガイダンス

memo

(Microsoft PowerPoint - \223\306\217KJAVA\221\346\202R\224\ ppt)

Transcription:

コードクローンとは コードクローン検出技術とその利用法 大阪大学大学院情報科学研究科コンピュータサイエンス専攻井上研究室肥後芳樹 (y-higo@ist.osaka-u.ac.jp) ソースコード中に存在する, 他のコード片と一致または類似しているコード片 さまざまな理由により生成される コピーアンドペーストによる再利用 定型的な処理 例 ファイルオープン, データベース接続 意図的な繰り返し パフォーマンス重視 コードクローンコピーアンドペースト ソフトウェアの保守を困難にする あるコード片にバグがあると, そのコードクローン全てについて修正の検討を行う必要がある 機能を追加する場合も同様のことがいえる 1 2 コードクローンの一般的な定義はない これまでにいくつかのコードクローン検出手法が提案されているが, それらはどれも異なるを持つ 紹介するコードクローン検出技術 行単位での検出手法 AST(Abstract Syntax Tree) を用いた検出手法 PDG(Program Dependency Graph) を用いた検出手法 メトリクスを持ちいた検出手法 トークン単位での検出手法 3 4 行単位での検出手法 ソースコードを行単位で比較し, コードクローンを検出する [1] 比較の前に空白, タブは取り除かれる 初期の検出技術 検出の精度が良くない コーディングスタイルが違うと検出できない 例 if 文や while 文の括弧の位置 変数名が異なると検出できない 変数名が違っても, ロジックが同じ部分はコードクローンとして検出したい [1]B. S. Baker, A Program for Identifying Duplicated Code, Proc. Computing Science and Statistics 24 th Symposium on the Interface, pp.49-57, Mar. 1992. 5 AST を用いた検出手法 ソースコードを構文解析し,AST(Abstract Syntax Tree) を作成. 一致する部分木をコードクローンとして検出する [2] 変数名の違いは吸収される 実用的な検出手法であり, 商用ツールとして実装されている CloneDR http//www.semanticdesigns.com/products/clone/ [2] I.D. Baxter, A. Yahin, L. Moura, M.S. Anna, and L. Bier, Clone Detection Using Abstract Syntax Trees, Proc. International Conference on Software Maintenance 98, pp368-377, 16-19, Nov. 1998. 6 1

PDG を用いた検出手法 ソースコードを意味解析し, コントロールフロー データフローを抽出. この情報から PDG(Program Dependence Graph) を作成し, 一致する部分グラフをコードクローンとして検出 [3]. 非常に高い検出精度 他の検出手法では検出できないコードクローンも検出可能 インタートバインドクローン, リオーダードクローン 非常に計算コストが大きい 実用的でない PDG を用いた検出手法 ( インタートバインドクローン ) 互いにインタートバインド ( 絡み合っている ) なコードクローン ソースコード a = x1 + y1; b = x2 + y2; printf( %d n, a); printf( %d n, b); コードクローン A a = x1 + y1; printf( %d n, a); コードクローン B b = x2 + y2; printf( %d n, b); [3] R. Komondoor and S. Horwitz, Using slicing to identify duplication in source code, Proc. the 8th International Symposium on Static Analysis, pp.40-56, July, 16-18, 2001. 7 8 PDG を用いた検出手法 ( リオーダードクローン ) 文の順番が入れ替わっている ( リオーダード ) コードクローン ソースコード A ソースコード B メトリクスを用いた検出手法 関数 メソッド単位で (21 種類の ) メトリクスを計測, その値の近似 一致によりコードクローンを検出 [4]. リオーダー a = x1 / y1; b = x2 * y2; c = a + b; printf( %d n, c); b = x2 * y2; a = x1 / y1; c = a + b; printf( %d n, c); 検出されるコードクローンは関数 メソッド単位 関数の一部のみが重複している場合, 検出できない リファクタリングには有効 リファクタリングを行いやすい単位 9 [4] J. Mayland, C. Leblanc, and E.M. Merlo, Experiment on the automatic detection of function clones in a software system using metrics, Proc. International Conference on Software Maintenance 96, pp.244-253, Nov. 1996. 10 トークン単位での検出手法 ソースコードをトークン単位で直接比較することによりコードクローンを検出 [5] 型名, 変数名などを表すトークンは, 特別なトークンに置き換える. 比較 クローンの検出精度が優れている手法 PDG を用いた検出手法 行単位での検出手法, メトリクス単位手法での検出は検出漏れが多い 非常に高いスケーラビリティ AST や PDG などの作成を必要としない 実用的に使える手法 AST を用いた検出手法, トークン単位での検出手法 PDG を用いた検出手法は計算コストが大きすぎる [5] T. Kamiya, S. Kusumoto, and K. Inoue, CCFinder A multi-linguistic token-based code clone detection system for large scale source code, IEEE Transactions on Software Engineering, vol. 28, no. 7, pp. 654-670, Jul. 2002. 11 12 2

コードクローン検出ツール CCFinder コードクローン検出ツール CCFinder 概要 ソースコードをトークン単位で直接比較することにより, コードクローンを検出する ( トークン単位での検出手法 ) より実用的なコードクローンを見つけることができるように設計されている ユーザ定義名の置き換え テーブル初期化部分の取り除き モジュールの区切りの認識 解析結果はテキスト形式で出力 数百万行規模でも実用的な時間で解析可能 13 14 コードクローン検出ツール CCFinder 検出プロセス 1. static void foo() throws RESyntaxException 2. String a[] = new String [] "123,400", "abc", "orange 100" ; 3. org.apache.regexp.re pat = new org.apache.regexp.re("[0-9,]+"); 4. int sum = 0; 5. for (int i = 0; i < a.length; ++i) 6. if (pat.match(a[i])) 7. sum += Sample.parseNumber(pat.getParen(0)); 8. System.out.println("sum = " + sum); 9. 10. static void goo(string [] a) throws RESyntaxException 11. RE exp = new RE("[0-9,]+"); 12. int sum = 0; 13. for (int i = 0; i < a.length; ++i) 14. if (exp.match(a[i])) 15. sum += parsenumber(exp.getparen(0)); 16. System.out.println("sum = " + sum); 17. Source files 字句解析 トークン列 変換処理 変換後トークン列 検出処理 クローン情報 出力整形処理 クローンペア位置情報 15 コードクローン検出ツール CCFinder 検出例 三つの OS のソースコードを対象にコードクローンを検出した NetBSD FreeBSD Linux NetBSD と FreeBSD は多くのコードクローンが存在している 祖先が同じだから FreeBSD 4.0 Linux 2.4.0 NetBSD 1.5 FreeBSD 4.0 Linux 2.4.0 NetBSD 1.5 16 コードクローン検出ツール Gemini 背景 CCFinder を用いることにより, 大規模なソフトウェアから短時間でコードクローンを検出できるようになった しかし, 大量のコードクローンが検出されてしまい, 手作業ですべてのコードクローンをチェックするのは非現実的 大量のコードクローン情報を上手に扱うメカニズムが必要 ソフトウェア内でのコードクローンの分布状態の表示 ユーザが興味のある特徴を持ったコードクローンの提示 17 18 3

概要 CCFinder の出力した検出結果ファイル ( テキストファイル ) を読み込み, コードクローン情報を視覚的に表示 インタラクティブなコードクローン分析を実現 主なビュー スキャタープロット コードクローンの量 分布状態を俯瞰的に表示 メトリクスグラフ ファイルリスト コードクローン ファイルを定量的に特徴づける. またその特徴を用いたコードクローン ファイルの選択機構を実現 フィルタリングメトリクス RNR ユーザが目で確認を行う必要のないコードクローンのフィルタリングを行う クローンペアとクローンセット クローンペア 互いに一致または類似しているコード片の対 ( ペア ) クローンセット 互いに一致または類似しているコード片の集合 ( セット ) 共にコードクローンを表す用語であるが, これらを使い分けることにより, よりスムーズに議論を行うことができる C1 C2 C3 C4 C5 クローンペア (C1, C2) (C1, C4) (C2, C4) (C3, C5) クローンセット C1, C2, C4 C3, C5 19 20 説明に用いる例 Gemini の各特徴を説明するために以下の例を用いる ディレクトリ D 1 以下には 2 つのファイル F 1,F 2 が存在する ディレクトリ D 2 以下には 2 つのファイル F 3, F 4 が存在する 各ファイルは以下の5トークンから成る F 1 a b c a b, F 2 c c* c* a b, F 3 d e f a b, C(F i, j, k) はファイル F i の j 番目のトークン F 4 c c* d e f, f から k 番目までのトークンのコード片を表す これら4つのファイルから長さが2 以上のコードクローンを検出すると, 次の3つのクローンセットが得られる. S 1 C(F 1, 1, 2), C(F 1, 4, 5), C(F 2, 4, 5), C(F 3, 4, 5), S 2 C(F 2, 1, 2), C(F 2, 2, 3), C(F 4, 1, 2), S 3 C(F 3, 1, 3), C(F 4, 3, 5) 21 フィルタリングメトリクス RNR( 定義 ) CCFinder の検出するコードはトークンの列であり, 重要でないコードクローンを多数検出してしまう switch 文の各 case エントリ 連続した変数宣言や関数呼び出し フィルタリングメトリクス RNR(S) クローンセット S に含まれるコード片の非繰り返し度を表す 定義 RNR(S) = 1 - Tokensrepeated(C) C S Tokensall(C) C S Tokensall(C) コード片 C の総トークン数 Tokensrepeated(C) コード片 C 中の繰り返し部分のトークン数 22 フィルタリングメトリクス RNR( 例 ) アスタリスク * の付いたトークンは, その直後のトークン列の繰り返しであることを表している クローンセット S 1, S 1, S 3 の RNR は, RNR(S 1 ) = 1-0 + 0 + 0 + 0 2 + 2 + 2 + 2 = 8 8 = 1.0 RNR(S 2 ) = 1-1 + 2 + 1 2 + 2 + 2 = 2 6 = 0.33333 RNR(S 3 ) = 1-0 + 0 3 + 3 = 6 6 = 1.0 繰り返しの多いクローンであることを表している F1 a b c a b, S 1 C(F 1, 1, 2), C(F 1, 4, 5), C(F 2, 4, 5), C(F 3, 4, 5), F2 c c* c* a b, S 2 C(F 2, 1, 2), C(F 2, 2, 3), C(F 4, 1, 2), F3 d e f a b, S 3 C(F 3, 1, 3), C(F 4, 3, 5) F4 c c* d e f, 23 スキャタープロット 水平 垂直方向にソースコード中のトークンを出現順に配置 原点は左上隅 はその水平方向のトークンと垂直方向のトークンが等しいことを意味する クローンペアは線分として出現する は RNR が閾値以上のコードクローンを表す は RNR が閾値未満のコードクローンを表す ひと目で分布状態を把握できる D1 D2 F1 F2 F3 F4 a b c a b c c c a b d e f a b c c d e f D1 D2 F1 F2 F3 F4 a b c a b c c c a b d e f a b c c d e f F1, F2, F3, F4 files D1, D2 directories matched position detected as a practical code clone matched position detected as a non-interesting code clone 24 4

メトリクスグラフ ( 用いているメトリクス ) LEN(S) クローンセット S 内に含まれるコード片のトークン数の平均値を表す LEN(S 1 ) = 2, LEN(S 2 ) = 2, LEN(S 3 ) = 3 POP(S) S に含まれるコード片の数を表す POP(S 1 ) = 4, POP(S 2 ) = 3, POP(S 3 ) = 2 NIF(S) S に含まれるコード片を所有しているファイルの数を表す NIF(S 1 ) = 3, NIF(S 2 ) = 2, NIF(S 3 ) = 2 RNR(S) S に含まれるコード片の非繰り返し度を表す RNR(S 1 ) = 1.0, RNR(S 2 ) = 0.33, RNR(S 3 ) = 1.0 メトリクスグラフ ( メカニズム ) 多次元並行座標表現を用いている 各メトリクスにつき 1 つの座標軸が存在する 各クローンセットにつき 1 つの折れ線がメトリクス値に基づいて描画される ユーザは各メトリクスの上限 下限を変更することでクローンセットの選択 選択解除を行う 全てのメトリクスが上限と下限の間にあるクローンセットが選択状態になる 選択状態にあるクローンセットのソースコードは簡単に閲覧可能 選択前 3 1.0 3 4 S 3 S 1 S 2 2 0.0 1 2 LEN RNR NIF POP 選択後 3 1.0 3 4 S 3 S 1 S 2 2 0.0 1 2 25 LEN RNR NIF POP 26 ファイルリスト ( 用いているメトリクス ) 全てのメトリクスは閾値 th を用いている. RNR の値が th 以上のコードクローンのみを対象にする ROC th (F) ファイル F の重複度を表す 完全にクローンになっている場合は 1.0 全くクローンを含まない場合は 0.0 ROC 0.5 (F 1 ) = 0.8, ROC 0.5 (F 2 ) = 0.4, ROC 0.5 (F 3 ) = 1.0, ROC 0.5 (F 4 ) = 0.6 NOC th (F) F に含まれるコードクローンの数を表す NOC 0.5 (F 1 ) = 2, NOC 0.5 (F 2 ) = 1, NOC 0.5 (F 3 ) = 2, NOC 0.5 (F 4 ) = 1 F1 a b c a b, F2 c c* c* a b, F3 d e f a b, F4 c c* d e f NOF th (F) F とコードクローンを共有しているファイルの数を表す NOF 0.5 (F 1 ) = 2, NOF 0.5 (F 2 ) = 2, NOF 0.5 (F 3 ) = 3, NOF 0.5 (F 4 ) = 1 27 ファイルリスト ( メカニズム ) 対象ファイル一覧を表示 各ファイルはファイル名 メトリクスと共に表示される 括弧の外の値は閾値 th の値, 括弧の中の値は閾値 0 の値 ソーティング機能 ファイルを任意のメトリクスの昇順 降順で並び替え可能 興味のある特徴をもったファイルをすぐに特定できる メトリクスグラフとして実装しなかった理由 クローンセットはメトリクス値のみに基いて選択される ファイルはファイル名などでも選択されることがある 28 デモンストレーション デモンストレーション (1/2) 対象 大阪大学の学生演習プログラム C 言語で簡単なコンパイラを作成 5 人の学生のプログラムを用いる 演習は 3 回に分けてプログラムを作成 STEP1 構文チェッカーを作成 STEP2 構文チェッカーを利用して意味チェッカーを作成 STEP3 意味チェッカーを利用してコンパイラを作成 目的 学生間の類似度の調査 他人のプログラムを利用している学生はいないか 29 30 5

デモンストレーション (2/2) 1 人の学生のソースコードを 1 つのグループとしてコードクローン検出を行う 5 人の学生のプログラムから 5 つのグループが作成される 適切にグループを設定することでコードクローン分析を効率的に行うことができる これまでの適用事例 ソースコードビューではコードクローンが強調表示される 水平方向のコードクローン 青 垂直方向のコードクローン 赤 31 32 オープンソースソフトウェアへの適用概要 目的 CCFinder,Gemini を用いてどのようなコードクローンが見つかるか調査する オープンソースソフトウェアへの適用調査するコードクローン スキャタープロットを用いた調査 目立つ部分に存在するコードクローン オープンソースソフトウェア Ant (version 1.6.0) ビルドツールの一種,Java 言語で記述されている ソースファイル数 627 総行数 約 18 万行 メトリクスグラフを用いた調査 要素数の多いクローンセットの特定 トークン数の多いクローンセットの特定 多くのファイルを巻き込んでいるクローンセットの特定 検出対象 30 トークン以上 2,406 個のクローンセット 190,004 個のクローンペア 33 34 オープンソースソフトウェアへの適用目立つ部分に存在するクローン ( 全体 ) 右図は対象ソースコード全体を表したクローン散布図 A, B, C の部分がどのようなコードクローンであるかを調査した A オープンソースソフトウェアへの適用目立つ部分に存在するクローン ( 部分 A) クローンの場所 ファイルを読み込む機能を実装している部分 先頭の数行のみを読み込み ユーザが指定した文字列を含む行のみを読み込み 各行にプレフィックスを付けて読み込み B C クローンが実装している機能 ストリームから 1 文字読み込む. 終端まできたら, それに応じた処理をする 新しく java.io.reader オブジェクトを生成し, それを返す 35 36 6

オープンソースソフトウェアへの適用目立つ部分に存在するクローン ( 部分 B) クローンの場所 簡単な GUI を実装しているファイル ビルド情報を Ant に渡す Ant の処理状況の閲覧 オープンソースソフトウェアへの適用目立つ部分に存在するクローン ( 部分 C) クローンの場所 ClearCase の各機能を実装しているファイル Checkin, Checkout, Update, クローンが実装している機能 イベントがどこで起こったかを判定している if 文 イベントのソースに応じて処理を変更 GUI の部品を作成しているメソッド 一つの部品につき, 一つのメソッドが存在 ファイルの特定の部分ではなく, ほぼ全体がクローンになっていた 37 38 オープンソースソフトウェアへの適用要素数の多いクローンセット 予め RNR を用いて, その値が 0.5 未満のクローンセットは除外 最も要素数の多いクローンセット 要素数 31 個 クローンの場所 簡単な GUI を実装しているファイル クローンが実装している機能 GUI の部品を生成しているメソッド 大まかな把握 (B の部分 ) のクローンの一部 catch (Throwable iexc) handleexception(iexc); return iaboutcommandpanel; オープンソースソフトウェアへの適用トークン数の多いクローンセット 予め RNR を用いて, その値が 0.5 未満のクローンセットは除外 最もトークン数の多いクローンセット クローンの大きさ 282 トークン (77 行 ) クローンの場所 WebLogic と WebShere のタスクを定義しているファイル クローンが実装している機能 メソッド isrebuildrequired( 引数で与えられた Jar ファイルがリビルドする必要があるかどうかを判断 ) 一部の使用変数, メソッド名が異なる インデント, 空行, コメントなど他のコードスタイルが全く同じ コピーアンドペーストによる作成を示唆 private Label getaboutcontactlabel() if (iaboutcontactlabel == null) try iaboutcontactlabel = new Label(); iaboutcontactlabel.setname("aboutcontactlabel"); 39 40 オープンソースソフトウェアへの適用多くのファイルを巻き込んでいるクローンセット 予め RNR を用いて, その値が 0.5 未満のクローンセットは除外 最も多くのファイルを巻き込んでいるクローンセット 巻き込んでいるファイル数 19 ファイル クローンの場所 さまざまなファイル クローンが実装している機能 連続したアクセサ Ant だからではなく,Java 言語で記述されているから存在しているクローン このクローンセットに限らず, 多くのファイルを巻き込んでいるクローンセットの多くが,Java 言語で記述されていることがその存在理由と思われた ベンダーの開発したソフトウェアへの適用 スキャタープロットを用いた分析 予期しない部分間のコードクローンの発見 メトリクスグラフを用いた分析 コピーアンドペースト後, 修正漏れのあるコードクローンの発見 リファクタリングを行うべきと思われるコードクローンの発見 ファイルリストを用いた分析 使われていないファイルの検出 同じ機能を実装しているファイルの検出 41 42 7

これまでの活動 これまでの活動ツールの配布 コードクローン検出 可視化ツール 検出ツール CCFinder[1] 分析ツール Gemini[2] 国内外の個人 組織に配布 研究機関での利用 企業での商用ソフトウェアの開発プロセスへの導入 配布先からのフィードバックを得ている その他の利用 大学の演習 プログラム著作権関係の裁判証拠 [1] T. Kamiya, S. Kusumoto, and K. Inoue, CCFinder A multi-linguistic token-based code clone detection system for large scale source code, IEEE Transactions on Software Engineering, 28(7)654-670, 2002. [2] Y. Ueda, T. Kamiya, S. Kusumoto and K. Inoue, Gemini Maintenance Support Environment Based on Code Clone Analysis, Proc. Of the 8th IEEE International Symposium on Software Metrics, 67-76, 2002. 43 44 これまでの活動コードクローンセミナー ツール開発者 ( 大学 ) と利用者 ( 産業界 ) との意見交換との場としてコードクローンセミナーを開催 第 1 回 (2002 年 11 月 ) 大阪 第 2 回 (2003 年 3 月 ) 東京 第 3 回 (2003 年 6 月 ) 大阪 第 4 回 (2005 年 3 月 ) 東京 第 5 回 (2005 年 12 月 ) 東京 第 6 回 (2006 年 3 月 ) 大阪 ツールの利用法, コードクローンの分析法などについて議論を行っている 詳しくはを http//sel.ist.osaka-u.ac.jp/kobo/ を参照 今後の展開 45 46 今後の展開ソフトウェア開発プロセスへの組込み コードクローン検出技術をどのようにソフトウェア開発プロセスへ組み込むか レビュー支援 リファクタリング支援 ソースコード修正支援 今後の展開ギャップドコードクローンの検出 コピーアンドペーストされたコード片は, その後修正が加えられる 現在検出できているのは,Exact クローン,Renamed クローンのみ If (a > b) b++; a=1; コピーとペースト resued by copy-andpaste による再利用 識別子名の変更 実プロジェクトでの使用 評価が必要 If (a > b) b++; a=1; If (i > j) j++; i=0; 挿入 If (i > j) i = i / 2; j++; i=0; 削除 If (i > j) i=0; 変更 If (i > j) j = j + 1; i=0; 47 Exact クローン Parameterized クローン Gapped クローン 48 8

今後の展開 CCFinderX の開発 大阪大学井上研究室出身の神谷年洋氏 ( 現 産業技術総合研究所勤務 ) による CCFinderX の開発 2004 年度第 2 回未踏ソフトウェア創造事業の支援 天才プログラマー / スーパークリエータの認定を受ける 最後に ツールに興味を持たれた方はメールでご連絡下さい 大阪大学肥後芳樹 y-higo@ist.osaka-u.ac.jp 現在, 特許申請中につき, 配布管理を行っています CCFinderX の特徴 検出スピードの向上 前処理のカスタマイズ SWT を用いた GUI CCFinderX の配布管理は行っていません CCFinderX の配布については http//www.ccfinder.net/ をご覧下さい CCFinderX ウェブページ http//www.ccfinder.net/ 49 50 9