コード片に共通した特性を自動抽出する ソースコード閲覧ツールの試作

Slides:



Advertisements
Similar presentations
API 呼び出し列の差分を利用した Android アプリケーション比較ツールの 試作 井上研究室 神田 哲也.
Advertisements

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 1 ソフトウェア部品推薦のための.
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 保守支援を目的とした コードクローン情報検索ツール.
6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
XHTML構文検証手法における スクリプト要素の静的解析アルゴリズム
背景 我々の研究室で開発しているJavaプログラム解析フレ ームワークでは,解析情報はメモリ上に保持される 問題点
ソースコードの編集内容を入力とした ソフトウェア部品の自動検索
Myoungkyu Song and Eli Tilevich 発表者: 石尾 隆(大阪大学)
情報伝播によるオブジェクト指向プログラム理解支援の提案
アクセス修飾子過剰性の変遷に着目したJavaプログラム部品の分析
変数間データフローグラフを用いた ソースコード間の移動支援
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
分散処理を用いた大規模ソフトウェアに対するコーディングパターン検出ツール
プログラム実行履歴を用いたトランザクションファンクション抽出手法
プログラム実行時情報を用いたトランザクションファンクション抽出手法
コンパイラの解析 (2) GCJのデータ構造 - 1.
ソースコードの変更履歴における メトリクス値の変化を用いた ソフトウェアの特性分析
類似するコーディングパターンの 利用状況調査ツールの提案
コーディングパターンと キーワードを用いて生成したコードスニペットの推薦
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
ソードコードの編集に基づいた コードクローンの分類とその分析システム
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
動的スライスを用いた バグ修正前後の実行系列の比較
動的依存グラフの3-gramを用いた 実行トレースの比較手法
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
動的スライスを用いたバグ修正前後の実行系列の差分検出手法
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
プログラムスライシングを用いた 機能的関心事の抽出手法の 提案と実装
Javaプログラムの変更を支援する 影響波及解析システム
コードクローン検出ツールを用いた ソースコード分析システムの試作と プログラミング演習への適用
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
オープンソース開発支援のための リビジョン情報と電子メールの検索システム
コードクローンの動作を比較するためのコードクローン周辺コードの解析
UMLモデルを対象とした リファクタリング候補検出の試み
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
バイトコードを単位とするJavaスライスシステムの試作
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
既存ソフトウェア中の 頻出コード片を用いた コード補完手法の提案
コーディングパターンの あいまい検索の提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
コードクローン間の依存関係に基づく リファクタリング支援環境の実装
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
ソフトウェア工学 知能情報学部 新田直也.
C#プログラミング実習 第3回.
設計情報の再利用を目的とした UML図の自動推薦ツール
保守請負時を対象とした 労力見積のためのメトリクスの提案
dcNavi:デバッグ支援のための グラフベース推薦システム
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
クローン検出ツールを用いた ソフトウェアシステムの類似度調査
オープンソースソフトウェアに対する コーディングパターン分析の適用
メソッドの同時更新履歴を用いたクラスの機能別分類法
分散処理を用いたコーディングパターン検出ツールの実装
統合開発環境のための プログラミング言語拡張 フレームワーク
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
ソフトウェア理解支援を目的とした 辞書の作成法
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
コードクローン解析に基づく デザインパターン適用候補の検出手法
石尾 隆 (大阪大学) 山本 哲男 (立命館大学) 佐々木 裕介 (大阪大学)
回帰テストにおける実行系列の差分の効率的な検出手法
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
識別子の読解を目的とした名詞辞書の作成方法の一試案
プログラム理解のための 付加注釈 DocumentTag の提案
Presentation transcript:

コード片に共通した特性を自動抽出する ソースコード閲覧ツールの試作 石尾 隆   井上 克郎 大阪大学

研究の背景 複数の場所に,似たようなコードが記述される 関数,アルゴリズム,イディオムの再利用 横断的関心事の実装 bug copy-and-modify copy-and-modify bug

複製されているかもしれない欠陥の考慮 バグ修正のプロセス ユーザからバグが報告される. バグの原因を分析する. 同じ問題が,他のコードでも起きてないか検査する. バグを修正し,テスト実施. 修正したソフトウェアをユーザに渡す.

「同じ」欠陥を見つける手順 バグに関連したキーワードを開発者が特定する. 開発者が grep を実行してキーワード検索する. キーワードの各出現について, 修正の要・不要を判断する. grep の出力を逐一確認するのは, 開発者にとって大きな負担

There is no perfect system. なぜ grep を使うのか 再現率100% 低適合率 +検証可能性: どのキーワードで,何が検査したかが明白. CCFinder などの検出ツールは, 閾値の設定等が明確ではない. 同じバグの再発は防ぎたい 「修正した」報告の直後に,   別のコードで同じ問題が発生したら…? There is no perfect system.

本研究の提案 維持するもの: 再現率 100% grep の結果を「分類」する 現在の対象は Java (キーワードは正しいものとして)           (キーワードは正しいものとして) grep の結果を「分類」する 似たコードを同時にまとめて検査すれば,学習効果が働いて効率化が見込める 現在の対象は Java

例: JEdit はいつ beep 音を鳴らすか? 「編集禁止」文書を編集しようとした. (34 methods) キャレットを移動しようとしたが,できなかった. (22 methods) Case 1 (class JEditBuffer) public void undo(…) { if(undoMgr == null) return; if(!isEditable()) { textArea.getToolkit().beep(); return; } … // undo the previous action Case 2 (class TextPane) public void goToNextMarker(…) { java.util.List<Marker> markers = … if(markers.isEmpty()) { getToolkit().beep(); return; } Marker marker = … textArea.moveCaretPosition( marker.getPosition()); … このようなグループを 自動的に検出したい

コード片の分類法 grep の結果を手続き単位で扱う 手続きの類似性 = 共通の属性を持つこと 振舞いに関する属性 (抜粋) 2つの手続きが,共通のメソッドを呼び出す. 同一メソッド, 同一シグネチャ, 同一の名前,と複数段階 2つの手続きが,共通のフィールドにアクセスする. 構造に関する属性 (抜粋) 2つの手続きが,同じクラスに宣言されている. 2つの手続きが,同じメソッドをオーバーライドしている.

属性の抽出手順 すべての属性は,メソッドに対して真偽値を返す述語 P(m: method) => boolean 手続き単位で grep の結果をまとめる grep の結果 全手続きに対して属性を評価 B1(m) = m calls “isEditable”. B2(m) = m calls “moveCaretPosition”. B3(m) = … … S1(m) = m is defined in class “JEdit”. S2(m) = m have the name “set*”. S3(m) = …

メソッド-属性 表 JEdit のソースコードに “beep” で検索をかけた場合 Methods found by grep Call beep (85 methods) Call isEditable (34 methods) Call moveCaretPosition (21 methods) Accesses undoMgr field (2 methods) JEditBuffer.undo X EditPane. goToNextMarker goToPrevMarker Abbrevs. expandAbbrev

形式概念分析の適用 形式概念分析は,メソッドと属性をグループ化 「概念」とは [M, P] 非排他的,階層的分類 メソッド集合 M と X M2 M3

分析ツールとしての形式概念分析 利点:メソッド集合に必ず共通の属性がある 制限:大きな表になると「概念」の数が増加し,分析が困難となる. グループになっている理由の解釈が容易. 制限:大きな表になると「概念」の数が増加し,分析が困難となる. 対話的ツールとして「概念の抽出」の実装 選択したメソッドに共通する属性を抽出. 抽出された属性を満たす関連メソッドも抽出. 選択した属性に共通のメソッドを抽出. 抽出されたメソッドが他にどの属性を満たすかも抽出.

ツールデモ 対象: テキストエディタ JEdit java -cp jedit-bin Main jedit-source beep ツールへの入力: java -cp jedit-bin Main jedit-source beep  解析対象から JDK のメソッド呼び出しは,beep メソッド以外は除去した.  [JEdit のバイナリ] [JEdit のソース] [キーワード]

メインウィンドウ: メソッド-属性表 1列が1属性に対応. 属性を満たすメソッド数が多い順 属性の詳細は ツールチップで表示 1行1メソッド. キーワードを持つ メソッドを表示. メソッドが属性を満たすことを示す

フィルタ&ソース閲覧 列を選んで,その属性を 持つメソッドだけ,あるいは 持たないメソッドだけ表示 行のダブルクリックでソースコード表示. 封筒マークは「未閲覧」を示す

属性を持ったメソッドを隠す 現在表示中のメソッドに共通した属性を 優先して,属性を並べ替え, 次に特徴的な属性を探す

調査は効果的か? JEdit における beep メソッドの場合 その他の分析経験:一般的なキーワードで検索して,興味あるグループだけを調査 93メソッド中,52のメソッドが “call isEditable”, “call moveCaretPosition” の2つでカバーされた その他の分析経験:一般的なキーワードで検索して,興味あるグループだけを調査 JEdit のソースコードを “save” で検索.テキストファイルの保存と,各種設定の保存とを区別した. 例外処理の一貫性検査: “try” を検索して,同種の例外処理だけを検査した.

まとめ キーワード検索の結果を分類,閲覧するツールの試作 今後の課題 共通のメソッド呼び出し等を自動抽出 形式概念分析の適用 分類理由の解釈が容易 ソースコードの変更に分類結果が影響されにくい 今後の課題 分析経験の蓄積による有用性の評価 似ているコードがある理由を理解するための属性の検討