1 自定义一个ifds分析器
BaseTestAnalyzer.java
package org.jacodb.analysis.library.analyzers;
import org.jacodb.analysis.engine.*;
import org.jacodb.analysis.library.LogUtil;
import org.jacodb.api.analysis.JcApplicationGraph;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
public class BaseTestAnalyzer implements Analyzer {
protected Set<IfdsVertex> verticesWithTraceGraphNeeded = Collections.newSetFromMap(new ConcurrentHashMap<>());
private final int maxPathLength;
private final JcApplicationGraph graph;
public BaseTestAnalyzer(JcApplicationGraph graph, int maxPathLength) {
this.maxPathLength = maxPathLength;
this.graph = graph;
}
@NotNull
@Override
public FlowFunctionsSpace getFlowFunctions() {
return new BaseTestForwardFunctions(graph.getClasspath(),maxPathLength);
}
@NotNull
@Override
public List<AnalysisDependentEvent> handleNewEdge(@NotNull IfdsEdge ifdsEdge) {
LogUtil.showHandleNewEdgeInfo(ifdsEdge);
List<AnalysisDependentEvent> list = new ArrayList();
// AnalysisDependentEvent event = new NewSummaryFact(new SummaryEdgeFact(ifdsEdge));
// list.add(event);
return list;
}
@NotNull
@Override
public List<AnalysisDependentEvent> handleNewCrossUnitCall(@NotNull CrossUnitCallFact crossUnitCallFact) {
LogUtil.showHandleNewCrossUnitCallInfo(crossUnitCallFact);
List<AnalysisDependentEvent> list = new ArrayList<>();
AnalysisDependentEvent event = new NewSummaryFact(new SummaryEdgeFact(new IfdsEdge(crossUnitCallFact.getCalleeVertex(),crossUnitCallFact.getCalleeVertex())));
list.add(event);
return list;
}
@NotNull
@Override
public List<AnalysisDependentEvent> handleIfdsResult(@NotNull IfdsResult ifdsResult) {
LogUtil.showHandleIfdsResultInfo(ifdsResult);
List<AnalysisDependentEvent> list = new ArrayList();;
AnalysisDependentEvent event = new NewSummaryFact(new SummaryEdgeFact(ifdsResult.getPathEdges().get(0)));
list.add(event);
return list;
}
}
BaseTestAnalyzerFactory.java
package org.jacodb.analysis.library.analyzers;
import org.jacodb.analysis.engine.Analyzer;
import org.jacodb.analysis.engine.AnalyzerFactory;
import org.jacodb.api.analysis.JcApplicationGraph;
import org.jetbrains.annotations.NotNull;
public final class BaseTestAnalyzerFactory implements AnalyzerFactory{
private int maxPathLength;
public BaseTestAnalyzerFactory(int maxPathLength){
this.maxPathLength = maxPathLength;
}
@NotNull
@Override
public Analyzer newAnalyzer(@NotNull JcApplicationGraph graph) {
return new BaseTestAnalyzer(graph,maxPathLength);
}
}
BaseTestForwardFunctions.java
package org.jacodb.analysis.library.analyzers;
import org.jacodb.analysis.engine.DomainFact;
import org.jacodb.analysis.engine.FlowFunctionInstance;
import org.jacodb.analysis.engine.FlowFunctionsSpace;
import org.jacodb.analysis.engine.ZEROFact;
import org.jacodb.analysis.library.LogUtil;
import org.jacodb.analysis.library.fact.TestFact;
import org.jacodb.api.JcClasspath;
import org.jacodb.api.JcMethod;
import org.jacodb.api.cfg.JcInst;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class BaseTestForwardFunctions implements FlowFunctionsSpace {
private final int maxPathLength;
private final JcClasspath classpath;
public BaseTestForwardFunctions(JcClasspath cp, int maxPathLength) {
this.classpath = cp;
this.maxPathLength = maxPathLength;
}
@NotNull
@Override
public Collection<DomainFact> obtainPossibleStartFacts(@NotNull JcInst jcInst) {
List <DomainFact> initFacts = List.of(ZEROFact.INSTANCE,new TestFact());
LogUtil.showObtainPossibleStartFactsInfo(jcInst,initFacts);
return initFacts;
}
@NotNull
@Override
public FlowFunctionInstance obtainSequentFlowFunction(@NotNull JcInst current, @NotNull JcInst next) {
return new FlowFunctionInstance() {
@NotNull
@Override
public Collection<DomainFact> compute(@NotNull DomainFact domainFact) {
LogUtil.showObtainSequentFlowFunctionInfo(current,next,domainFact);
if (domainFact.equals(ZEROFact.INSTANCE)) {
return List.of(ZEROFact.INSTANCE);
} else {
return new ArrayList<>();
}
// return new ArrayList<>();
}
};
}
@NotNull
@Override
public FlowFunctionInstance obtainCallToStartFlowFunction(@NotNull JcInst callStatement, @NotNull JcMethod callee) {
return new FlowFunctionInstance() {
@NotNull
@Override
public Collection<DomainFact> compute(@NotNull DomainFact domainFact) {
LogUtil.showObtainCallToStartFlowFunctionInfo(callStatement,callee,domainFact);
return List.of(ZEROFact.INSTANCE);
}
};
}
@NotNull
@Override
public FlowFunctionInstance obtainExitToReturnSiteFlowFunction(
@NotNull JcInst callStatement, @NotNull JcInst returnSite, @NotNull JcInst exitStatement) {
return new FlowFunctionInstance() {
@NotNull
@Override
public Collection<DomainFact> compute(@NotNull DomainFact domainFact) {
LogUtil.showObtainExitToReturnSiteFlowFunctionInfo(callStatement,returnSite,exitStatement,domainFact);
return List.of(ZEROFact.INSTANCE);
}
};
}
@NotNull
@Override
public FlowFunctionInstance obtainCallToReturnFlowFunction(@NotNull JcInst callStatement, @NotNull JcInst returnSite) {
return new FlowFunctionInstance() {
@NotNull
@Override
public Collection<DomainFact> compute(@NotNull DomainFact domainFact) {
LogUtil.showObtainCallToReturnFlowFunctionInfo(callStatement,returnSite,domainFact);
return List.of(ZEROFact.INSTANCE);
}
};
}
}
2 日志输出
日志用markdown编辑器查看。
package org.jacodb.analysis.library;
import org.jacodb.analysis.engine.CrossUnitCallFact;
import org.jacodb.analysis.engine.DomainFact;
import org.jacodb.analysis.engine.IfdsEdge;
import org.jacodb.analysis.engine.IfdsResult;
import org.jacodb.api.JcMethod;
import org.jacodb.api.cfg.JcInst;
import java.io.*;
import java.util.Arrays;
import java.util.List;
public class LogUtil {
private final static boolean ALL_OFF = false;
private final static boolean HANDLE_NEW_EDGE_OFF = ALL_OFF?true:false;
private final static boolean HANDLE_NEW_CROSS_UNIT_CALL_OFF = ALL_OFF?true:false;
private final static boolean HANDLE_IFDS_RESULT_OFF = ALL_OFF?true:false;
private final static boolean OBTAIN_POSSIBLE_START_FACTS_OFF = ALL_OFF?true:false;
private final static boolean OBTAIN_SEQUENT_FLOW_FUNCTION_OFF = ALL_OFF?true:false;
private final static boolean OBTAIN_CALL_TO_START_FLOW_FUNCTION_OFF = ALL_OFF?true:false;
private final static boolean OBTAIN_EXIT_TO_RETURN_SITE_FLOW_FUNCTION_OFF = ALL_OFF?true:false;
private final static boolean OBTAIN_CALL_TO_RETURN_FLOW_FUNCTION_OFF = ALL_OFF?true:false;
private final static String METHOD_NAME_OFF = "";
private static final BufferedWriter outWriter;
static {
try {
FileWriter out = new FileWriter(".\\jacodb-test-log.md");
outWriter = new BufferedWriter(out);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private static void writeLine(String str) {
try {
System.out.println(str);
outWriter.write(str.replace("ZERO fact",StringColor.addColor("ZERO fact","#F639C4"))
.replace("This is test fact",StringColor.addColor("This is test fact","#A493E7")));
outWriter.newLine();
outWriter.flush();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static void showHandleNewEdgeInfo(IfdsEdge ifdsEdge){
if (HANDLE_NEW_EDGE_OFF) {
return;
}
String methodName = ifdsEdge.getV().getMethod().getName();
if (METHOD_NAME_OFF.equals(methodName)){
return;
}
if (methodName.equals("getName")) {
writeLine("------------>**handleNewEdge**<------------"+StringColor.addColor(methodName,"#8396F1"));
} else {
writeLine("------------>**handleNewEdge**<------------"+StringColor.addColor(methodName,"#32CD32"));
}
writeLine("edge:" + ifdsEdge);
writeLine("");
}
public static void showHandleNewCrossUnitCallInfo(CrossUnitCallFact crossUnitCallFact) {
if (HANDLE_NEW_CROSS_UNIT_CALL_OFF) {
return;
}
String methodName = crossUnitCallFact.getMethod().getName();
if (METHOD_NAME_OFF.equals(methodName)){
return;
}
if (methodName.equals("getName")) {
writeLine("------------>**handleNewCrossUnitCall**<------------"+StringColor.addColor(methodName,"#8396F1"));
} else {
writeLine("------------>**handleNewCrossUnitCall**<------------"+StringColor.addColor(methodName,"#32CD32"));
}
writeLine("crossUnitCallFact:" + crossUnitCallFact);
writeLine("");
}
public static void showHandleIfdsResultInfo(IfdsResult ifdsResult) {
if (HANDLE_IFDS_RESULT_OFF) {
return;
}
writeLine(StringColor.addColor("------------>**handleIfdsResult**<------------","#F39B27"));
writeLine(Arrays.toString(ifdsResult.getPathEdges().toArray()));
writeLine("");
}
public static void showObtainPossibleStartFactsInfo(JcInst jcInst,List<DomainFact> initFacts) {
if (OBTAIN_POSSIBLE_START_FACTS_OFF) {
return;
}
String methodName = jcInst.getLocation().getMethod().getName();
if (METHOD_NAME_OFF.equals(methodName)){
return;
}
if (methodName.equals("getName")) {
writeLine("------------>**obtainPossibleStartFacts**<------------"+StringColor.addColor(methodName,"#8396F1"));
} else {
writeLine("------------>**obtainPossibleStartFacts**<------------"+StringColor.addColor(methodName,"#32CD32"));
}
writeLine("initFacts: " + Arrays.toString(initFacts.toArray()));
writeLine("");
}
public static void showObtainSequentFlowFunctionInfo(JcInst current, JcInst next,DomainFact domainFact) {
if (OBTAIN_SEQUENT_FLOW_FUNCTION_OFF) {
return;
}
String methodName = current.getLocation().getMethod().getName();
if (METHOD_NAME_OFF.equals(methodName)){
return;
}
if (methodName.equals("getName")) {
writeLine("------------>**normal**<------------"+StringColor.addColor(methodName,"#8396F1"));
} else {
writeLine("------------>**normal**<------------"+StringColor.addColor(methodName,"#32CD32"));
}
writeLine("current : " + current);
writeLine("next : " + next);
writeLine("domainFact : " + domainFact);
writeLine("");
}
public static void showObtainCallToStartFlowFunctionInfo(JcInst callStatement, JcMethod callee, DomainFact domainFact) {
if (OBTAIN_CALL_TO_START_FLOW_FUNCTION_OFF) {
return;
}
String methodName = callStatement.getLocation().getMethod().getName();
if (METHOD_NAME_OFF.equals(methodName)){
return;
}
if (methodName.equals("getName")) {
writeLine("------------>**call-to-start**<------------"+StringColor.addColor(methodName,"#8396F1"));
} else {
writeLine("------------>**call-to-start**<------------"+StringColor.addColor(methodName,"#32CD32"));
}
writeLine("callStatement: " + callStatement);
writeLine("callee: " + callee);
writeLine("domainFact: " + domainFact);
writeLine("");
}
public static void showObtainExitToReturnSiteFlowFunctionInfo(
JcInst callStatement, JcInst returnSite, JcInst exitStatement, DomainFact domainFact) {
if (OBTAIN_EXIT_TO_RETURN_SITE_FLOW_FUNCTION_OFF) {
return;
}
String methodName = exitStatement.getLocation().getMethod().getName();
if (METHOD_NAME_OFF.equals(methodName)){
return;
}
if (methodName.equals("getName")) {
writeLine("------------>**exit-to-return-site**<------------"+StringColor.addColor(methodName,"#8396F1"));
} else {
writeLine("------------>**exit-to-return-site**<------------"+StringColor.addColor(methodName,"#32CD32"));
}
writeLine("callStatement: " + callStatement);
writeLine("returnSite: " + returnSite);
writeLine("exitStatement: " + exitStatement);
writeLine("domainFact: " + domainFact);
writeLine("");
}
public static void showObtainCallToReturnFlowFunctionInfo(JcInst callStatement, JcInst returnSite, DomainFact domainFact) {
if (OBTAIN_CALL_TO_RETURN_FLOW_FUNCTION_OFF) {
return;
}
String methodName = returnSite.getLocation().getMethod().getName();
if (METHOD_NAME_OFF.equals(methodName)){
return;
}
if (methodName.equals("getName")) {
writeLine("------------>**call-to-return**<------------"+StringColor.addColor(methodName,"#8396F1"));
} else {
writeLine("------------>**call-to-return**<------------"+StringColor.addColor(methodName,"#32CD32"));
}
writeLine("callStatement: " + callStatement);
writeLine("returnSite: " + returnSite);
writeLine("domainFact: " + domainFact);
writeLine("");
}
}
3 被分析代码
public String getName(int orderNum) {
String str = null;
int i = 3;
int j = 4;
str.length();
int k = i + j;
String name = genName(k,str);
name = name + "}";
return name;
}
private String genName(int k,String str) {
str.length();
return "alex" + k;
}
4 日志输出
一个在第一个就killThis is test fact的日志
------------>obtainPossibleStartFacts<------------getName
initFacts: [[ZERO fact], [This is test fact]]
------------>handleNewEdge<------------getName
edge:IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[ZERO fact]), v=IfdsVertex(statement=noop, domainFact=[ZERO fact]))
------------>handleNewEdge<------------getName
edge:IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[This is test fact]), v=IfdsVertex(statement=noop, domainFact=[This is test fact]))
------------>obtainPossibleStartFacts<------------genName
initFacts: [[ZERO fact], [This is test fact]]
------------>handleNewEdge<------------genName
edge:IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[ZERO fact]), v=IfdsVertex(statement=noop, domainFact=[ZERO fact]))
------------>handleNewEdge<------------genName
edge:IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[This is test fact]), v=IfdsVertex(statement=noop, domainFact=[This is test fact]))
------------>normal<------------getName
current : noop
next : %0 = null
domainFact : [ZERO fact]
------------>handleNewEdge<------------getName
edge:IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[ZERO fact]), v=IfdsVertex(statement=%0 = null, domainFact=[ZERO fact]))
------------>normal<------------getName
current : noop
next : %0 = null
domainFact : [This is test fact]
------------>normal<------------genName
current : noop
next : %0 = arg$1.length()
domainFact : [ZERO fact]
------------>handleNewEdge<------------genName
edge:IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[ZERO fact]), v=IfdsVertex(statement=%0 = arg$1.length(), domainFact=[ZERO fact]))
------------>normal<------------genName
current : noop
next : %0 = arg$1.length()
domainFact : [This is test fact]
------------>normal<------------getName
current : %0 = null
next : %1 = 3
domainFact : [ZERO fact]
------------>handleNewEdge<------------getName
edge:IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[ZERO fact]), v=IfdsVertex(statement=%1 = 3, domainFact=[ZERO fact]))
------------>normal<------------genName
current : %0 = arg$1.length()
next : %1 = JcDynamicCallExpr(bsmRef=org.jacodb.impl.cfg.TypedMethodRefImpl@bbe284c6, bsmArgs=["alex"], callSiteMethodName=makeConcatWithConstants, callSiteArgTypes=[org.jacodb.api.PredefinedPrimitive@197ef], callSiteReturnType=org.jacodb.impl.types.JcClassTypeImpl@e7c6d061, callSiteArgs=[arg$0])
domainFact : [ZERO fact]
------------>handleNewEdge<------------genName
edge:IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[ZERO fact]), v=IfdsVertex(statement=%1 = JcDynamicCallExpr(bsmRef=org.jacodb.impl.cfg.TypedMethodRefImpl@bbe284c6, bsmArgs=["alex"], callSiteMethodName=makeConcatWithConstants, callSiteArgTypes=[org.jacodb.api.PredefinedPrimitive@197ef], callSiteReturnType=org.jacodb.impl.types.JcClassTypeImpl@e7c6d061, callSiteArgs=[arg$0]), domainFact=[ZERO fact]))
------------>normal<------------getName
current : %1 = 3
next : %2 = 4
domainFact : [ZERO fact]
------------>handleNewEdge<------------getName
edge:IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[ZERO fact]), v=IfdsVertex(statement=%2 = 4, domainFact=[ZERO fact]))
------------>normal<------------genName
current : %1 = JcDynamicCallExpr(bsmRef=org.jacodb.impl.cfg.TypedMethodRefImpl@bbe284c6, bsmArgs=["alex"], callSiteMethodName=makeConcatWithConstants, callSiteArgTypes=[org.jacodb.api.PredefinedPrimitive@197ef], callSiteReturnType=org.jacodb.impl.types.JcClassTypeImpl@e7c6d061, callSiteArgs=[arg$0])
next : return %1
domainFact : [ZERO fact]
------------>handleNewEdge<------------genName
edge:IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[ZERO fact]), v=IfdsVertex(statement=return %1, domainFact=[ZERO fact]))
------------>normal<------------getName
current : %2 = 4
next : %3 = %0.length()
domainFact : [ZERO fact]
------------>handleNewEdge<------------getName
edge:IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[ZERO fact]), v=IfdsVertex(statement=%3 = %0.length(), domainFact=[ZERO fact]))
------------>normal<------------getName
current : %3 = %0.length()
next : %4 = %1 + %2
domainFact : [ZERO fact]
------------>handleNewEdge<------------getName
edge:IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[ZERO fact]), v=IfdsVertex(statement=%4 = %1 + %2, domainFact=[ZERO fact]))
------------>normal<------------getName
current : %4 = %1 + %2
next : %6 = this.genName(%4, %0)
domainFact : [ZERO fact]
------------>handleNewEdge<------------getName
edge:IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[ZERO fact]), v=IfdsVertex(statement=%6 = this.genName(%4, %0), domainFact=[ZERO fact]))
------------>call-to-return<------------getName
callStatement: %6 = this.genName(%4, %0)
returnSite: %7 = %6
domainFact: [ZERO fact]
------------>handleNewEdge<------------getName
edge:IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[ZERO fact]), v=IfdsVertex(statement=%7 = %6, domainFact=[ZERO fact]))
------------>call-to-start<------------getName
callStatement: %6 = this.genName(%4, %0)
callee: (id:72)org.example.C#genName(int, java.lang.String)
domainFact: [ZERO fact]
------------>exit-to-return-site<------------genName
callStatement: %6 = this.genName(%4, %0)
returnSite: %7 = %6
exitStatement: return %1
domainFact: [ZERO fact]
------------>normal<------------getName
current : %7 = %6
next : %8 = JcDynamicCallExpr(bsmRef=org.jacodb.impl.cfg.TypedMethodRefImpl@bbe284c6, bsmArgs=["}"], callSiteMethodName=makeConcatWithConstants, callSiteArgTypes=[org.jacodb.impl.types.JcClassTypeImpl@e7c6d061], callSiteReturnType=org.jacodb.impl.types.JcClassTypeImpl@e7c6d061, callSiteArgs=[%7])
domainFact : [ZERO fact]
------------>handleNewEdge<------------getName
edge:IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[ZERO fact]), v=IfdsVertex(statement=%8 = JcDynamicCallExpr(bsmRef=org.jacodb.impl.cfg.TypedMethodRefImpl@bbe284c6, bsmArgs=["}"], callSiteMethodName=makeConcatWithConstants, callSiteArgTypes=[org.jacodb.impl.types.JcClassTypeImpl@e7c6d061], callSiteReturnType=org.jacodb.impl.types.JcClassTypeImpl@e7c6d061, callSiteArgs=[%7]), domainFact=[ZERO fact]))
------------>normal<------------getName
current : %8 = JcDynamicCallExpr(bsmRef=org.jacodb.impl.cfg.TypedMethodRefImpl@bbe284c6, bsmArgs=["}"], callSiteMethodName=makeConcatWithConstants, callSiteArgTypes=[org.jacodb.impl.types.JcClassTypeImpl@e7c6d061], callSiteReturnType=org.jacodb.impl.types.JcClassTypeImpl@e7c6d061, callSiteArgs=[%7])
next : %7 = %8
domainFact : [ZERO fact]
------------>handleNewEdge<------------getName
edge:IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[ZERO fact]), v=IfdsVertex(statement=%7 = %8, domainFact=[ZERO fact]))
------------>normal<------------getName
current : %7 = %8
next : return %7
domainFact : [ZERO fact]
------------>handleNewEdge<------------getName
edge:IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[ZERO fact]), v=IfdsVertex(statement=return %7, domainFact=[ZERO fact]))
------------>handleIfdsResult<------------
[IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[ZERO fact]), v=IfdsVertex(statement=return %7, domainFact=[ZERO fact])), IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[ZERO fact]), v=IfdsVertex(statement=%8 = JcDynamicCallExpr(bsmRef=org.jacodb.impl.cfg.TypedMethodRefImpl@bbe284c6, bsmArgs=["}"], callSiteMethodName=makeConcatWithConstants, callSiteArgTypes=[org.jacodb.impl.types.JcClassTypeImpl@e7c6d061], callSiteReturnType=org.jacodb.impl.types.JcClassTypeImpl@e7c6d061, callSiteArgs=[%7]), domainFact=[ZERO fact])), IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[ZERO fact]), v=IfdsVertex(statement=%7 = %8, domainFact=[ZERO fact])), IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[ZERO fact]), v=IfdsVertex(statement=return %1, domainFact=[ZERO fact])), IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[ZERO fact]), v=IfdsVertex(statement=%1 = JcDynamicCallExpr(bsmRef=org.jacodb.impl.cfg.TypedMethodRefImpl@bbe284c6, bsmArgs=["alex"], callSiteMethodName=makeConcatWithConstants, callSiteArgTypes=[org.jacodb.api.PredefinedPrimitive@197ef], callSiteReturnType=org.jacodb.impl.types.JcClassTypeImpl@e7c6d061, callSiteArgs=[arg$0]), domainFact=[ZERO fact])), IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[ZERO fact]), v=IfdsVertex(statement=%0 = arg$1.length(), domainFact=[ZERO fact])), IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[ZERO fact]), v=IfdsVertex(statement=noop, domainFact=[ZERO fact])), IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[ZERO fact]), v=IfdsVertex(statement=%1 = 3, domainFact=[ZERO fact])), IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[ZERO fact]), v=IfdsVertex(statement=%2 = 4, domainFact=[ZERO fact])), IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[ZERO fact]), v=IfdsVertex(statement=noop, domainFact=[ZERO fact])), IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[ZERO fact]), v=IfdsVertex(statement=%0 = null, domainFact=[ZERO fact])), IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[ZERO fact]), v=IfdsVertex(statement=%6 = this.genName(%4, %0), domainFact=[ZERO fact])), IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[ZERO fact]), v=IfdsVertex(statement=%7 = %6, domainFact=[ZERO fact])), IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[ZERO fact]), v=IfdsVertex(statement=%3 = %0.length(), domainFact=[ZERO fact])), IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[ZERO fact]), v=IfdsVertex(statement=%4 = %1 + %2, domainFact=[ZERO fact])), IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[This is test fact]), v=IfdsVertex(statement=noop, domainFact=[This is test fact])), IfdsEdge(u=IfdsVertex(statement=noop, domainFact=[This is test fact]), v=IfdsVertex(statement=noop, domainFact=[This is test fact]))]
一个call-to-start边kill所有fact不进入方法的日志:
修改obtainCallToStartFlowFunction方法,返回空集合。
public FlowFunctionInstance obtainCallToStartFlowFunction(@NotNull JcInst callStatement, @NotNull JcMethod callee) {
return new FlowFunctionInstance() {
@NotNull
@Override
public Collection<DomainFact> compute(@NotNull DomainFact domainFact) {
LogUtil.showObtainCallToStartFlowFunctionInfo(callStatement,callee,domainFact);
// return List.of(ZEROFact.INSTANCE);
return List.of();
}
};
}
日志上上看到的区别是,call-to-start 后面没有退出调用。
改之前日志:
改之后日志: