R2 - qwik.jp

論文R2
Metadata Invariants:
Checking and Inferring Metadata
Coding Conventions
Myoungkyu Song and Eli Tilevich
発表者: 石尾 隆(大阪大学)
論文の概要
• Metadata Invariants という概念の提案
– 特定のパターンに該当するプログラム要素(パッケージ/クラス/メソッ
ド/フィールド)が持つべきメタデータを指定する
例 1.
2.
JUnit では,名前が “Test” で終わるクラスの “public void” で始まるメソッドは
“@Test”, “@Before”, “@After” のいずれかを持つこと
Hibernate では,@Column{ name=“fieldName” } int fieldname; というように,
@Column の name 属性とフィールド名が一致すること
• Metadata Invariants Language (MIL) の定義
– Java 5 Annotation, XML によるメタデータ記述の2種類に対応
– AspectJ のポイントカットに類似した宣言的記述を提供
• MIL をソースコードから自動推論する方法の提案
– 出てきたものを人間が確認・加工して,検査ツールに投入できる
Metadata Invariants とは
• 構成要素
-- 名前がTest で終わるクラス c の
例 Class c in p Where (* class *Test)
Method m in c Where (public void *) -- public void メソッド m について
Assert (@Test m)
-- @Test が存在することを要求
– プログラム要素を選択するパターン
• “class *Test” や “public void *” など,Java のパッケージ/クラス/メソッド/フィールド
宣言の形式で表現.一部をワイルドカード (*) に変換してもよい
– パターンに該当した要素が満たすべき条件
• @Test のような Java 5 Annotation
• <class name=“C”><field name=“f”>… のような特定のXMLメタデータ
• 名前や継承関係に関するルール
• 検証方法
– 対象プログラムから,パターンにマッチするプログラム要素をすべて列挙し,
それぞれが,Invariants に定義された条件のメタデータを持つことを確認する
Metadata Invariants の推論
• 候補の列挙
– 各メタデータについて,それを持っているプログラム要素をす
べて列挙(たとえば @Test を持つメソッド)
– 列挙された名前から共通部分文字列を計算し,それ以外の部
分を “*” で置き換えて,プログラム要素のパターンを作成する
※ ケーススタディに出てくる結果を見る限り,論文に書かれていないルールが
かなりありそう
• 候補の検査
– プログラム要素のパターンを実際に適用し,マッチした要素が,
メタデータを持っている割合を評価する
• 実験では閾値 96% 以上であれば Invariant として出力
ケーススタディ
• 様々な対象に対して実験
– Hibernate, JEdit, Spring, JBoss Seam, IntelliJ, RunaWFE, OpenVPN ALS
• Metadata Invariants が存在していることを示した
– 例1: Hibernate のソースコードから,Hibernate での JUnit の使い方が
出てきた
Class c in p Where (* class *Test | * class Test*)
Method m in c Where (public void *)
Assert (@Test m)
– 例2: JEdit では,オーバーライドを表現する @Override の記述が抽
出された
Class c in p Method m in c Where (@Override m)
Assert (c.super has m)
• False positive も発生するが,個数などは紹介されていない