From 7a8dfd9bfe7cc6290c4ad1a2b67ef4254f28d610 Mon Sep 17 00:00:00 2001 From: jjenista Date: Mon, 28 Jun 2010 19:09:49 +0000 Subject: [PATCH] stall site taints propagate awesomely, get cleared off also --- Robust/src/Analysis/Disjoint/Canonical.java | 32 +++++++++++++++++++ Robust/src/Analysis/Disjoint/CanonicalOp.java | 1 + .../Analysis/Disjoint/DisjointAnalysis.java | 11 +++++++ Robust/src/Analysis/Disjoint/ReachGraph.java | 21 ++++++++++-- .../src/Tests/disjoint/taintTest1/test.java | 16 +++++++--- 5 files changed, 75 insertions(+), 6 deletions(-) diff --git a/Robust/src/Analysis/Disjoint/Canonical.java b/Robust/src/Analysis/Disjoint/Canonical.java index dd97fd48..ff47436f 100644 --- a/Robust/src/Analysis/Disjoint/Canonical.java +++ b/Robust/src/Analysis/Disjoint/Canonical.java @@ -1442,6 +1442,38 @@ abstract public class Canonical { return out; } + public static TaintSet removeStallSiteTaints( TaintSet ts ) { + assert ts != null; + assert ts.isCanonical(); + + CanonicalOp op = + new CanonicalOp( CanonicalOp.TAINTSET_REMOVESTALLSITETAINTS, + ts, + ts ); + + Canonical result = op2result.get( op ); + if( result != null ) { + return (TaintSet) result; + } + + // otherwise, no cached result... + TaintSet out = new TaintSet(); + + Iterator tItr = ts.iterator(); + while( tItr.hasNext() ) { + Taint t = tItr.next(); + + // only take non-stall site taints onward + if( t.getStallSite() == null ) { + out.taints.add( t ); + } + } + + out = (TaintSet) makeCanonical( out ); + op2result.put( op, out ); + return out; + } + public static Taint changePredsTo( Taint t, ExistPredSet preds ) { diff --git a/Robust/src/Analysis/Disjoint/CanonicalOp.java b/Robust/src/Analysis/Disjoint/CanonicalOp.java index 2a3c812d..7de780c6 100644 --- a/Robust/src/Analysis/Disjoint/CanonicalOp.java +++ b/Robust/src/Analysis/Disjoint/CanonicalOp.java @@ -40,6 +40,7 @@ public class CanonicalOp { public static final int TAINTSET_UNIONORPREDS_TAINTSET = 0x204f; public static final int TAINT_CHANGEPREDSTO_EXISTPREDSET = 0x3ab4; public static final int TAINTSET_CHANGEPREDSTO_EXISTPREDSET = 0x2ff1; + public static final int TAINTSET_REMOVESTALLSITETAINTS = 0xb69c; protected int opCode; protected Canonical operand1; diff --git a/Robust/src/Analysis/Disjoint/DisjointAnalysis.java b/Robust/src/Analysis/Disjoint/DisjointAnalysis.java index a9e61789..e43a3930 100644 --- a/Robust/src/Analysis/Disjoint/DisjointAnalysis.java +++ b/Robust/src/Analysis/Disjoint/DisjointAnalysis.java @@ -1276,6 +1276,11 @@ public class DisjointAnalysis { case FKind.FlatSESEEnterNode: if( doEffectsAnalysis && fmContaining != fmAnalysisEntry ) { + + // always remove ALL stall site taints at enter + rg.removeAllStallSiteTaints(); + + // inject taints for in-set vars FlatSESEEnterNode sese = (FlatSESEEnterNode) fn; rg.taintInSetVars( sese ); } @@ -1283,8 +1288,14 @@ public class DisjointAnalysis { case FKind.FlatSESEExitNode: if( doEffectsAnalysis && fmContaining != fmAnalysisEntry ) { + + // always remove ALL stall site taints at exit + rg.removeAllStallSiteTaints(); + + // remove in-set vars for the exiting rblock FlatSESEExitNode fsexn = (FlatSESEExitNode) fn; rg.removeInContextTaints( fsexn.getFlatEnter() ); + // sese exit clears all mappings of accessible vars and stall sites // need to wipe out stall site taints rg.clearAccessibleVarSet(); diff --git a/Robust/src/Analysis/Disjoint/ReachGraph.java b/Robust/src/Analysis/Disjoint/ReachGraph.java index 824e6b3f..f458b38c 100644 --- a/Robust/src/Analysis/Disjoint/ReachGraph.java +++ b/Robust/src/Analysis/Disjoint/ReachGraph.java @@ -1302,8 +1302,6 @@ public class ReachGraph { public void taintStallSite( FlatNode stallSite, TempDescriptor var ) { - System.out.println( "Tainting stall site: "+stallSite+" and "+var ); - // stall site taint should propagate back into callers // so give it TRUE predicates taintTemp( null, @@ -1362,6 +1360,25 @@ public class ReachGraph { } } + public void removeAllStallSiteTaints() { + + Iterator meItr = id2hrn.entrySet().iterator(); + while( meItr.hasNext() ) { + Map.Entry me = (Map.Entry) meItr.next(); + Integer id = (Integer) me.getKey(); + HeapRegionNode hrn = (HeapRegionNode) me.getValue(); + + Iterator reItr = hrn.iteratorToReferencers(); + while( reItr.hasNext() ) { + RefEdge re = reItr.next(); + + re.setTaints( Canonical.removeStallSiteTaints( re.getTaints() + ) + ); + } + } + } + // used in makeCalleeView below to decide if there is // already an appropriate out-of-context edge in a callee diff --git a/Robust/src/Tests/disjoint/taintTest1/test.java b/Robust/src/Tests/disjoint/taintTest1/test.java index 7c02d6b9..86b90c30 100644 --- a/Robust/src/Tests/disjoint/taintTest1/test.java +++ b/Robust/src/Tests/disjoint/taintTest1/test.java @@ -19,7 +19,13 @@ public class Test { Foo x = a.f; - x.g = new Foo(); + doSomething( a, b ); + + //rblock c2 { + // b.f = new Foo(); + //} + + //x.g = new Foo(); } @@ -30,10 +36,12 @@ public class Test { Foo x = b; a.g = x; - a.f = new Foo(); - b.f = new Foo(); + rblock j { + a.f = new Foo(); + b.f = new Foo(); + } - Foo f = doStuff( a.f, b.f ); + //Foo f = doStuff( a.f, b.f ); } static Foo doStuff( Foo m, Foo n ) { -- 2.34.1