コードクローンに含まれるメソッド呼び出しの 変更度合の調査

Slides:



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

シーケンス図の生成のための実行履歴圧縮手法
情報伝播によるオブジェクト指向プログラム理解支援の提案
Object Group ANalizer Graduate School of Information Science and Technology, Osaka University OGAN visualizes representative interactions between a pair.
剽窃 他人の作品や論文を盗んで,自分のものとして発表すること. プログラムが剽窃される事例もある. Aさんのプログラム Xさんのプログラム
研究の背景 コードクローン ソースコード中に存在する一致または類似したコード片
変数間データフローグラフを用いた ソースコード間の移動支援
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
川口真司 松下誠 井上克郎 大阪大学大学院情報科学研究科
アイテムセットマイニングを利用した コードクローン分析作業の効率向上
大規模ソースコード集合を対象とした 類似関数集合群の抽出
ギャップを含むコードクローンの フィルタリング手法の提案
類似するコーディングパターンの 利用状況調査ツールの提案
コーディングパターンと キーワードを用いて生成したコードスニペットの推薦
ソースコードの同時修正支援における関数クローン検出ツールの有効性調査
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
識別子の命名支援を目的とした動詞-目的語関係の辞書構築
識別子の共起関係に基づく類似コード検索法の提案と 欠陥検出への適用
ソードコードの編集に基づいた コードクローンの分類とその分析システム
コードクローンの分類に基づいた メソッド引き上げ手順の提案とその有効性評価
動的依存グラフの3-gramを用いた 実行トレースの比較手法
ポインタ解析におけるライブラリの スタブコードへの置換の効果
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
クローンセットに対する主要編集者の分析法の提案と調査
重複コードと非重複コードにおける 修正頻度の比較
Javaプログラムの変更を支援する 影響波及解析システム
コードクローン検出ツールを用いた ソースコード分析システムの試作と プログラミング演習への適用
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
コードクローンの動作を比較するためのコードクローン周辺コードの解析
コードクローンに対する一貫性のない変更に起因する欠陥の検出
Token Comparison Approach to Detect Code Clone-related Bugs
柔軟に変更可能な字句解析機構を持つ コードクローン検出ツールの開発
ハッシュ値比較による Javaバイトコードに含まれる ライブラリの検出手法
プログラム実行履歴を用いたコードクローン検出手法
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
プログラミングコンテストシステムへの 提出履歴データとその分析
プログラム理解におけるThin sliceの 統計的調査による有用性評価
コードスメルの深刻度がリファクタリングの実施に与える影響の実証的研究
コードクローン編集者数に着目した開発履歴の分析
コード片に共通した特性を自動抽出する ソースコード閲覧ツールの試作
多様なプログラミング言語に対応可能な コードクローン検出ツール CCFinderSW
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
既存ソフトウェア中の 頻出コード片を用いた コード補完手法の提案
コーディングパターンの あいまい検索の提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
アルゴリズムとプログラミング (Algorithms and Programming)
コードクローン間の依存関係に基づく リファクタリング支援環境の実装
コードクローンの分布情報を用いた特徴抽出手法の提案
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
メトリクス値の変化に基づく コードクローンの編集傾向分析
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
ソースコードの差分を用いた関数呼び出し パターンの抽出手法の提案と実装
クローン検出ツールを用いた ソフトウェアシステムの類似度調査
オープンソースソフトウェアに対する コーディングパターン分析の適用
蓄積されたオブジェクトの動作履歴を用いた 実行履歴削減手法の提案
コードクローン間の依存関係に基づく リファクタリング支援手法の提案と実現
ソースコードの編集状況に応じた ソフトウェア部品の自動推薦システム
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
複雑度メトリクスを用いた JAVAプログラム品質特性の実験的評価
コードクローン解析に基づく デザインパターン適用候補の検出手法
回帰テストにおける実行系列の差分の効率的な検出手法
メソッド抽出リファクタリングが 行われるメソッドの特徴調査
プログラム理解のための 付加注釈 DocumentTag の提案
Presentation transcript:

コードクローンに含まれるメソッド呼び出しの 変更度合の調査 大阪大学 ○工藤良介,伊達浩典,石尾隆,井上克郎

コードクローンとは ソースコード中に類似したコード片を持つコード片のこと. コードクローンは,主にソースコードがコピーされることで生成される. 互いに類似しているコード片の組,あるいは集合を「クローンセット」と呼ぶ. コードクローンの説明 コードクローン コードクローン コードクローン クローンセット

CCFinderが検出するコードクローン 識別子の名前が一致しなくとも,文の構造が一致すればコードクローンと判定する. x = getX(); z = getZ(); n = getN(x,z); return n; y = getY(); z = getZ(); n = getN(y,z); return n; 検出されたコードクローンが何を 再利用したものなのかはわからない. - メソッド呼び出し列の再利用? - 文の構造だけを再利用? コードクローン 識別子名の違いは吸収される

研究目的・内容 検出ツールが出力するコードクローンの,コード間での関係について調査したい. 検出ツールの使用者にとって有用な情報になる. 本研究ではコードが行なっている処理の内容の差異に着目する. コピー元のコードと,コピー先のコードで,コードが行う処理が異なることはあるのか メソッド呼び出しの変更の有無を調べる

調査内容 RQ1.コード間で主要な処理の内容が変わっていないクローンはどの程度存在するのか. 変更とは

「重要なメソッド呼び出し」 メソッドの主要な処理を行なっていると思われるメソッド呼び出し この定義は,Sridhara[1]の「メソッド中からメソッドの概要を説明するためにふさわしい文を選択し,メソッドのサマリコメントを自動で作成する」という研究を参考にしている. 「メソッドの概要を説明するにふさわしい文」には基本的にメソッド呼び出しが含まれる. 「重要なメソッド呼び出し」で呼び出しているメソッドが異なる場合、処理の内容が異なると考える [1]G. Sridhara, E. Hill, D. Muppaneni, and L. Pollick. Towards automatically generating summary comments for Java methods. In Proceedings of the 25th IEEE/ACM International Conference on Automated Software Engineering (ASE 2010), pp. 43–52, 2010.

5種類の「重要なメソッド呼び出し」 「重要なメソッド呼び出し」として選択されるメソッド呼び出しは5種類 ending メソッドの最後の文のメソッド呼び出し void-return 戻り値が利用されていないメソッド呼び出し same-action メソッド名と同じ動詞を持つメソッド呼び出し data-facilitating ending, void-return, same-actionの「重要なメソッド呼び出し」で引数となっているローカル変数に直前に代入を行なっているメソッド呼び出し control ending, void-return, same-action, data-facilitatingの「重要なメソッド呼び出し」の実行条件となるメソッド呼び出し ending:なんらかの準備を行ったあと,最後に重要な処理をすることが多い void-return: same-action::そのメソッドの主な動作を担当している可能性が高い。

例:重要なメソッド呼び出し(1) ending void-return data-facilitating  メソッドの最後の文のメソッド呼び出し void-return 戻り値が利用されていないメソッド呼び出し data-facilitating ending, void-return, same-actionの「重要なメソッド呼び出し」で引数となっているローカル変数に直前に代入を行なっているメソッド呼び出し

例:重要なメソッド呼び出し(2) same-action control メソッド名と同じ動詞を持つメソッド呼び出し  メソッド名と同じ動詞を持つメソッド呼び出し control  ending, void-return, same-action, data-  facilitatingの「重要なメソッド呼び出し」の実行条件となるメソッド呼び出し

重要なメソッド呼び出しが変更されていると,コード間で主要な処理の内容が異なる メソッド呼び出しの変更 クローンに存在する「メソッド呼び出し」のうちクローン間で「名前が変更されたメソッド呼び出し」 メソッド呼び出しの 名前を比較 クローンセット void method1(){ x = getX(); … remove(a); z = getZ(); n = getN(); write(b) } void method1(){ y = getY(); … add(a); z = getZ(); n = getN(); write(b) } コード1 コード2 変更 重要 getX getY あり ☓ remove add void-return getZ なし getN write ending コード1 コード2 重要なメソッド呼び出しが変更されていると,コード間で主要な処理の内容が異なる

メソッド呼び出しの変更度合 全てのメソッド呼び出しのうち、名前の変更されたメソッド呼び出しの割合 例) ・メソッド呼び出しの変更度合  = 40% (2/5) コード1 コード2 変更 重要 getX getY あり ☓ remove add void-return getZ なし getN write ending ・重要なメソッド呼び出しの変更度合  = 50% (1/2) ・重要でないメソッド呼び出しの変更度合  = 33% (1/3)

調査方法 RQ1.コード間で主要な処理が変わっていないクローンはどの程度存在するのか. 「重要なメソッド呼び出し」の変更度合を計算する. RQ2. コードの主要な処理は他の処理より変更されにくいか. 「重要なメソッド呼び出し」の変更度合と「重要でないメソッド呼び出し」の変更度合を比較する. RQ3. 主要な処理が変更されたコードと,変更されていないコードには,どのような傾向があるか. 「重要なメソッド呼び出し」の変更度合が高いコードと低いコードから,それぞれサンプルを取り出し調査した.

調査手法 Java ソースコード コードクローン情報 メソッド呼び出し情報 入力 出力 入力 出力 クローンの位置{ファイル,行,列} CCFinder 分析ツール コードクローン検出ツール Java ソースコード コードクローン情報 メソッド呼び出し情報 クローンの位置{ファイル,行,列} ・ メソッド呼び出しは重要か否か ・ クローン間の メソッド呼び出しの変更度合

調査対象 以下の6つのJavaで記述されたオープンソースソフトウェアを対象とする. ソフトウェア バージョン Javaファイル数 コードクローン数 Derby 10.9.1.0 1445 1384 h2 1.3.168 500 569 jtunes (2009.12.12) 519 675 Tomcat 7.0.27 1242 1962 XXL 1.0 633 509 zk 6.5.0 406 229

調査結果(1) 87%のコードクローンで「重要なメソッド呼び出し」の変更度合は0であった. RQ1.コード間で処理の内容が変わっていないクローンはどの程度存在するのか. 「重要なメソッド呼び出し」の変更度合を計算する. 87%のコードクローンで「重要なメソッド呼び出し」の変更度合は0であった. ソフトウェア 変更度合が0の コードクローン 総コードクローン数 割合 Derby 1308 1384 94.5% h2 452 570 79.3% jtunes 599 675 88.7% Tomcat 1661 1962 84.7% XXL 423 510 82.9% zk 196 229 85.6% 合計 4639 5330 87.0% 多くのコードクローンでは,主要な処理の再利用のためにコピペが行われている

調査結果(2) 6つのソフトウェア全てで「重要なメソッド呼び出し」の変更度合の方が低く,統計的に有意な差があった. RQ2. 主要な処理は他の処理より変更されにくいか. 「重要なメソッド呼び出し」の変更度合と「重要でないメソッド呼び出し」の変更度合を比較する. 6つのソフトウェア全てで「重要なメソッド呼び出し」の変更度合の方が低く,統計的に有意な差があった. (Wilcoxonの順位和検定, 有意水準 = 0.01) ソフトウェア 重要なメソッド呼び出し の変更度合の平均値 重要でないメソッド呼び出し p値 Derby 3.4% 27.3% < 2.2e-16 h2 12.1% 14.6% 4.4347e-6 jtunes 6.1% 8.2% 0.0057 Tomcat 9.5% 14.1% XXL 8.0% 13.6% 0.0032 zk 8.7% 26.5% 4.967e-10

調査結果(3) RQ3. 主要な処理が変更されたコードと,変更されていないコードには,それぞれどのような傾向があるか. 「重要なメソッド呼び出し」の変更度合が高いコードと低いコードから,それぞれサンプルを取り出し調査した.(各ソフトウェアから5例ずつ) 変更度合の低いコードクローンは,類似した名前のクラスやメソッドから多く出現していた.(22例/30例) 例)AjpNioProcessorクラスのprocessメソッドとAjpAprProcessorクラスのprocessメソッド 変更度合の高いコードクローンは,ifやcaseなどの制御構文が繰り返し記述されている箇所から出現することが多かった.(18例/30例)

考察 CCFinderが検出するコードクローンの多くはその処理の再利用を目的としている. 87%のコードクローンで、「重要なメソッド呼び出し」の名前が変わっていなかった. 不要なコードクローンのフィルタリングに利用できるかもしれない. 「重要なメソッド呼び出し」の変更が多いコードクローンは繰り返しの構造が多い.

妥当性 今回の結果が,CCFinder以外のコードクローン検出ツールが取り出すコードクローンについても当てはまるとは限らない. Java以外の言語で書かれたソフトウェアでは結果が異なる可能性がある. 対象のソフトウェアを増やすことで,異なる傾向が発見される可能性がある. メソッドの名前の差異のみを調査しているため、呼び出し先が実際に同じかどうかはわからない

まとめと今後の課題 まとめ 今後の課題 コードクローンの特徴を調べるため,「メソッド呼び出しの変更度合」を計測し,分析を行った. 多くのコードクローンで主要な処理は変更されないことがわかった. 今後の課題 他のコードクローン検出ツールについても調査を行う. 対象の言語やソフトウェアを増やし,今回の結果の一般性を確認する. まとめ