「パターンマッチングのための
データフローグラフ抽出器の実装」
新山 祐介
2017/08/28 ミーティング資料

研究の背景

Research Question

a = 100;
b = 2;
c = a + b;
d = a * c;
...

例. 1

if (c == 1) {
    b = b - 100;
    a1 = a1 + 1;
} else if (c == 2) {
    b = b - 300;
    a2 = a2 + 1;
} else
...

例. 1

if (choice == 1) {
    money = money - 100;
    item1 = item1 + 1;
} else if (choice == 2) {
    money = money - 300;
    item2 = item2 + 1;
} else
...

例. 2

if (x) {
    y = y - 1;
}
if (y == 0) {
    g();
}
...

例. 2

if (hit) {
    life = life - 1;
}
if (life == 0) {
    gameover();
}
...

基本的なアイデア

パターンマッチング

現在までの進捗

  1. トップ 1000 (★) の Java プロジェクトを取得。
    (11GB zipped text)
  2. JDT で構文解析。
    (480,627 files. 74,088,883 loc.)
  3. データフローグラフを蓄積。
    (4,199,301 functions, 42,133,919 nodes)
  4. パターンマッチングを実装。

データフローグラフの実装

純粋な関数の場合

副作用がある関数の場合

グラフの構築方法

条件分岐の表現

ループの表現

break/continue/returnの表現

try ... catch の表現 (未完)

パターンマッチングの実装

部分木のインデックス構築

クローン検出としての使用例

10000グラフ × 4117786グラフに対してマッチング:

一致ノード数見つかったペアの数
100個以上〜65
50個以上〜100
40個以上〜437
30個以上〜2,858
20個以上〜20,211
10131,320
9237,161
8528,531
7897,196
Total2,113,970

クローン検出: 所見

  1. 一致するノード数が増えると (> 10)、同一のコードが多く見つかる。
  2. 一致したノードの数によって、コードの「類似度」のようなものが測定できる。
  3. データフロー中のノードは必ずしも直感的な構文要素に対応していないため、 結果の中には一見して対応がわかりにくいものもある。
  4. 一致する個数が多かったノードには、case文の連続しているものが多かった。

関連研究