論文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 も発生するが,個数などは紹介されていない
© Copyright 2024 ExpyDoc