コードクローンの動作を比較するためのコードクローン周辺コードの解析

Slides:



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

シーケンス図の生成のための実行履歴圧縮手法
XHTML構文検証手法における スクリプト要素の静的解析アルゴリズム
メソッド周辺の識別子と メソッド本体のAPI利用実績に基づいたAPI集合推薦手法
Myoungkyu Song and Eli Tilevich 発表者: 石尾 隆(大阪大学)
情報伝播によるオブジェクト指向プログラム理解支援の提案
アクセス修飾子過剰性の変遷に着目したJavaプログラム部品の分析
Object Group ANalizer Graduate School of Information Science and Technology, Osaka University OGAN visualizes representative interactions between a pair.
データフロー情報を用いたコード ナビゲーションツールの実装と評価
変数間データフローグラフを用いた ソースコード間の移動支援
プログラムの動作を理解するための技術として
F11: Analysis III (このセッションは論文2本です)
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
川口真司 松下誠 井上克郎 大阪大学大学院情報科学研究科
ソースコードに対する適用可能な修正手順を 可視化するリファクタリング支援手法の提案
プログラム実行履歴を用いたトランザクションファンクション抽出手法
相関ルールマイニングを用いた メソッドの命名方法の分析
大規模ソースコード集合を対象とした 類似関数集合群の抽出
コードクローン分析ツールGeminiを用いたコードクローン分析手順
ギャップを含むコードクローンの フィルタリング手法の提案
類似するコーディングパターンの 利用状況調査ツールの提案
コーディングパターンと キーワードを用いて生成したコードスニペットの推薦
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
ソードコードの編集に基づいた コードクローンの分類とその分析システム
動的スライスを用いた バグ修正前後の実行系列の比較
動的依存グラフの3-gramを用いた 実行トレースの比較手法
ポインタ解析におけるライブラリの スタブコードへの置換の効果
動的スライスを用いたバグ修正前後の実行系列の差分検出手法
アルゴリズムとプログラミング (Algorithms and Programming)
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
クローンセットに対する主要編集者の分析法の提案と調査
コードクローン検出ツールを用いた ソースコード分析システムの試作と プログラミング演習への適用
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
ソフトウェア保守性を評価する メトリクス間の関連分析
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
オープンソース開発支援のための リビジョン情報と電子メールの検索システム
プログラミングコンテストシステムへの 提出履歴データとその分析
プログラム理解におけるThin sliceの 統計的調査による有用性評価
バイトコードを単位とするJavaスライスシステムの試作
コードスメルの深刻度がリファクタリングの実施に与える影響の実証的研究
コードクローン編集者数に着目した開発履歴の分析
コード片に共通した特性を自動抽出する ソースコード閲覧ツールの試作
Geminiを用いた効果的なコードクローン分析方法
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
既存ソフトウェア中の 頻出コード片を用いた コード補完手法の提案
コーディングパターンの あいまい検索の提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
インスタンスの型を考慮したJavaプログラムの実行経路の列挙手法の提案
JavaScriptを含んだHTML文書に対する データフロー解析を用いた構文検証手法の提案
アルゴリズムとプログラミング (Algorithms and Programming)
コードクローン間の依存関係に基づく リファクタリング支援環境の実装
コードクローンの分布情報を用いた特徴抽出手法の提案
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
保守請負時を対象とした 労力見積のためのメトリクスの提案
クローン検出ツールを用いた ソフトウェアシステムの類似度調査
オープンソースソフトウェアに対する コーディングパターン分析の適用
開発作業の形式化に基づく プロセス評価 松下誠 大阪大学.
統合開発環境のための プログラミング言語拡張 フレームワーク
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
コードクローン解析に基づく デザインパターン適用候補の検出手法
メソッド抽出リファクタリングが 行われるメソッドの特徴調査
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
識別子の読解を目的とした名詞辞書の作成方法の一試案
プログラム理解のための 付加注釈 DocumentTag の提案
Presentation transcript:

コードクローンの動作を比較するためのコードクローン周辺コードの解析 ブヤンネメフ オドフー†,眞鍋 雄貴‡, 伊達 浩典†,石尾 隆†,井上 克郎† †大阪大学 大学院情報科学研究科     ‡熊本大学 大学院自然科学研究科

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

コードクローンの動作は その周辺コードに依存する … int method1( int a , int b ){ int x = getX(); if( x > 100 ) {  } } … void method2( int p , int q ){ int x = getX() + q; while( x < 90 ){ } データ フロー x++; setValue( x ); call(); x++; setValue( x ); call(); 制御 フロー コードクローンの周辺との依存関係がどのくらいあるのか わかっていない

研究の目的 コードクローンの周辺コードへの依存関係を調査する RQ1:各コードクローンにとって,周辺コードへの依存関係はどれぐらい多いか (ただし,コードクローンはメソッド内に含まれる,かつ,変数を持つものに限定する) RQ1:各コードクローンにとって,周辺コードへの依存関係はどれぐらい多いか RQ2:各コードクローンの周辺コードへの依存関係は同一のクローンセットの中でどれだけ差分が多いか

周辺コードへの依存関係とは コードクローンが存在するメソッドの外部から受け取るデータ コードクローンの実行を制御する文 コードクローンを含むメソッドの仮引数 フィールド 引数なしメソッド呼び出しの戻り値 コードクローンの実行を制御する文 if 文,for 文など

各リサーチクエスチョンに対し 調査するメトリクス データフローと制御フローという2つの側面から調査 RQ1: コードクローンあたりの外部から受け取るデータの数 コードクローンの実行を制御する文の種類とその数 RQ2: 1つのクローンセット内の各コードクローンが外部から受け取る異なるデータの数 コードクローンの実行を制御する文の種類が異なるコードクローンを含むクローンセット数

外部から受け取るデータの探索 外部から受け取るデータ getX q s コードクローンを含むメソッドの仮引数 フィールド 外部から受け取るデータ       コードクローンを含むメソッドの仮引数 フィールド 引数を持たないメソッド呼び出し コードクローンの中に 出現する変数 getX q コードクローン中に 出現する変数の データフローの元 s

外部から受け取るデータの差分(1) x s コードクローン間で出現順位が同じ変数が外部から受け取るデータを比較し,差があれば差分とみなす コードクローン1 コードクローン2 getX a x getX q s 8

外部から受け取るデータの差分(2) x x s s コードクローンを含むメソッドの仮引数 フィールド 引数を持たないメソッド呼び出し <型,出現順序> <型,名前> <型,名前> getX a 差分 メソッド int型 getX 仮引数 int型 1 仮引数 int型 1 コードクローン中に 出現する変数の データフローの元 x x 差分 getX q メソッド int型 getX 仮引数 int型 2 仮引数 int型 2 データフローの元から上記の情報を抽出した要素 s s

外部から受け取るデータの差分の数(1) y y コードクローンのすべての変数に対して,コードクローン間で出現順位が対応する変数のデータフローを比較し,外部から受け取るデータが差分になるデータの数 コードクローン1 コードクローン2 仮引数 int型 1 仮引数 int型 2 y 差分 仮引数 int型 1 仮引数 int型 2 フィールドint型 field1 フィールドint型 field1 y 10

クローンセットの外部から受け取るデータが4種類あり, 外部から受け取るデータの差分の数(2) コードクローン1 コードクローン2 メソッド int getX 仮引数 1 2 フィールド field1 メソッド int型 getX 仮引数 int型 1 メソッド int型 getX 仮引数 int型 2 x s 仮引数 int型 1 仮引数 int型 2 仮引数 int型 1 仮引数 int型 2 フィールドint型 field1 y y クローンセットの外部から受け取るデータが4種類あり, その内3種類(75%)が差分になる

制御文を調査する方法 コードクローンの実行を制御する文 実行を制御する文の種類 コードクローンを含むメソッド内の制御文のうちコードクローンを完全に含むかつコードクローンと一番近いもの 実行を制御する文の種類 (ただし制御文の条件節を無視) if switch for while 制御文なし

調査対象 7つのオープンソースソフトウェア プロジェクト名 バージョン ソースコードの行数 (コメント,空白を除く) ファイル数 ArgoUML 0.34 109,105 1,318 Data Crow 3.9.17 68,139 650 jEdit 4.3 103,317 502 JWebMail 1.01 11,173 113 LaTeXDraw 3.0.0(a4) 35,999 363 muCommander 0.8.5 76,739 1,069 SweetHome3D 3.7 74,352 212

RQ1の説明 RQ1:各コードクローンにとって,周辺コードへの依存関係はどれぐらい多いか RQ1に対して調査したメトリクス データフロー: コードクローンあたりの外部から受け取るデータの数 制御フロー: コードクローンの実行を制御する文の種類とその数

RQ1のデータフローに関する結果 全体の8割

RQ1の制御フローに関する結果 コードクローンの実行を制御する文の種類と頻度 *数値はコードクローン数 プロジェクト名 制御文なし if switch for while ArgoUML 3,989 1,012 225 13 37 Data Crow 4,860 527 92 6 55 jEdit 2,822 596 97 76 1,123 JWebMail 197 19 2 LaTeXDraw 6,745 354 18 15 374 muCommander 2,432 710 48 178 SweetHome3D 3,510 4,661 30 1 *数値はコードクローン数

RQ1のまとめ RQ1: 各コードクローンにとって,周辺コードへの依存関係はどれぐらい多いか Answer: コードクローンは外部からデータを受け取る ただし,外部から受け取るデータの数は少ない コードクローンは実行を制御する文がないことが最も多い,次いで,if文により実行が制御されることが多い

RQ2の説明 RQ2:各コードクローンの周辺コードへの依存関係は同一のクローンセットの中でどれだけ差分が多いか データフロー: 1つのクローンセット内の各コードクローンが外部から受け取る異なるデータの数 コードクローンに存在する変数名がすべて同じとなるクローンセットかそうでないかで分けて集計した 制御フロー: コードクローンの実行を制御する文の種類が異なるコードクローンを含むクローンセット数

外部から受け取るデータがすべて異なり変数名がすべて同じ RQ2のデータフローに関する結果 外部から受け取るデータがすべて異なり変数名がすべて同じ

RQ2の制御フローに関する結果 実行を制御する文の種類が異なるコードクローンを持つクローンセットの数 プロジェクト名 全体 制御文の種類が異なる コードクローンを含むクローンセット ArgoUML 1,360 130(9%) Data Crow 1,137 79(7%) jEdit 1,242 112(9%) JWebMail 113 7(6%) LaTeXDraw 967 244(25%) muCommander 943 40(4%) SweetHome3D 1,569 169(11%) *数値はクローンセットの個数

RQ2のまとめ RQ2: Answer: 各コードクローンの周辺コードへの依存関係は同一のクローンセットの中でどれだけ差分が多いか クローンセット内で,外部から受け取るデータが一致する場合が多いが,まったく異なる場合も同様に多い 実行を制御する文の種類が異なるコードクローンを含むクローンセットも存在する

考察 コードクローンは,周辺のコードに依存しており,クローンセット内でコードクローンの周辺への依存が異なる場合がある コードクローンを分析するときは,周辺コードとの関係も調査することが重要である コードクローンと周辺コードとの関係を可視化するツールが有用と考えられる

まとめ コードクローンの周辺コードへの依存関係を調査した 今後の課題 多くのクローンセットが周辺コードに依存している 周辺コードが異なるクローンセットも多い 今後の課題 コードクローンの周辺コードを調査するためのツールを試作し,ツールを使った時のコードクローンに対する分析作業の効率の調査

外部から受け取るデータの差分の数 (1) (2) コードクローンの外部要素のうち,対応関係が一致していない外部要素を差分とする (1) x 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 (1) (2) 仮引数 int 1 2 フィールド field1 メソッド getX 表の軸の説明 外部要素が一致していなければ差分があると言います. 25

周辺コード調査用ツールの試作 Eclipseのプラグインとして実装した Sコードクローンと 周辺コード の強調表示 クローンセット と の一覧表示

差分になる外部要素の数 xとs yとy コードクローン1 コードクローン2 差分 差分 仮引数 int 2 フィールド int field1

差分になる外部要素 x s コードクローンを含むメソッドの仮引数 フィールド変数 引数を持たないメソッド呼び出し getX getX q q int 2 コードクローン1 コードクローン2 28

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

調査結果(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