プログラム依存グラフの一貫性検査に基づく自動欠陥検

プログラム依存グラフを用いた
ソースコードのパターン違反検出法
井上研究室 山田 吾郎
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