2. FGyama の特徴
- 制御フローおよびデータフローを同時に表現。
- 各変数を個別に扱う。
- データ間の依存関係を重視する。
例
int max(int[] a) {
int y = -1;
for (int x : a) {
if (y < x) { y = x; }
}
return y;
}
従来のデータフローグラフ
欠けているもの:
int max(int[] a) {
int y = -1;
for (int x : a) {
if (y < x) { y = x; }
}
return y;
}
3. FGyama の構造
基本的な関数
int f(a, b, c) {
return (-a) +
(a + b) * c;
}
- 各変数・演算子は独立したノードで表される。
- 終端 (
return
) はひとつ。
- 変数名は途中のノードには現れない。
副作用がある場合
a = a + b;
x = b * c;
y = c;
- 複数の並列な終端をもつ。
- 完全な実行順序は記録されない。
条件分岐
if (x) {
y = 1;
} else {
y = 2;
}
- 2つのグラフを重ね合わせる。
- Selectノードが cond の値に応じて
いずれかのパスを選択する。
- 同様の構造が変数の数だけ作成される。
脱出・例外
do {
S;
if (t) { break; }
} while (...);
- ループ内から直接ループ外へ向かう
エッジを作成する。
- 条件つき脱出の場合は Select ノードを使う。
- 同様の構造が変数の数だけ作成される。
現在の欠点: 間接参照
a[0] = 4;
a[1] = 5;
b[2] = a[0] + a[1];
ARR = 4;
ARR = 5;
ARR = ARR + ARR;
- データ間の依存関係が実際以上に増える。
- 依存関係の見落し (false negative) がない側に倒している。
- 計画: 自明なケースに対しては points-to解析を使う。
実行方法
$ java Java2DF Class1.java Class2.java ... > out.xml
$ python graph2gv.py out.xml > out.gv
- グラフは各メソッドごとに出力される。
- Interproceduralな解析は別個 Python スクリプトで行う。