コードクローンの理解支援を目的としたコードクローン周辺コードの解析

Slides:



Advertisements
Similar presentations
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 保守支援を目的とした コードクローン情報検索ツール.
Advertisements

シーケンス図の生成のための実行履歴圧縮手法
Myoungkyu Song and Eli Tilevich 発表者: 石尾 隆(大阪大学)
情報伝播によるオブジェクト指向プログラム理解支援の提案
アクセス修飾子過剰性の変遷に着目したJavaプログラム部品の分析
研究の背景 コードクローン ソースコード中に存在する一致または類似したコード片
データフロー情報を用いたコード ナビゲーションツールの実装と評価
変数間データフローグラフを用いた ソースコード間の移動支援
プログラムの動作を理解するための技術として
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
川口真司 松下誠 井上克郎 大阪大学大学院情報科学研究科
ソースコードに対する適用可能な修正手順を 可視化するリファクタリング支援手法の提案
プログラム実行履歴を用いたトランザクションファンクション抽出手法
アイテムセットマイニングを利用した コードクローン分析作業の効率向上
大規模ソースコード集合を対象とした 類似関数集合群の抽出
静的情報と動的情報を用いた プログラムスライス計算法
コードクローン分析ツールGeminiを用いたコードクローン分析手順
コードクローンの分布情報を用いた特徴抽出手法の提案
ギャップを含むコードクローンの フィルタリング手法の提案
コーディングパターンと キーワードを用いて生成したコードスニペットの推薦
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
ソードコードの編集に基づいた コードクローンの分類とその分析システム
関数の変更履歴と呼出し関係に基づいた開発履歴理解支援システムの実現
動的スライスを用いた バグ修正前後の実行系列の比較
コードクローンの分類に基づいた メソッド引き上げ手順の提案とその有効性評価
動的依存グラフの3-gramを用いた 実行トレースの比較手法
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
クローンセットに対する主要編集者の分析法の提案と調査
重複コードと非重複コードにおける 修正頻度の比較
コードクローン検出ツールを用いた ソースコード分析システムの試作と プログラミング演習への適用
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
ソフトウェア保守性を評価する メトリクス間の関連分析
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
オープンソース開発支援のための リビジョン情報と電子メールの検索システム
コードの生存期間を考慮したコードクローンと欠陥修正の関係調査
コードクローンの動作を比較するためのコードクローン周辺コードの解析
コードクローンに対する一貫性のない変更に起因する欠陥の検出
柔軟に変更可能な字句解析機構を持つ コードクローン検出ツールの開発
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
プログラム理解におけるThin sliceの 統計的調査による有用性評価
バイトコードを単位とするJavaスライスシステムの試作
コードスメルの深刻度がリファクタリングの実施に与える影響の実証的研究
コードクローン編集者数に着目した開発履歴の分析
コード片に共通した特性を自動抽出する ソースコード閲覧ツールの試作
多様なプログラミング言語に対応可能な コードクローン検出ツール CCFinderSW
Geminiを用いた効果的なコードクローン分析方法
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
既存ソフトウェア中の 頻出コード片を用いた コード補完手法の提案
コーディングパターンの あいまい検索の提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
アルゴリズムとプログラミング (Algorithms and Programming)
コードクローン間の依存関係に基づく リファクタリング支援環境の実装
コードクローンの分布情報を用いた特徴抽出手法の提案
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
保守請負時を対象とした 労力見積のためのメトリクスの提案
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
クローン検出ツールを用いた ソフトウェアシステムの類似度調査
オープンソースソフトウェアに対する コーディングパターン分析の適用
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
容易に使用可能な grep風コードクローン検索ツール
コードクローン解析に基づく デザインパターン適用候補の検出手法
メソッド抽出リファクタリングが 行われるメソッドの特徴調査
Geminiを用いた効果的なコードクローン分析方法
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
プログラム依存グラフを用いた ソースコードのパターン違反検出法
Presentation transcript:

コードクローンの理解支援を目的としたコードクローン周辺コードの解析 BUYANNEMEKH ODKHUU

コードクローン 同一,または,類似したコード片 ソフトウェアの保守コストを大きくする要因 類似 クローンセット

コードクローンの周辺との依存関係がどのくらいあるのかはわかっていない コードクローンに対する調査の難しさ ..... int method1( int a , int b ){ int x = getX(); int y = a + b ; if( x > 100 ) {  } } int field1; ..... void method2( int p , int q ){ int s = getX() + q; int y = p + q + field1; if( s < 90 ){ } setValue( x ); y++; call(); setValue( s ); y++; call(); コードクローンの周辺との依存関係がどのくらいあるのかはわかっていない

研究の目的 コードクローンの周辺コードへの依存性を調査する RQ1:各コードクローンにとって,周辺コードはどれぐらい多いか 本発表ではRQ1とRQ2の結果のみ紹介

周辺コードとは コードクローンのコード片の実行を制御する文 コードクローンが存在するメソッド外部からのデータを受け取る部分 if 文,for 文など コードクローンが存在するメソッド外部からのデータを受け取る部分 コードクローンを含むメソッドの仮引数,フィールド,引数なしメソッドの戻り値 これらを外部要素と呼ぶ データフローが複数の基点を持つことを説明

各リサーチクエスチョンに対し 調査するメトリクス RQ1 コードクローンあたりの外部要素の数 RQ2 1つのクローンセット内の各コードクローンが参照している外部要素のうち差分となる数

外部要素の数え方 コードクローン間で一致する外部要素はまとめて1つと数える <型,名前> <型,名前> コードクローンを含むメソッドの仮引数 フィールド変数 引数を持たないメソッド呼び出し <型,出現順序> <型,名前> <型,名前> コードクローン間で外部要素が3つの条件を満たすなら同一ものとみなすことの説明

差分になる外部要素の数え方 (1) (2) コードクローンの外部要素のうち,対応関係が一致していない外部要素を差分とする (1) x (2) s y 仮引数 int 1 ○ 2 フィールド field1 メソッド getX (1) x (2) s y 仮引数 int 1 2 ○ フィールド field1 メソッド getX (1) x (2) s y 仮引数 int 1 2 フィールド field1 メソッド getX ○ (1) x (2) s y 仮引数 int 1 2 フィールド field1 メソッド getX (1) x (2) s y 仮引数 int 1 2 フィールド field1 メソッド getX 表の軸の説明 外部要素が一致していなければ差分があると言います. (1) (2) 8

調査対象 7つのオープンソースソフトウェア プロジェクト バージョン ソースコードの行数 (コメント,空白を除く) ファイル数 ArgoUML 0.34 109105 1318 Data Crow 3.9.17 68139 650 LaTeXDraw 3.0.0(a4) 35999 363 Sweet Home 3D 3.7 74352 212 JWebMail 1.01 11173 113 jEdit 4.3 103317 502 muCommander 0.8.5 76739 1069

調査結果(RQ1) 全体の8割 ・クローンセットの外部要素は5~6がかなり多い、0になることはまれ ・クローンセットの外部要素は、少ないときだけ差分なしのこともあるが、差分ありのほうが多い グラフが何を表しているかを説明.軸の説明

外部要素がすべて異なり変数名がすべて同じ 調査結果(RQ2) 外部要素がすべて異なり変数名がすべて同じ ・外部要素は、完全に一致するか、まったく違うかの両側に分かれる ・クローンに出てくる変数名は同じだが外側での式がまったく違うクローンも、クローンに出てくる変数名は違うが外側の式はまったく同じクローンというのも、両方それなりの数見つかった グラフが何を表しているかを説明.軸の説明

考察 コードクローンは,周辺コードに依存していることが多い コードクローンを分析するときは,周辺コードとの関係も調査することが重要である コードクローンと周辺コードとの関係を可視化するツールが有用である

周辺コード調査用ツールの試作 Eclipseのプラグインとして実装した Sコードクローンと 周辺コード の強調表示 クローンセット と の一覧表示 ・コードクローンは周辺コードに依存しており、周辺コードもクローンによって異なっていることが多い ・既存メトリクスなどで特定のコードクローンを見ることもできない そこでツールとしてEclipseで可視化できるようにした。 コードクローン検出ツールの出力を読み込んで、クローンセットの部分と、周辺コードの情報をエディタ上でハイライトする。

まとめ コードクローンの周辺コードへの依存性を調査した コードクローンの周辺コードを解析し,可視化するツールを試作した 今後の課題 多くのクローンセットが,外部要素に依存している 外部要素が異なるクローンセットも多い 既存のメトリクスで取れる情報ではなかった コードクローンの周辺コードを解析し,可視化するツールを試作した 今後の課題 ツールを使った時のコードクローンに対する分析作業の効率の調査

ご清聴ありがとうございました

外部要素の集合 コードクローン(1) コードクローンの中に 出現する変数 メソッド int型 getX 仮引数 int型 1 仮引数 2 コードクローン中に 出現する変数の データフローに存在する 外部要素 x y コードクローン(2) メソッド int型 getX 仮引数 int型 2 仮引数 int型 2 フィールドint型 field1 外部要素の集合 s y 16

調査結果(RQ3) 7プロジェクト中4プロジェクト抜粋 全プロジェクトで一貫して相関係数が高いものはなかった 周辺コードへの依存性は,既存のメトリクスでは表現されていない プロジェクト LEN NIF POP RAD RNR Argouml 外部要素数 0.029 0.215 0.416 0.160 -0.222 外部要の差分になる割合 0.054 0.158 0.255 0.150 -0.255 DataCrow -0.126 0.466 0.592 0.445 -0.252 -0.129 0.389 0.512 0.489 -0.300 jEdit -0.159 0.640 0.551 0.249 -0.128 -0.109 0.579 0.493 0.201 -0.197 LaTeXDraw 0.633 0.301 0.594 0.433 -0.383 0.659 0.259 0.570 0.408 -0.389

RQ2:結果

RQ1:結果 ウィルコクストンの順位和検定による片側検定