Geminiを用いた効果的なコードクローン分析方法

Slides:



Advertisements
Similar presentations
1 EASE プロジェクトにおける EPM ( Empirical Project Monitor) を用いたプロジェクト管理デモ 奈良先端科学技術大学院大学 産学官連携研究員 松村 知子 2005 年 9 月 30 日 JISA 経営者セミナー.
Advertisements

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 保守支援を目的とした コードクローン情報検索ツール.
シーケンス図の生成のための実行履歴圧縮手法
背景 ソフトウェアの大規模化・複雑化 生産性と品質の向上 ↓ オブジェクト指向分析設計の適用 開発ツールの投入.
コードクローン履歴閲覧環境を用いたクローン評価の試み
AGMアルゴリズムを用いた ギャップを含むコードクローン情報の生成
剽窃 他人の作品や論文を盗んで,自分のものとして発表すること. プログラムが剽窃される事例もある. Aさんのプログラム Xさんのプログラム
研究の背景 コードクローン ソースコード中に存在する一致または類似したコード片
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
川口真司 松下誠 井上克郎 大阪大学大学院情報科学研究科
プログラム実行履歴を用いたトランザクションファンクション抽出手法
アイテムセットマイニングを利用した コードクローン分析作業の効率向上
大規模ソースコード集合を対象とした 類似関数集合群の抽出
ソースコードの変更履歴における メトリクス値の変化を用いた ソフトウェアの特性分析
コードクローン分析ツールGeminiを用いたコードクローン分析手順
コードクローンの分布情報を用いた特徴抽出手法の提案
ギャップを含むコードクローンの フィルタリング手法の提案
ソースコードの同時修正支援における関数クローン検出ツールの有効性調査
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
識別子の命名支援を目的とした動詞-目的語関係の辞書構築
識別子の共起関係に基づく類似コード検索法の提案と 欠陥検出への適用
ソードコードの編集に基づいた コードクローンの分類とその分析システム
構文定義記述を用いた 多言語対応コードクローン検出ツールの改善
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
クローンセットに対する主要編集者の分析法の提案と調査
重複コードと非重複コードにおける 修正頻度の比較
コードクローン検出ツールを用いた ソースコード分析システムの試作と プログラミング演習への適用
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
ソフトウェア保守性を評価する メトリクス間の関連分析
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
コードクローンの動作を比較するためのコードクローン周辺コードの解析
コードクローンに対する一貫性のない変更に起因する欠陥の検出
Token Comparison Approach to Detect Code Clone-related Bugs
柔軟に変更可能な字句解析機構を持つ コードクローン検出ツールの開発
ソースコードの静的特性を用いた Javaプログラム間類似度測定ツールの試作
UMLモデルを対象とした リファクタリング候補検出の試み
プログラム実行履歴を用いたコードクローン検出手法
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
コードクローン編集者数に着目した開発履歴の分析
グラフマイニングアルゴリズムを用いた ギャップを含むクローン抽出手法の提案
コード片に共通した特性を自動抽出する ソースコード閲覧ツールの試作
多様なプログラミング言語に対応可能な コードクローン検出ツール CCFinderSW
Geminiを用いた効果的なコードクローン分析方法
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
コーディングパターンの あいまい検索の提案と実装
コードクローン間の依存関係に基づく リファクタリング支援環境の実装
コードクローンの分布情報を用いた特徴抽出手法の提案
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
メトリクス値の変化に基づく コードクローンの編集傾向分析
大阪大学 大学院情報科学研究科 コンピュータサイエンス専攻 井上研究室
保守請負時を対象とした 労力見積のためのメトリクスの提案
コードクローン間の依存関係に基づく リファクタリング支援手法の提案と実現
アスペクト指向言語のための視点に応じた編集を可能にするツール
クローン検出ツールを用いた ソフトウェアシステムの類似度調査
オープンソースソフトウェアに対する コーディングパターン分析の適用
メソッドの同時更新履歴を用いたクラスの機能別分類法
コードクローン間の依存関係に基づく リファクタリング支援手法の提案と実現
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
容易に使用可能な grep風コードクローン検索ツール
複雑度メトリクスを用いた JAVAプログラム品質特性の実験的評価
コードクローン解析に基づく デザインパターン適用候補の検出手法
識別子の読解を目的とした名詞辞書の作成方法の一試案
オブジェクト指向メトリクスを用いた 開発支援に関する研究 --- VC++とMFCを用いた開発を対象として ---
コードクローンを対象とした リファクタリングの有効性に関する調査
Presentation transcript:

Geminiを用いた効果的なコードクローン分析方法 肥後 芳樹,吉田 則裕,楠本 真二,井上 克郎 大阪大学 大学院情報科学研究科 {y-higo, n-yosida, kusumoto, inoue}@ist.osaka-u.ac.jp

はじめに 本発表では,より効率的にコードクローン分析を行うためのハウツーを紹介する 紹介するハウツーはこれまでの経験から得られたものであり,特に理論的な根拠があるわけではない コードクローン情報だけでは,それらをどう扱うかの決定は難しい 他の資産(ドキュメント,プロセス,開発者の知識など)とつき合わせて考えることが重要

コードクローン クローンペアとクローンセット コードクローンとは ソースコード中に存在する一致または類似したコード片 コピーアンドペーストなどのさまざまな理由により生成される ソフトウェアの保守を困難にする あるコード片にバグがあると,そのコードクローン全てについて修正の検討を行う必要がある クローンペアとクローンセット C1 C2 C3 C4 C5 クローンペア クローンセット (C1, C2) {C1, C2, C4} (C1, C4) {C3, C5} (C2, C4) (C3, C5)

コードクローン解析ツール コードクローン検出ツール: CCFinder[1] コードクローン分析ツール: Gemini[2] 与えられたソースコード内に存在するコードクローンを検出 さまざまな言語に対応,C/C++, Java, COBOL, ... 高いスケーラビリティ CCFinderX コードクローン分析ツール: Gemini[2] ICCAのサブシステムの一つ Aries: リファクタリング支援 Libra: 修正支援 CCFinderの検出したコードクローンを視覚的に表示 メトリクスを用いたコードクローンの特徴づけ [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.

利用実績 研究機関での利用 産業界での利用 その他 プログラム著作権関係の裁判証拠 コードクローン情報を必要とする研究で使用 多数の論文参照 EASE,SEC関連プロジェクトでの利用 試用・商用ソフトウェア開発プロセスへの導入 国内外100社以上で利用 その他 プログラム著作権関係の裁判証拠 大学の演習

目次 検出オプション 重要でないクローンのフィルタリング 大まかな把握 特徴的なクローンとその対処法 特徴的なファイルとその対処法 現在の取り組み 今後の取り組み

1. 検出オプション 最小一致トークン数 万能な値は存在しない 新規でコードクローン分析を行う場合は 30トークンで 1. 検出オプション 最小一致トークン数 万能な値は存在しない プログラミング言語,ソフトウェアの規模,ドメインに応じて検出されるコードクローンの量は異なる これまでの傾向としては, 同規模(総行数がほぼ同じ)のソフトウェアの場合,C言語の(手続き型)プログラムの方がJava言語の(オブジェクト指向)プログラムよりも多くクローンを含む傾向がある GUIのプログラムの方が,CUIのプログラムのよりもクローンを多く含む傾向がある 新規でコードクローン分析を行う場合は 30トークンで あまりクローンが検出されないようであれば,値を下げて再検出 あまりに多くのクローンが検出されるのであれば,値を上げて再検出

1. 検出オプション トークンの正規化 CCFinderはデフォルト設定では,ユーザ定義名や型名などを表すトークンを特別なトークンに置き換えた後に,クローン検出を行う 変数名などが異なるコード片をクローンとして検出できる 偶然の一致により,クローンとして検出されてしまうコード片がある 新規でクローン分析を行う場合は,デフォルト設定で 偶然の一致により,あまりにも多くのクローンが検出されているようであれば,特定の正規化オプションを切る,などの対象が必要 例:キャスト名を正規化しない

1. 検出オプション グループの作成(1/2) CCFinderは以下の三種類のクローンの検出・非検出をそれぞれ設定することが可能(デフォルト設定では,全てのクローンを検出する) ファイル内クローン グループ内ファイル間クローン グループ間クローン 対象ファイルを指定しただけでは,グループは設定されていない ファイル内クローン,グループ内ファイル間クローンのみを検出している グループを設定することで,より有益な検出結果を得ることができる グループを設定していない場合の「グループ内クローン」が「グループ内ファイル間クローン」と「グループ間クローン」に分けて検出される

1. 検出オプション グループの作成(2/2) 適切なグループ設定の例 メニューのスナップショット 1. 検出オプション グループの作成(2/2) 適切なグループ設定の例 一つのディレクトリ内に含まれるファイル群を一つのグループに 一つのモジュールを構成しているファイル群を一つのグループに 前者は「マウスの右クリック → add → separator → every directory」で簡単に行うことが可能 ファイル間の類似度と共に,グループ間の類似度を得ることができる メニューのスナップショット 拡大

1. 検出オプション 対象ファイル コードジェネレータが生成したコード(ファイル)はクローン検出対象とすべきではない 1. 検出オプション 対象ファイル コードジェネレータが生成したコード(ファイル)はクローン検出対象とすべきではない コードジェネレータが生成したコードは非常に多くのクローンを含む 何度も同じ対象ファイルからクローン検出を行う場合 ファイルリストをつくると便利 「マウスの右クリック → export → files」 「マウスの右クリック → export → files and separators」 メニューのスナップショット 拡大

2. 重要でないクローンのフィルタリング CCFinderの検出するコードクローンはトークンの列であり,重要でないコードクローンを多数検出してしまう switch文の各caseエントリ 連続したimport文,printf文, scanf文 など フィルタリングメトリクス RNR(S) クローンセット S に含まれるコード片の非繰り返し度を表す 例 トークン列 <x a b c a b c* a* b* c* y> CCFinder は以下の二つのコード片をコードクローンとして検出 x a b c a b c*<F1> a* b* c* y x a b c a b c* a* b* c*<F2> y F1はコード片の長さが6トークン,そのうち5トークンが非繰り返し F2はコード片の長さが6トークン,そのうち2トークンが非繰り返し RNR(S1) = (5 + 2)/(6 + 6) = 7/12 = 0.583

3. 大まかな把握 新規でクローン分析を用いる場合(分析の初期段階)に有効 スキャタープロットで以下の二つの部分が目立ちやすい部分である クローンの量・分布状態をひと目で把握できる スキャタープロットで以下の二つの部分が目立ちやすい部分である 一定の領域内にコードクローンが密集している部分 同じようなパターンが繰り返し出現している部分 スキャタープロットで目立つ部分に特徴的なクローンが存在するとは限らない 複数種類のクローンが存在した結果,その場所が目立っている メトリクス RNR の値が閾値未満のコードクローンは青色,以上のコードクローンは黒色で描画 閾値はユーザが自由に設定可能

3. 大まかな把握 クローンが密集している(Antlr) 繰り返し同じパターンが出現(jdk1.5の一部)

4. 特徴的なクローンとその対処法 同形のコード片が多いクローン 4. 特徴的なクローンとその対処法 同形のコード片が多いクローン バグが検出された場合,多くの箇所に同様の修正を加えなければならない 不安定(繰り返し修正が行われる)なコード 修正コスト削減に向けての対策が必要(リファクタリングなど) 安定したコード,定型処理部分などもこのようなクローンになりがち. 例:データベースへのアクセス部分 プログラミング言語の文法上どうしてもクローンになってしまう. 例:switch文(連続したcaseエントリ) RNR を用いることである程度の絞込みは可能 「6. 現在の取り組み」で上記のクローンへの判別手法を紹介

4. 特徴的なクローンとその対処法 トークン数の多いクローン 4. 特徴的なクローンとその対処法 トークン数の多いクローン コピーアンドペーストにより生成されたものではないかと思われる ペースト後の変数名やメソッド名の修正漏れがバグに繋がる 修正漏れのチェックを行うのは効果的な予防保守 実際のプロジェクトのコードからバグを検出 単体テスト後のコードを分析 見つかったバグ概要(検出された最もトークン数の多いクローン内) ファイル A.cpp とファイルB.cppがクローンを共有 ファイルAではxxxAxxxというメソッドが呼ばれている ファイルBではxxxBxxxというメソッドが呼ばれている ファイルBの中で一箇所だけxxxAxxxというメソッドが呼ばれていた ファイルAからファイルBへのコピーアンドペーストを行い,修正を忘れた

4. 特徴的なクローンとその対処法 多くのファイルを巻き込んでいるクローン 4. 特徴的なクローンとその対処法 多くのファイルを巻き込んでいるクローン 根本的な問題を表している可能性がある 設計が悪いことを暗示 プログラミング言語に適切な抽象化機構が存在しない(横断的関心事) RNR を用いることである程度の絞込みは可能 「6. 現在の取り組み」で上記のクローンへの判別手法を紹介

5. 特徴的なファイルとその対処法 他グループと多くのクローンを共有しているファイル 特定のグループのファイルと多くのクローンを共有している ファイルの位置と実装している機能にずれがある 他の場所に移動させる 複数のグループのファイルと多くのクローンを共有している 多くのことを行い過ぎている ファイルを分割

5. 特徴的なファイルとその対処法 特定のファイルと非常に類似度が高いファイル 5. 特徴的なファイルとその対処法 特定のファイルと非常に類似度が高いファイル 特定のファイルと非常に類似度が高いファイル 本当にそれらのファイルは全て存在することが必要か? 重複度90% 重複度90% 重複度90%

6. 現在の取り組み クローン発生理由の予測 全てのクローンが「悪」ではない 6. 現在の取り組み クローン発生理由の予測 全てのクローンが「悪」ではない なぜクローンが発生したのか,どのような性質なのか,を知ることが重要 アドホックな開発 安定コード,定型処理の使いまわし プログラミング言語の機能的な制限 … 二つのメトリクス NIF(S) と RAD(S) を使って発生理由を予測 NIF(S): クローンセット S に含まれるコード片を所有しているファイル数 RAD(S): クローンセット S に含まれるコード片のファイルシステム中での分散度

分散度メトリクス RAD(S) 2 1 クローンセット S に含まれるコード片のファイルシステム中での分散度 RAD(S) = 1 ディレクトリ X ディレクトリ Z ディレクトリ Y 2 1 ファイル A ファイル B ファイル C ファイル D ファイル E コード片 a コード片 b コード片 c コード片 d コード片 e

6. 現在の取り組み クローン発生理由・性質の予測 6. 現在の取り組み クローン発生理由・性質の予測 二つのメトリクスの「高・低」の組み合わせを用いて四つのカテゴリを作成 それぞれのカテゴリに属するクローンの性質は異なるのではないか (低,低):特徴的な機能のクローン,共通化の対象 (高,低):(低,低)と同様 (高,低):機能の分割がうまく行われていない (高,高):プログラミング言語に依存したクローン 文法上クローンになりがち 抽象化機構が存在しない RAD NIF 小 大 (低,低) (低,高) (高,低) (高,高)

7. 今後の取り組み クローンのブックマーク機能 全てのクローンを自動的に正しく分類することは不可能 人間が手動で分類する支援 確認したクローンにチェックを入れる 既に確認したという情報を残す 必要でないクローンであればクローン情報から消す

メトリクスRNR(S)について トークン列 <x a b c a b c a b c y> を考える 前者の方がどちらかというと適切であると思われるから 理論的な裏づけがあるわけではない 繰り返し部分をコードクローンとして検出する場合 1つ目のクローンコードはできるだけ非繰り返しとしたい 2つ目以降のクローンコードはできるだけ繰り返しとしたい

メトリクスRNR(S)について [a, b, c]がクローンコードである場合 <x a b c a b c* a* b* c* y>は <x a b c a b c* a* b* c* y> (非繰り返し度 = 3/3) <x a b c a b c* a* b* c* y> (非繰り返し度 = 1/3) <x a b c a b c* a* b* c* y> (非繰り返し度 = 0/3) <x a b c a* b* c* a* b* c* y>は <x a b c a* b* c* a* b* c* y> (非繰り返し度 = 3/3) <x a b c a* b* c* a* b* c* y> (非繰り返し度 = 0/3)

メトリクスRNR(S)について [b, c, a]がクローンコードである場合 <x a b c a b c* a* b* c* y>は <x a b c a b c* a* b* c* y> (非繰り返し度 = 3/3) <x a b c a b c* a* b* c* y> (非繰り返し度 = 1/3) <x a b c a* b* c* a* b* c* y>は <x a b c a* b* c* a* b* c* y> (非繰り返し度 = 2/3) <x a b c a* b* c* a* b* c* y> (非繰り返し度 = 0/3)

メトリクスRNR(S)について [a, b, c, a, b, c]がクローンコードである場合 <x a b c a b c* a* b* c* y>は <x a b c a b c* a* b* c* y> (非繰り返し度 = 5/6) <x a b c a b c* a* b* c* y> (非繰り返し度 = 2/6) <x a b c a* b* c* a* b* c* y>は <x a b c a* b* c* a* b* c* y> (非繰り返し度 = 3/6) <x a b c a* b* c* a* b* c* y> (非繰り返し度 = 0/6)