プログラム依存グラフを用いた ソースコードのパターン違反検出法 井上研究室 山田 吾郎 1 背景 パターン 複数ヶ所に出現する特定の処理を実現するための実装[1] open(a); : read(a); : close(a); open(b); : read(b); : close(b); open(c); : read(c); : close(c); open(d); : read(d); : : パターンの実装に誤り(パターン違反)が生じ得る 一部が欠落[2] 順序の誤り 識別子名の変更漏れ パターン違反を検出したい [1]石尾 隆ら. シーケンシャルパターンマイニングを用いたコーディングパターン抽出. 情報処理学 会論文誌, 2009 [2]A. Wasylkowski et al., Detecting object usage anomalies. In Proc. of ESEC/FSE 2007, 2007 2 既存手法と問題点 ソースコード ---------- ------------------------------------------------------ パターン モデル モ デ ル 構 築 パ タ ー ン 抽 出 パターン違反 (頻出部分構造) 違 反 検 出 ソ ー ト 確信度 モデルの簡略化 抽出可能なパターンが減少 高い確信度を用いた検出 検出漏れが増加 確信度: “パターン違反らしさ”を表す値 パターンの正しい実装と違反との出現比 高ければ高いほど違反らしい 3 提案手法:概要 ソースコード PDG ---------- ------------------------------------------------------ パターン PDG 構 築 プログラム依存グラフ (PDG) • 従来手法に比べ多くの 情報を持つ 抽出可能なパターンが 増加 パ タ ー ン 抽 出 パターン違反 違 反 検 出 低い確信度での検出 • 出現数の少ない 違反を検出可能 • 誤検出増加 ソ ー ト 複数のメトリクス 複数のメトリクス 5つのメトリクスにより • フィルタリング • ソート 誤検出の低下 4 提案手法:プログラム依存グラフ 抽象化が少なく多くの情報をもつ グラフの構成要素 頂点: プログラムの文・条件式 辺: データ依存関係・制御依存関係 1: 2: 3: 4: 5: int i = 0; i = method(); if ( i > 0) ..i = x; y = i; 1 2 3 4 5 5 提案手法:パターン抽出の例 ---------- -------- ------- ------------------------------------------ ソースコード P D G の 構 築 パターン抽出 P1 P2 6 提案手法:違反候補の検出 確信度: パターンP1が存在するPDG中でP2も出現する 条件付き確率 確信度が1ではなく,かつ利用者が定めた閾値より大 きい時,P1のみが出現するPDGがパターン違反 頂点 の欠落によるパ ターン違反 P1 P2 7 提案手法:メトリクス 5つのメトリクスを提案 リフト値 頂点欠落数 違反PDG数 頂点欠落数: 1 頂点重複度 平均ギャップ長 違反PDG数: 1 8 評価実験:概要 既存研究であるGrouMiner[1]と比較実験を行う GrouMinerはPDGに近似したモデルを使用 目的 パターン抽出に用いるデータ増加によりGrouMinerで検 出できなかったパターンを抽出できるか 誤検出を抑えながら,少数しか出現しない違反を検出で きるか 実験方法 準備としてメトリクスの閾値を決定する実験を行う 本手法,GrouMinerともに上位15件を調査し分類 [1]T.T. Nguyen et al., Graph-based mining of multiple object usage patterns. In Proc. of ESEC/FSE 2009, 2009 9 評価実験:閾値決定 違反候補 プロジェクト --------------------------------- 違 反 検 出 上位50% 欠陥 閾値 --------------------------------- 違 反 検 出 それぞれのメトリクスの中 で最悪値を閾値に 全てのメトリクスで上位50%に存 在する候補に絞り込み 絞りこまれた全候補から 欠陥を調査,列挙 10 評価実験:結果 プロジェク ト名 Apache Ant GrouMin er 確信度 0.9 欠陥数(上位15件) 本手法 確信 度 0.9 確信 度 0.6 確信度0.6 & GrouMiner 本手法 フィルタリン グ 145 34 960 24 1 2 32 8 143 11 0 0 AspectJ 244 26 368 14 1 0 Apache Axis 145 32 689 27 0 1 Columba 40 144 1343 50 1 0 jEdit 47 36 632 11 1 1 Jigsaw 115 41 723 26 1 2 Struts 33 5 137 3 0 0 Apache log4J 11 検出例 Apache Axisからの欠陥: 確信度0.67 org.apache.axis.components.net.JSSESocketFactory public Socket create(...) throws Exception { if (port == -1) { port = 443;} : Socket sslSocket = null; : 欠落 org.apache.axis.components.net.SunJSSESocketFactory等2箇所 public Socket create(...) throws Exception { Socket sslSocket = null; if (sslFactory == null){ initFactory(); } if (port == -1) { port = 443;} : 12 まとめと今後の予定 まとめ PDGをもとにパターン違反を検出する手法を提案 ツールを実装し,GrouMinerと比較実験 誤検出の増加を抑えながらパターン違反を検出 今後の課題 手法の高速化 フィルタリングの有効性を他の手法で確認 13 ご清聴ありがとうございました 14
© Copyright 2024 ExpyDoc