フローグラフ抽出器
FGyama のご紹介
新山 祐介
2018年12月19日
https://euske.github.io/

1. はじめに

動機

なぜデータフローが重要か?

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;
}

副作用がある場合

a = a + b;
x = b * c;
y = c;

条件分岐

if (x) {
    y = 1;
} else {
    y = 2;
}

繰り返し

do {
    S;  // x を変更
} while (p);

脱出・例外

do {
    S;  // a を変更。
    if (t) { break; }
} while (...);

現在の欠点: 間接参照

a[0] = 4;
a[1] = 5;
b[2] = a[0] + a[1];
ARR = 4;
ARR = 5;
ARR = ARR + ARR;

3. FGyama の現在の実装

実行方法

$ java Java2DF Class1.java Class2.java ... > out.xml
$ python graph2gv.py out.xml > out.gv

現在の状況