Transcript PPT原稿
XML表現を用いたプログラムの診断
卒業発表
2008/2/7
海尻海谷研究室
M2 劉 英
研究背景
プログラムの良形性は非常に重要だ。
読解性、理解容易性が増す
保守性を高めることになる
プログラムの正しさには種々のレベルが
ある
語彙レベル
構文レベル
静的意味レベル
動的意味レベル
語用論レベル
研究手法
Javaプログラムを対象とする事とし、
JavaMLというJavaプログラムのXML表
現に着目し、XML表現を対象として良形
性の診断を行うこととした。
JavaMLへの変換はJikesというフリーの
Javaコンパイラを改造したツールを利用
した。
診断:
プログラムの良形性
プログラムのコピー
プログラムの診断として構成
クラス名を小文字で始めていないか
publicなインスタンスもしくはクラス変数いないか
set、getメソッドがあるか
変数名は有意な単語(辞書にあるような単語)
長すぎる行は避ける
プログラムの順序が理解安いかどうか
型と頭文字
プログラム剽窃方法
プログラム剽窃:コピーするまたは少数のソースコー
ド修正
語彙の変化:語彙の変化によって、原則として、テキス
トエディタによって実行されることができた変化を意味
する。
コメントは言い換えられること、加えられること、
省略されること
フォーマット化することは変わること
識別子名は修正されること
構造変化:
ループは代わられること(例えば、Pascalでwhile
ループとuntilループは代わりになられる)
Nested if声明とcase声明は取り替えられる
プログラムの意味に影響を及ぼさないならば、声明
命令は変わること
手順への呼び出しは手順の量のコピーと取り
替えられるかも
オペランドの命令は、変わるかも(例えば、
x <yは、y >= xになる)
プログラム検証方法
方法:
• 情報を得って、ソフトウェア測定基準に基づく類
似性を評価しているアルゴリズムを使用している
2つの文書の情報を比較する。
• 短所:支配フローのような構造特徴を反映するこ
とができない時から、それはソースコード剽窃を
見つけることにふさわしくない
構造特徴を比較する
• プログラムの論理的構造難しくて、もう一つの物
を造る必要がある
• 多くの方法がある(例えば:文字列 、解析木、
token sequence)
類似性検出手法
アルゴリズムにより
i) 文字列マッチングによる類似性検出
ii) 構造の比較による類似性検出
iii) 意味的構造を用いた類似性検出
XML DOM
DOM:プログラムやスクリプトがXMLや
HTMLのデータにアクセスし、それらを作す
るためのプログラムインターフェイス(API)と、
そのインターフェイスが使用するオブジェクト
モデルを定義する
XMLデータとDOMツリーの関係
<?xml version=“1.0”
encoding=“shiftJIS” ?>
<Dog>
<Name>ポチ</Name>
<Age>2</Age>
<Dog>
Documentオブジェクト
Elementオブジェクト
(タグ名:Dog)
Element
オブジェクト
(タグ名:Name)
Element
オブジェクト
(タグ名:Age)
Text
オブジェクト
(データ:ポチ)
Text
オブジェクト
(データ:2)
ノードタイプの定数と数字
nodetype
定数
要素 (Element) ELEMENT_NODE
属性 (Attr)
ATTRIBUTE_NODE
テキスト (Text) TEXT_NODE
コメント
COMMENT_NODE
(Comment)
文書
DOCUMENT_NODE
(Document)
文書型
DOCUMENT_TYPE_NODE
(DocumentType)
記法宣言
NOTATION_NODE
(Notation)
ノード種類
nodeName
タグ名
属性名
#text
#comment
nodeValue
null
属性値
テキストの内容
コメントの内容
#document
null
文書型の名前
null
記法の名前
null
DOMの名前空間関係のメソッド
インターフェイス
Document
メソッド
Element createElementNS
Attr createAttributeNS
Nodelist
getElementByTagNameNS
NameNodeMap Node getNamedltemNS
Node setNamedltemNS
Node removeNamedltemNS
Element
DOMString getAttributeNS
説明
名前空間付きのElementの作成
名前空間付きのAttrの作成
指定した名前空間URIとローカル
名を持つノードリストの返却
指定した名前空間URIとローカル
名を持つノードリストの取得
名前空間付きのノードの追加
指定した名前空間URIとローカル
名を持つノードリストの除去
指定した名前空間URIとローカル
名を持つ属性の型の取得
インターフェイス
Element
メソッド
void setAttributeNS
void removeAttributeNS
Attr getAttributeNodeNS
Attr setAttributeNodeNS
NodeList
getElementByTagNameNS
boolean hasAttributeNS
説明
名前空間で修飾された新しい
属性の追加
指定した名前空間URIとローカ
ル名の属性の除去
指定した名前空間URIとローカ
ル名を持つAttrの取得
名前空間で修飾された新しい
Attrの追加
Elementの子孫から、指定し
た名前空間URIとローカル名
のElementのノードリストを返す
指定した名前空間URIとローカ
ル名の属性が指定されているか
またはデフォルト値を持つかを
調べる
JavaML
JavaMLはXMLの一種でJavaソースコード
用のマークアップ言語
ソースコードの分析
XMLの分析
Public class Test
<class name=“Test” visibility=“public”/>
JavaMLのコンパイラ
jikes <javaソースファイル>
jikes +ulx <javaソースファイル>
プログラムの結果
ルート要素のタグ名:java-source-program
***** ページリスト *****
クラス名 class2
......先頭は小文字です。 public
メソッド名 main
...... クラス名:class2 public クラスメソッド 型:void
引数名 args[]
...... クラス名:class2 メソッド名:main 型:String
ローカル変数名:rel[]
...... クラス名:class2 メソッド名:main 型:Rental
ローカル変数名:i
...... クラス名:class2 メソッド名:main 型:int
クラス名 Rental
...... public
変数名 price
...... クラス名:Rental public クラス変数 型:int
変数名 title
...... クラス名:Rental インスタンス変数 型:String
メソッド名 set_price
...... クラス名:Rental public クラスメソッド 型:void ->setメソッドである。
引数名 p
...... クラス名:Rental メソッド名:set_price 型:int
メソッド名 get_price
...... クラス名:Rental public インスタンスメソッド 型:int ->getメソッドである。
メソッド名 get_title
...... クラス名:Rental public インスタンスメソッド 型:String->getメソッドである。
お疲れ様でした