jaco-ifds熟悉fact传播与api接口处理关系调试代码

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 后面没有退出调用。

改之前日志:

 改之后日志:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值