TraceJSON#findAllStartAlias(MethodExecution)の処理内で,
メソッド呼び出しのステートメントの場合に生成するエイリアスについて, 戻り値がまだ記録されていない場合には,
その戻り値に関するエイリアスは生成しないように修正.

その他, 一部の確認用のprint文をコメントアウトor削除.
1 parent e1e7167 commit 9b1728d74a2a6d8a32fdfcb7e1cbe45405ef3eb3
r-isitani authored on 19 Aug 2018
Showing 1 changed file
View
19
org.ntlab.traceCollector/src/org/ntlab/traceCollector/tracer/trace/TraceJSON.java
List<ObjectReference> args = calledMe.getArguments();
for (int j = 0; j < args.size(); j++) {
startAliasList.add(new Alias(args.get(j).getId(), tp, (j + Alias.OCCURRENCE_EXP_FIRST_ARG)));
}
startAliasList.add(new Alias(calledMe.getReturnValue().getId(), tp, Alias.OCCURRENCE_EXP_RETURN));
ObjectReference returnValue = calledMe.getReturnValue();
if (returnValue != null) {
startAliasList.add(new Alias(returnValue.getId(), tp, Alias.OCCURRENCE_EXP_RETURN));
}
}
}
return startAliasList;
}
// aliasList.add(alias);
String objId = startAlias.getObjectId();
TracePoint tp = startAlias.getOccurrencePoint().duplicate();
ArrayList<ArrayList<Alias>> resultLists = getObjectFlow(aliasLists, objId, tp, 0);
for (int i = 0; i < resultLists.size(); i++) {
ArrayList<Alias> resultList = resultLists.get(i);
System.out.println("---------------------------------------------------------"); // 確認用
for (Alias alias : resultList) System.out.println(alias); // 確認用
// for (int i = 0; i < resultLists.size(); i++) {
// ArrayList<Alias> resultList = resultLists.get(i);
// System.out.println("---------------------------------------------------------"); // 確認用
// for (Alias alias : resultList) System.out.println(alias); // 確認用
// int lastAliasOccurrenceEXP = resultList.get(resultList.size() - 1).getOccurrenceExp();
// if (lastAliasOccurrenceEXP != Alias.OCCURRENCE_EXP_RETURN) {
// resultLists.remove(resultList); // 末尾のエイリアスが配列生成やコンストラクタ呼び出しではないリストを削除する
// }
}
// }
return resultLists;
}
 
private static ArrayList<ArrayList<Alias>> getObjectFlow(ArrayList<ArrayList<Alias>> aliasLists,
if (returnValue.getId().equals(objId)) {
// 戻り値にエイリアスのオブジェクトIDが一致した場合
aliasList.add(new Alias(objId, tp.duplicate(), Alias.OCCURRENCE_EXP_RETURN));
if (calledMethodExecution.isConstructor()) {
System.out.println("return (Constructor)");
return aliasLists; // コンストラクタ呼び出し箇所はエイリアスの起源なのでそれ以前にはもうないはず
}
TracePoint exitTp = calledMethodExecution.getExitPoint(); // 呼び出しメソッド実行の最終ステートメントを指すtpを取得
aliasLists = getObjectFlow(aliasLists, objId, exitTp, side + 1); // 呼び出し先のメソッド実行に潜る