diff --git a/src/main/java/it/unipr/checker/JumpSolver.java b/src/main/java/it/unipr/checker/JumpSolver.java index 7662a8e5d..645a17676 100644 --- a/src/main/java/it/unipr/checker/JumpSolver.java +++ b/src/main/java/it/unipr/checker/JumpSolver.java @@ -35,8 +35,8 @@ * filtering all the possible destinations and adding the missing edges. */ public class JumpSolver - implements SemanticCheck>, - MonolithicHeap, EVMAbstractState, TypeEnvironment> { +implements SemanticCheck>, +MonolithicHeap, EVMAbstractState, TypeEnvironment> { /** * The CFG to be analyzed. @@ -100,9 +100,9 @@ public Set getMaybeUnsoundJumps() { @Override public void afterExecution( CheckToolWithAnalysisResults< - SimpleAbstractState>, - MonolithicHeap, - EVMAbstractState, TypeEnvironment> tool) { + SimpleAbstractState>, + MonolithicHeap, + EVMAbstractState, TypeEnvironment> tool) { if (fixpoint) { this.unsoundJumps = new HashSet<>(); @@ -118,7 +118,7 @@ public void afterExecution( EVMAbstractState, TypeEnvironment> result : tool.getResultOf(this.cfgToAnalyze)) { AnalysisState>, - MonolithicHeap, EVMAbstractState, TypeEnvironment> analysisResult = null; + MonolithicHeap, EVMAbstractState, TypeEnvironment> analysisResult = null; try { analysisResult = result.getAnalysisStateBefore(node); @@ -135,10 +135,8 @@ public void afterExecution( // to solve the jump. if (valueState.isBottom()) { this.unreachableJumps.add(node); - continue; } else if (valueState.isTop()) { this.maybeUnsoundJumps.add(node); - continue; } else { for (KIntegerSet topStack : valueState.getTop()) if (topStack.isBottom()) @@ -179,9 +177,9 @@ else if (topStack.isTop()) @Override public boolean visit( CheckToolWithAnalysisResults< - SimpleAbstractState>, - MonolithicHeap, - EVMAbstractState, TypeEnvironment> tool, + SimpleAbstractState>, + MonolithicHeap, + EVMAbstractState, TypeEnvironment> tool, CFG graph, Statement node) { this.cfgToAnalyze = (EVMCFG) graph; @@ -203,7 +201,7 @@ else if (cfgToAnalyze.getAllPushedJumps().contains(node)) EVMAbstractState, TypeEnvironment> result : tool.getResultOf(this.cfgToAnalyze)) { AnalysisState>, - MonolithicHeap, EVMAbstractState, TypeEnvironment> analysisResult = null; + MonolithicHeap, EVMAbstractState, TypeEnvironment> analysisResult = null; try { analysisResult = result.getAnalysisStateBefore(node); @@ -235,22 +233,24 @@ else if (cfgToAnalyze.getAllPushedJumps().contains(node)) } Set filteredDests = this.jumpDestinations.stream() - .filter(t -> t.getLocation() instanceof ProgramCounterLocation) - .filter(pc -> topStack - .contains(new Number(((ProgramCounterLocation) pc.getLocation()).getPc()))) - .collect(Collectors.toSet()); + .filter(pc -> topStack.contains(new Number(((ProgramCounterLocation) pc.getLocation()).getPc()))) + .collect(Collectors.toSet()); // For each JUMPDEST, add the missing edge from this node to // the JUMPDEST. - for (Statement jmp : filteredDests) { - if (node instanceof Jump) { // JUMP - if (!this.cfgToAnalyze.containsEdge(new SequentialEdge(node, jmp))) { - this.cfgToAnalyze.addEdge(new SequentialEdge(node, jmp)); + if (node instanceof Jump) { // JUMP + for (Statement jmp : filteredDests) { + SequentialEdge edge = new SequentialEdge(node, jmp); + if (!this.cfgToAnalyze.containsEdge(edge)) { + this.cfgToAnalyze.addEdge(edge); fixpoint = false; } - } else { // JUMPI - if (!this.cfgToAnalyze.containsEdge(new TrueEdge(node, jmp))) { - this.cfgToAnalyze.addEdge(new TrueEdge(node, jmp)); + } + } else { // JUMPI + for (Statement jmp : filteredDests) { + TrueEdge edge = new TrueEdge(node, jmp); + if (!this.cfgToAnalyze.containsEdge(edge)) { + this.cfgToAnalyze.addEdge(edge); fixpoint = false; } }