オブジェクト指向プログラムに対するメソッド呼び出しパターン違反の
検出手法
井上研究室 山田 吾郎
メソッド呼び出しパターンとは
メソッド定義中に頻出するメソッド呼び出し系列
メソッド呼び出し系列は , 以下の要素からなるメソッド名制御構造 (if, while, ...)
パターンの中には,実装を行う上で守るべきルールを表しているものがある
特別研究発表会 2
open(); :read(); :close();
open(); :read(); :close();
open(); :read(); :close();
open(); :read(); :close();
メソッド定義 1 メソッド定義2
メソッド定義 n-1
メソッド定義 n
・・・
パターン違反とは
パターンに違反したメソッド呼び出し系列
パターンに違反しているメソッド呼び出し系列は欠陥を含んでいる可能性がある
特別研究発表会 3
open(); :read(); :close();
open(); :read(); : :
メソッド定義 1 メソッド定義2
メソッド定義 n-1
メソッド定義 n
・・・
open(); :read(); :close();
open(); :read(); :close();
close が欠落してい
る
パターン違反の検出手法
相関ルール (association rule) の確信度 C を用いる
相関ルール P1⇒P2パターン P1, P2 について , あるメソッド定義中で P1 が出現するとき, P2 も出現するというルール
確信度 C: P1 が出現するとき, P2 も出現する条件付確率
確信度が 1.0 でなく,任意の閾値以上であればパターン違反を検出
相関ルールに反しているメソッド定義がパターン違反特別研究発表会 4
C( P1 ⇒ P2 )=
P1 の出現するメソッド定義P1, P2 ともに出現するメソッド定義
パターン違反の検出例
2 つのパターンP1 = {open, read}P2 = {open, read, close}
特別研究発表会 5
open(); :read(); :close();
open(); :read(); : :
メソッド定義 1 メソッド定義2
メソッド定義 99 メソッド定義 100
・・・
open(); :read(); :close();
open(); :read(); :close();
パターン違反
C( P1 ⇒ P2 ) = =
P1 の出現するメソッド定義 100
P1, P2 ともに出現するメソッド定義 99
本研究の動機
オブジェクト指向プログラムに対し,パターン違反を用いた欠陥検出を行った研究は確認できていない
過去の適用例は, C 言語で記述されたプログラムのみ
オブジェクト指向プログラムである Java 言語に適用し,欠陥検出における有効性を確認する
特別研究発表会 6
適用にあたっての問題点と解決方法
オブジェクト指向言語ではメソッド名だけでメソッドを特定できない
C 言語では関数名のみで関数を識別できるJava 言語では同名のメソッドが複数存在する
オーバーロード,クラス階層
欠陥検出において検出漏れが起こる可能性がある
メソッド呼び出しに関連する型を考慮
レシーバオブジェクト 引数特別研究発表会 7
someClass.someMethod(arg1, arg2 );
型を考慮することによる効果の例
メソッド名のみ考慮する場合{x.open, x.read} を {a.open, a.read} と同一視パターン {open, read} の出現メソッド定義数が増加
確信度 C が減少閾値を下回ると検出漏れ
型も考慮する場合{x.open, x.read} と {a.open, a.read} を区別することができる
特別研究発表会 8
a.open();a.read();a.close();
a.open();a.read();a.close();
a.open();a.read();a.close();
a.open();a.read();a.close();
a.open();a.read();a.close();
a.open();a.read(); :
x.open(); :x.close();
x.open(); :x.close();
x.open(); :x.close();
x.open(); :x.close();
x.open();x.read(); :
型A
型A
型X型X
型A
型A型A
パターン違反
実験目的
オブジェクト指向プログラムに対する有効性の評価
欠陥を検出できるか,またその検出数を確認
型を考慮することの有効性の評価型を考慮することで,考慮しない場合に検出できなかった欠陥を検出できるか調査欠陥を含まないパターン違反を削減できるか確認
特別研究発表会 9
実験方法
対象Java で開発されたプログラム Eclipse JDT
パターン違反とみなす確信度の閾値は 0.9型を考慮する場合としない場合, 2 通りの実験を行う
特別研究発表会 10
行数 ファイル数 メソッド数
334,59
5
1,654 9,668
実験結果とその評価
欠陥の検出数型を考慮した場合に , 192 のパターン違反から 1 つの欠陥が検出された
型を考慮することの有効性検出された欠陥は , 型を考慮した場合のみ発見されたパターン違反が 64.7% に削減されたそのうち 65.1% が欠陥を含んでいた
特別研究発表会 11
型を考慮しない 型を考慮
パターン 260 121
パターン違反 456 295
欠陥を含むパターン違反
0 192
欠陥 0 1
検出された欠陥について
P1={writeU1, writeU2, writeU1, writeU2}P2={problemReporter, ...}
特別研究発表会 12
writeU1(NameAndTypeTag); writeU2(nameIndex);}index = … = currentIndex++;if (index > 0xFFFF){ ….problemReporter().noMoreAvailableSpaceInConstantPool(…);}writeU1(MethodRefTag); writeU2(classIndex);
org.eclipse.jdt.internal.compiler.codegen.ConstantPool
31 のメソッド定義中 1 つのみ欠落
C( P1 ⇒ P2 )=
P1 の出現するメソッド定義P1, P2 ともに出現するメソッド定義
まとめと今後の課題
まとめオブジェクト指向プログラムに対し,パターン違反を用いた欠陥検出を行った
適用に際し , 精度を高めるため型情報を用いた
欠陥の検出に成功し,型情報を用いる有効性も確認した
今後の課題他のプログラムへの適用他の欠陥検出ツールとの比較
特別研究発表会 13
ご清聴ありがとうございました
特別研究発表会 14