diff --git a/src/main/java/pascal/taie/analysis/pta/plugin/util/IRModelPlugin.java b/src/main/java/pascal/taie/analysis/pta/plugin/util/IRModelPlugin.java index 136f02c09..e99f63654 100644 --- a/src/main/java/pascal/taie/analysis/pta/plugin/util/IRModelPlugin.java +++ b/src/main/java/pascal/taie/analysis/pta/plugin/util/IRModelPlugin.java @@ -24,6 +24,7 @@ import pascal.taie.analysis.pta.core.cs.element.CSMethod; import pascal.taie.analysis.pta.core.solver.Solver; +import pascal.taie.ir.exp.InvokeInstanceExp; import pascal.taie.ir.stmt.Invoke; import pascal.taie.ir.stmt.Stmt; import pascal.taie.language.classes.JMethod; @@ -130,4 +131,19 @@ public void onNewCSMethod(CSMethod csMethod) { solver.addStmts(csMethod, genStmts); } } + + + @Override + public void onFinish() { + // Constructing an artificial instance invocation registers it in the + // base Var. Remove these solver-local statements after the analysis so + // that a subsequent analysis over the same World does not process them. + method2GenStmts.values().stream() + .flatMap(Collection::stream) + .filter(Invoke.class::isInstance) + .map(Invoke.class::cast) + .filter(invoke -> invoke.getInvokeExp() instanceof InvokeInstanceExp) + .forEach(invoke -> ((InvokeInstanceExp) invoke.getInvokeExp()) + .getBase().removeRelevantStmt(invoke)); + } }