350 likes | 443 Views
J AVA バイトコードにおける データ依存解析手法の提案と実装. 誉田 謙二 † 大畑 文明 † 井上 克郎 † ‡ † 大阪大学 大学院基礎工学研究科 ‡ 奈良先端科学技術大学院大学 情報科学研究科. 発表内容. 背景 J AVA バイトコードにおけるデータ依存 データ依存解析手法の提案 提案手法の実現 まとめと今後の課題. 背景(1/2). プログラム文間の依存関係 制御依存関係 条件節~述部(述部の実行が条件節に依存) データ依存関係 同一変数の定義~参照(データフローによる依存) 依存関係解析の利用 プログラム理解 プログラムデバッグ
E N D
JAVAバイトコードにおけるデータ依存解析手法の提案と実装JAVAバイトコードにおけるデータ依存解析手法の提案と実装 誉田 謙二† 大畑 文明† 井上 克郎†‡ †大阪大学 大学院基礎工学研究科 ‡奈良先端科学技術大学院大学 情報科学研究科
発表内容 • 背景 • JAVAバイトコードにおけるデータ依存 • データ依存解析手法の提案 • 提案手法の実現 • まとめと今後の課題 ソフトウェア科学会全国大会
背景(1/2) • プログラム文間の依存関係 • 制御依存関係 • 条件節~述部(述部の実行が条件節に依存) • データ依存関係 • 同一変数の定義~参照(データフローによる依存) • 依存関係解析の利用 • プログラム理解 • プログラムデバッグ • プログラム保守 a:=5; b:=3; if b>0 then c:=a else d:=b; ソフトウェア科学会全国大会
背景(2/2) • 既に提案されている依存関係解析手法 • 高級言語(C, C++, etc…)のソースコード • 3番地コード を対象 • JAVAバイトコードのような、スタックの存在が前提となる言語に対するデータ依存解析手法は提案されていない ソフトウェア科学会全国大会
JAVAバイトコードにおけるデータ依存 • クラスファイル • JAVAバイトコード • JAVAバイトコードにおけるデータ依存関係 • ローカル変数に関するデータ依存 • フィールドに関するデータ依存 • スタックに関するデータ依存 ソフトウェア科学会全国大会
class A class A JAVAコンパイラ class B class B クラスファイル • ソースプログラムはJAVAコンパイラにより、クラスファイルに変換される • クラスファイル • クラス単位に生成 • JAVAバイトコードによる命令列などにより構成 ソフトウェア科学会全国大会
JAVAバイトコード • クラスファイルを構成する命令列 • JAVAバーチャルマシン(JVM)への入力 • 約200種類の命令で構成される ソフトウェア科学会全国大会
0 23 1 23 4 スタック ローカル変数 0 1 23 27 スタック ローカル変数 JAVAバイトコードの実行例 0 iconst_4 1 23 4 スタック ローカル変数 iload_1 iadd ソフトウェア科学会全国大会
JAVAバイトコードにおけるデータ依存関係 • データの格納 • ローカル変数 / フィールド • スタック • ある値に対応する記憶領域が命令により変化する(push / pop演算の存在) • iconst_n • iload_n • iadd etc… • 命令に応じてその位置を追跡する必要がある ソフトウェア科学会全国大会
0 1 スタックに関するデータ依存 • スタック上のある値v が参照されるとき、v を定義した命令s から参照する命令t にスタックに関するデータ依存関係が存在する s : iconst_v , t : istore_1 iconst_v v ローカル変数 スタック istore_1 ソフトウェア科学会全国大会
0 1 スタックに関するデータ依存 • スタック上のある値v が参照されるとき、v を定義した命令s から参照する命令t にスタックに関するデータ依存関係が存在する s : iconst_v , t : istore_1 iconst_v v ローカル変数 スタック istore_1 ソフトウェア科学会全国大会
スタックに関するデータ依存 • スタック上のある値v が参照されるとき、v を定義した命令s から参照する命令t にスタックに関するデータ依存関係が存在する s : iconst_v , t : istore_1 iconst_v 0 1 v ローカル変数 スタック istore_1 ソフトウェア科学会全国大会
ローカル変数に関するデータ依存 • あるローカル変数x の値v が参照されるとき、v を定義した命令s から参照する命令t にx に関するデータ依存関係が存在する x : 1, s : istore_1, t : iload_1 v 0 istore_1 1 v スタック ローカル変数 0 v iload_1 1 v スタック ローカル変数 ソフトウェア科学会全国大会
v x v フィールドに関するデータ依存 • あるフィールドx の値v が参照されるとき、v を定義した命令s から参照する命令t にx に関するデータ依存関係が存在する s : putfield Point/x I, t : getfield Point/x I putfield Point/x I x v フィールド スタック v getfield Point/x I フィールド スタック ソフトウェア科学会全国大会
データ依存解析手法の提案 • 前提 • 解析アルゴリズム • 制御フローグラフの構築 • データ依存関係の抽出 • 解析フレームの準備 • データ依存関係の抽出 ソフトウェア科学会全国大会
前提 • 提案するアルゴリズム • 静的解析(存在しうるすべての経路に対して解析) • 単一スレッドを対象 • 入力: JAVAバイトコード • 出力: データ依存関係を表すグラフ • 節点: JAVAバイトコードの命令 • 辺: 命令間に起こりうる制御の移動、 命令間に存在するデータ依存関係 ソフトウェア科学会全国大会
解析アルゴリズム Step1:制御フローグラフの構築 • 制御フローグラフ (Control Flow Graph,CFG) • 節点:JAVAバイトコードの命令 • 辺:命令間に起こりうる制御の移動 iload_0 iconst_3 if_icmplt L3 L3 iconst_4 iconst_3 goto L5 L5 istore_0 iload_0 ireturn ソフトウェア科学会全国大会
解析アルゴリズム Step1:制御フローグラフの構築 • 制御フローグラフ (Control Flow Graph,CFG) • 節点:JAVAバイトコードの命令 • 辺:命令間に起こりうる制御の移動 iload_0 iconst_3 if_icmplt L3 L3 iconst_4 iconst_3 goto L5 L5 istore_0 Step2:データ依存関係の抽出 • CFGにデータ依存辺を追加 iload_0 ireturn ソフトウェア科学会全国大会
iload_0 iconst_3 if_icmplt L3 L3 iconst_4 iconst_3 goto L5 L5 istore_0 iload_0 ireturn Step1: 制御フローグラフの構築 Phase1: 命令を抽出し、CFG節点を作成 Phase2: 各命令sについて • 命令sの次に実行される可能性のある命令tを求める • s~t間にCFG辺を引く ソフトウェア科学会全国大会
Step2:データ依存関係の抽出 (1/3) Phase1:解析フレームの準備 • 解析フレーム • メソッド内で各ローカル変数・フィー ルド・スタック上の値がどの命令で 定義されたかを保持 • 変数名とその値を最後に定義した 命令の番号の対の集合 ソフトウェア科学会全国大会
Step2:データ依存関係の抽出 (2/3) • 各メソッドの処理に必要なスタックサイズ・ローカル変数の個数はコンパイラにより計算される • 解析フレームの例 ソフトウェア科学会全国大会
Step2:データ依存関係の抽出 (3/3) Phase2: データ依存関係の抽出 • CFG辺をたどりながら、各節点を解析 • 各節点が表す命令に応じて、解析フレームを更新 • 逐次実行 • 分岐 • データ依存関係が抽出された場合、CFGにデータ依存辺を追加 • 更新された解析フレームを用い、この節点を始点とするすべてのCFG辺をたどり次の節点に移動し、解析を続ける ソフトウェア科学会全国大会
逐次実行 • 解析フレームの更新 / データ依存辺の追加 1: iconst_3 3 ローカル変数 スタック 2: istore_1 ソフトウェア科学会全国大会
逐次実行 • 解析フレームの更新 / データ依存辺の追加 1: iconst_3 3 ローカル変数 スタック 2: istore_1 ソフトウェア科学会全国大会
逐次実行 • 解析フレームの更新 / データ依存辺の追加 1: iconst_3 3 ローカル変数 スタック 2: istore_1 ソフトウェア科学会全国大会
逐次実行 • 解析フレームの更新 / データ依存辺の追加 1: iconst_3 ローカル変数 スタック 2: istore_1 ソフトウェア科学会全国大会
逐次実行 • 解析フレームの更新 / データ依存辺の追加 1: iconst_3 ローカル変数 スタック 2: istore_1 ソフトウェア科学会全国大会
分岐 • 解析フレームの更新 / データ依存辺の追加 5: iconst_3 6: iload_0 ローカル変数 スタック 7: if_icmplt L4 ソフトウェア科学会全国大会
分岐 • 解析フレームの更新 / データ依存辺の追加 5: iconst_3 6: iload_0 ローカル変数 スタック 7: if_icmplt L4 ソフトウェア科学会全国大会
分岐 • 解析フレームの更新 / データ依存辺の追加 • 解析フレームの複製 5: iconst_3 6: iload_0 ローカル変数 スタック 7: if_icmplt L4 ソフトウェア科学会全国大会
繰り返し(1/2) • 繰り返しの存在による解析のループ • CFGにループが存在する場合、解析がループに陥る • 等価な解析が無限に繰り返され、 解析が終了しない 等価な解析 ⇔ 等価な解析フレームによる解析 L1 iconst_2 goto L1 iload_0 istore_0 if_icmplt L3 ineg L3 iload_0 iload_0 iconst_3 iadd ireturn ソフトウェア科学会全国大会
繰り返し(2/2) • 等価な解析フレームによる解析を回避 • CFGの合流節点に、処理開始時の解析フレームの履歴を保持させる • 等価な解析フレームが既に履歴に含まれている場合、解析を停止する iload_0 ・・・ ソフトウェア科学会全国大会
提案手法の実現 (1/2) • JAVAバイトコードをJasmin形式に変換し、解析 • 構文解析、CFG構築、データ依存関係解析 データ依存解析ツール JAVAバイトコード データ依存辺を 追加したCFG CFG 1000 101101 0010111 1011110 1101001 構文解析、 CFG構築 データ依存 関係解析 Jasmin Translator JAVAバイトコード (Jasmin形式) ソフトウェア科学会全国大会
提案手法の実現 (2/2) L3 iconst_2 L3 L5 iconst_2 iload_0 if_icmple L5 iload_0 ineg istore_0 goto L3 iload_0 ireturn goto L3 データ依存 解析ツール iload_0 istore_0 if_icmplt L5 ineg L5 iload_0 iload_0 ireturn ローカル変数に関するデータ依存辺 スタックに関するデータ依存辺 制御依存辺 ソフトウェア科学会全国大会
まとめと今後の課題 • まとめ • 本研究では、JAVAバイトコードに対するデータ依存関係を定義し、その抽出手法を提案した • また、提案手法を採用したツールの試作を行い、その動作を確認した • 今後の課題 • スレッドへの対応 • 解析の効率化 • JAVAバイトコードに対するプログラムスライスの抽出 ソフトウェア科学会全国大会