锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. jaco-ifds熟悉fact传播与api接口处理关系调试代码

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

0
  • 软件开发
  • 发布于 2024-09-20
  • 0 次阅读
黄健
黄健

1 自定义一个ifds分析器

BaseTestAnalyzer.java
```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
```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方法,返回空集合。
```java
    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 后面没有退出调用。

改之前日志:

改之后日志:


原文链接: https://blog.csdn.net/javajingling/article/details/135159542

标签: #软件开发 1171
相关文章

万字:支付“核心系统”详解 2024-11-02 15:33

专栏作者:隐墨星辰 \| 主编:陈天宇宙 这篇文章也尝试化繁为简,探寻支付系统的本质,讲清楚在线支付系统最核心的一些概念和设计理念。 虽然支付行业已经过了风头最劲的时光,但跨境支付仍然在蓬勃发展,每年依然有很多新人进入这个行业,这篇文章尝试为这些刚入行的新人提供一点帮助。 文章只介绍一些支付行业十几

资深支付架构师视角:实战从问题定义到代码落地的完整套路 2024-11-02 15:33

前言 今天从一个实际案例入手,介绍站在架构师的角度,如何识别并定义问题,提炼需求,技术方案选型,再到详细设计,最后利用AI的能力协助写出核心的代码,验证与调优。 解决问题存在一定的模式,也可以称之为框架,总结出自己的思考和解题框架,以后再碰到同类型的问题就可以如庖丁解牛一样容易。 很多年前,我写代码

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

设计模式第16讲——迭代器模式(Iterator) 2024-10-08 11:24

一、什么是迭代器模式 迭代器模式是一种行为型设计模式,它提供了一种统一的方式来访问集合对象中的元素,而不是暴露集合内部的表示方式。简单地说,就是将遍历集合的责任封装到一个单独的对象中,我们可以按照特定的方式访问集合中的元素。 二、角色组成 抽象迭代器(Iterator):定义了遍历聚合对象所需的方法

vue2路由和vue3路由区别及原理 2024-10-08 11:24

一、Vue2 与 Vue3 路由的区别 1. 创建路由实例方式的不同 Vue 2 中,通过 Vue.use() 注册路由插件,并通过 new VueRouter() 来创建路由实例。 import Vue from 'vue';import VueRouter from 'vue-router';i

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.