summaryrefslogtreecommitdiffstats
path: root/org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/PropertySimulator.java
diff options
context:
space:
mode:
authorElliott Baron <ebaron@fedoraproject.org>2009-11-09 21:12:05 -0500
committerElliott Baron <ebaron@fedoraproject.org>2009-11-09 21:12:05 -0500
commit35199099d32443f7e6c35fe93d29442fcea6078a (patch)
treeb1286b49519977b8e9983793c8d5ab990f242789 /org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/PropertySimulator.java
parent4e991b89471d65f4f02e1ad54f2b85759ad80586 (diff)
downloadcodan-35199099d32443f7e6c35fe93d29442fcea6078a.tar.gz
codan-35199099d32443f7e6c35fe93d29442fcea6078a.tar.xz
codan-35199099d32443f7e6c35fe93d29442fcea6078a.zip
Remove truth assignments at merge points, based on dominance in CFG.
* org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/ExecutionState.java: Change to truth assignments map. * org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/SymbolicState.java: Likewise. * org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/PropertySimulator.java: Remove truth assigments in flowMerge(). * org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/TruthAssignment.java: New file. * org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/VariableAssignmentVisitor.java: Store IBlock corresponding to TA.
Diffstat (limited to 'org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/PropertySimulator.java')
-rw-r--r--org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/PropertySimulator.java33
1 files changed, 30 insertions, 3 deletions
diff --git a/org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/PropertySimulator.java b/org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/PropertySimulator.java
index ffd3ada..ba9199f 100644
--- a/org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/PropertySimulator.java
+++ b/org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/PropertySimulator.java
@@ -13,9 +13,11 @@ package org.eclipse.cdt.codan.extension;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
+import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.Set;
+import java.util.Map.Entry;
import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression;
import org.eclipse.cdt.core.dom.ast.IASTExpression;
@@ -122,11 +124,36 @@ public class PropertySimulator {
private Set<SymbolicState> flowMerge(IBlock blk, Set<SymbolicState> ss1,
Set<SymbolicState> ss2) {
Set<SymbolicState> ret = new HashSet<SymbolicState>();
- ret.addAll(ss1);
- ret.addAll(ss2);
+ ret.addAll(filterTruthAssignments(blk, ss1));
+ ret.addAll(filterTruthAssignments(blk, ss2));
return group(ret);
}
+ private Set<SymbolicState> filterTruthAssignments(IBlock blk, Set<SymbolicState> ss) {
+ Set<SymbolicState> ret = new HashSet<SymbolicState>(ss.size());
+ for (SymbolicState s : ss) {
+ SymbolicState copy = s.copy();
+ Set<IVariable> toRemove = new HashSet<IVariable>();
+ Map<IVariable, TruthAssignment> truthAssignments = copy.getExecutionState().getTruthAssignments();
+ for (Entry<IVariable, TruthAssignment> ta : truthAssignments.entrySet()) {
+ // FIXME could be better
+ // Remove truth assignments that were added by a block that doesn't dominate this one
+ List<IBlock> dominators = blk.getDOM();
+ IBlock origin = ta.getValue().getOrigin();
+ if (!dominators.contains(origin)) {
+ // Schedule removal
+ toRemove.add(ta.getKey());
+ }
+ }
+ // Actually remove
+ for (IVariable var : toRemove) {
+ truthAssignments.remove(var);
+ }
+ ret.add(copy);
+ }
+ return ret;
+ }
+
private Set<SymbolicState> flowBranch(IBlock blk, Set<SymbolicState> ss, boolean value) {
Set<SymbolicState> ret = new HashSet<SymbolicState>();
for (SymbolicState s : ss) {
@@ -300,7 +327,7 @@ public class PropertySimulator {
s.setPropertyStates(newStates);
// Modify execution state according to variable assignments
- node.accept(new VariableAssignmentVisitor(s.getExecutionState()));
+ node.accept(new VariableAssignmentVisitor(blk, s.getExecutionState()));
}
return s;
}