研究進捗報告:
"データパスを用いた
機能的クローンの発見" (仮題)
新山 祐介
2019年2月5日
https://euske.github.io/

一枚だけで概要説明

機能的クローンとは何か?

比喩による例 (1)

問. つぎの資格を埋めなさい。

  1. おにぎりを買いにコンビニへ出かけた」
  2. 洗剤  を買いにコンビニへ出かけた」

比喩による例 (2)

問. つぎの資格を埋めなさい。

  1. 「腹がへったのでおにぎりを買いにコンビニへ出かけた」
  2. 「腹がへったのでラーメンを買いにコンビニへ出かけた」

比喩による例 (3)

問. つぎの資格を埋めなさい。

  1. 「腹がへったので赤いきつねを買いにコンビニへ出かけたが、 ポットのお湯がなかった」
  2. 「腹がへったのでどん兵衛 を買いにコンビニへ出かけたが、 ポットのお湯がなかった」

観察: 文脈が長くなるほど、単語の意味は類似してくる。

比喩による例 (4)

  1. 「売れ残った大量の zxmqtg を家畜のエサにした」
  2. 「売れ残った大量の pfkrjw を家畜のエサにした」

単語が何を指しているかは不明でも、 似たようなものだろうということは推測できる。

基本的なアイデア

メソッドの使われ方 = データパス

データパスの例

問. 以下の例で fp.readLine() の返り値は 2回利用される。どのように利用されているか?

private BufferedReader fp;

public String get() {
    String s = null;
    s = fp.readLine();
    int i = s.indexOf(' ');
    return s.substring(0, i);
}

グラフ化するとこうなる:

get() cluster_a N1 fp N2 readLine() N1->N2 #this N4 indexOf() N2->N4 #this N6 substring() N2->N6 #this N3 ' ' N3->N4 #arg0 N4->N6 #arg1 N5 0 N5->N6 #arg0 N7 return N6->N7

Interprocedural 化する

private BufferedReader fp;

public String get() {
    String s = null;
    s = fp.readLine();
    int i = s.indexOf(' ');
    return s.substring(0, i);
}

void show() {
    String x = get();
    System.out.println(x+"!!");
}

グラフ化するとこうなる:

A cluster_a get() cluster_b show() N1 fp N2 readLine() N1->N2 #this N4 indexOf() N2->N4 #this N6 substring() N2->N6 #this N3 ' ' N3->N4 #arg0 N4->N6 #arg1 N5 0 N5->N6 #arg0 N9 get() N6->N9 N11 + N9->N11 L N8 System.out N12 println() N8->N12 #this N10 !! N10->N11 R N11->N12 #arg0

データパスを収集する

ソースコード解析のいいところ

メソッドをクラスタリングする

評価実験

機能的クローンの評価基準

比較実験 (予定)

実験対象

以下のソースコードからデータパスを抽出した:

プロジェクトSLOCメソッドノード
xz-1.86,86474754,170
jhotdraw-5.314,6112,26966,508
antlr4-4.7.231,1222,20678,362
jedit-5.3.2116,416--
tomcat-8.5.33235,00921,9541,443,730

このほかの予定検体: ant, junit, weka, javaassist, pmd

これまでの結果

結果が悪い原因

将来の計画

すぐやること