1. あらまし
プログラム理解のためのグラフ表現 "FGyama" を提案。
- データフローグラフの一種。
- ロジックの比較・解析に使える。
- 大量に蓄積し、検索が可能。
2. 研究の目標
プログラム中の変数に与えられる高水準な (ドメイン依存の)
意味を自動抽出したい。
a = p * 1.08;
...
b = 99;
...
c = x + w/2;
- 意味 = まともなプログラマが
与えるであろう名前
現在の欠点: 間接参照
a[0] = 4;
a[1] = 5;
b[2] = a[0] + a[1];
ARR = 4;
ARR = 5;
ARR = ARR + ARR;
- データ間の依存関係が実際以上に増える。
- 依存関係の見落し (false negative) がない側に倒している。
- 計画: 自明なケースに対しては points-to解析を使う。
見つかったイテレータの例:
TextUtils.java:
47: int start = 0;
48: do {
49: int next = query.indexOf('&', start);
50: int end = (next == -1) ? query.length() : next;
...
65: start = end + 1;
66: } while (start < query.length());
ACache.java:
728: String saveTimeStr = strs[0];
729: while (saveTimeStr.startsWith("0")) {
730: saveTimeStr = saveTimeStr
731: .substring(1, saveTimeStr.length());
732: }
得られた非クローンの例 (1):
同一ロジックを実装している例:
public static <T> List<T> reverse_foreach(List<T> list) {
List<T> reversed = new ArrayList<>();
for (int i = list.size() - 1; i >= 0; i--) {
reversed.add(list.get(i));
}
return reversed;
}
public static <V> List<V> invertList(List<V> sourceList) {
List<V> invertList = new ArrayList<V>(sourceList.size());
for (int i = sourceList.size() - 1; i >= 0; i--) {
invertList.add(sourceList.get(i));
}
return invertList;
}
得られた非クローンの例 (2):
同一ロジックだが意味が異なる例:
boolean isSet(int id) {
int bit = 1 << id;
return (set & bit) != 0;
}
public boolean isPointerDown(int pointerId) {
return (mPointersDown & 1 << pointerId) != 0;
}
6. おわりに
プログラム理解のためのグラフ表現 "FGyama" を提案した。