From 20c73a2b0a15616f3e09d3e23ae00276fccc6cfc Mon Sep 17 00:00:00 2001 From: jjenista Date: Thu, 27 May 2010 19:11:38 +0000 Subject: [PATCH] porting effects analysis --- Robust/src/Analysis/Disjoint/Canonical.java | 55 +++++++++++++++++++ Robust/src/Analysis/Disjoint/CanonicalOp.java | 2 + Robust/src/Analysis/Disjoint/ReachGraph.java | 42 +++++++++++++- Robust/src/Analysis/Disjoint/RefEdge.java | 8 +++ Robust/src/Tests/disjoint/simple/test.java | 2 +- 5 files changed, 105 insertions(+), 4 deletions(-) diff --git a/Robust/src/Analysis/Disjoint/Canonical.java b/Robust/src/Analysis/Disjoint/Canonical.java index ffc68f2b..12f1ea88 100644 --- a/Robust/src/Analysis/Disjoint/Canonical.java +++ b/Robust/src/Analysis/Disjoint/Canonical.java @@ -1371,4 +1371,59 @@ abstract public class Canonical { return out; } + + public static TaintSet add( TaintSet ts, + Taint t ) { + assert ts != null; + assert t != null; + assert ts.isCanonical(); + assert t.isCanonical(); + + CanonicalOp op = + new CanonicalOp( CanonicalOp.TAINTSET_ADD_TAINT, + ts, + t ); + + Canonical result = op2result.get( op ); + if( result != null ) { + return (TaintSet) result; + } + + // otherwise, no cached result... + TaintSet out = new TaintSet(); + out.taints.addAll( ts.taints ); + out.taints.add( t ); + + out = (TaintSet) makeCanonical( out ); + op2result.put( op, out ); + return out; + } + + public static TaintSet union( TaintSet ts1, + TaintSet ts2 ) { + assert ts1 != null; + assert ts2 != null; + assert ts1.isCanonical(); + assert ts2.isCanonical(); + + CanonicalOp op = + new CanonicalOp( CanonicalOp.TAINTSET_UNION_TAINTSET, + ts1, + ts2 ); + + Canonical result = op2result.get( op ); + if( result != null ) { + return (TaintSet) result; + } + + // otherwise, no cached result... + TaintSet out = new TaintSet(); + out.taints.addAll( ts1.taints ); + out.taints.addAll( ts2.taints ); + + out = (TaintSet) makeCanonical( out ); + op2result.put( op, out ); + return out; + } + } diff --git a/Robust/src/Analysis/Disjoint/CanonicalOp.java b/Robust/src/Analysis/Disjoint/CanonicalOp.java index 59b72f0d..c32390cd 100644 --- a/Robust/src/Analysis/Disjoint/CanonicalOp.java +++ b/Robust/src/Analysis/Disjoint/CanonicalOp.java @@ -34,6 +34,8 @@ public class CanonicalOp { public static final int REACHSTATE_UNSHADOW_ALLOCSITE = 0x08ef; public static final int REACHSTATE_MAKEPREDSTRUE = 0x0b9c; public static final int REACHSET_MAKEPREDSTRUE = 0xdead; + public static final int TAINTSET_ADD_TAINT = 0xcd17; + public static final int TAINTSET_UNION_TAINTSET = 0xa835; protected int opCode; diff --git a/Robust/src/Analysis/Disjoint/ReachGraph.java b/Robust/src/Analysis/Disjoint/ReachGraph.java index 7fbab6f0..f8c62b2b 100644 --- a/Robust/src/Analysis/Disjoint/ReachGraph.java +++ b/Robust/src/Analysis/Disjoint/ReachGraph.java @@ -225,6 +225,15 @@ public class ReachGraph { referencer.removeReferencee( edge ); referencee.removeReferencer( edge ); + + // TODO + +// int oldTaint=edge.getTaintIdentifier(); +// if(referencer instanceof HeapRegionNode){ +// depropagateTaintIdentifier((HeapRegionNode)referencer,oldTaint,new HashSet()); +// } + + } protected void clearRefEdgesFrom( RefSrcNode referencer, @@ -1643,6 +1652,12 @@ public class ReachGraph { ExistPredSet preds = ExistPredSet.factory( pred ); + Taint paramTaint = + Taint.factory( index, paramCallee.toString() ); + + TaintSet paramTaints = + TaintSet.factory( paramTaint ); + RefEdge reCallee = new RefEdge( vnCallee, hrnDstCallee, @@ -1653,7 +1668,8 @@ public class ReachGraph { oocHrnIdOoc2callee ), preds, - null, null + paramTaints, + null ); rg.addRefEdge( vnCallee, @@ -3492,14 +3508,24 @@ public class ReachGraph { assert edgeToMerge != null; edgeToMerge.setBeta( Canonical.unionORpreds( edgeToMerge.getBeta(), - edgeA.getBeta() - ) + edgeA.getBeta() + ) ); edgeToMerge.setPreds( Canonical.join( edgeToMerge.getPreds(), edgeA.getPreds() ) ); + edgeToMerge.setParamTaints( + Canonical.union( edgeToMerge.getParamTaints(), + edgeA.getParamTaints() + ) + ); + edgeToMerge.setRblockTaints( + Canonical.union( edgeToMerge.getRblockTaints(), + edgeA.getRblockTaints() + ) + ); } } } @@ -3563,6 +3589,16 @@ public class ReachGraph { edgeA.getPreds() ) ); + edgeToMerge.setParamTaints( + Canonical.union( edgeToMerge.getParamTaints(), + edgeA.getParamTaints() + ) + ); + edgeToMerge.setRblockTaints( + Canonical.union( edgeToMerge.getRblockTaints(), + edgeA.getRblockTaints() + ) + ); } } } diff --git a/Robust/src/Analysis/Disjoint/RefEdge.java b/Robust/src/Analysis/Disjoint/RefEdge.java index 54f6f5ab..92a8fbb7 100644 --- a/Robust/src/Analysis/Disjoint/RefEdge.java +++ b/Robust/src/Analysis/Disjoint/RefEdge.java @@ -261,10 +261,18 @@ public class RefEdge { return paramTaints; } + public void setParamTaints( TaintSet taints ) { + this.paramTaints = taints; + } + public TaintSet getRblockTaints() { return rblockTaints; } + public void setRblockTaints( TaintSet taints ) { + this.rblockTaints = taints; + } + public String toStringDOT( boolean hideReach, diff --git a/Robust/src/Tests/disjoint/simple/test.java b/Robust/src/Tests/disjoint/simple/test.java index a9ced8b4..aec52ac3 100644 --- a/Robust/src/Tests/disjoint/simple/test.java +++ b/Robust/src/Tests/disjoint/simple/test.java @@ -12,7 +12,7 @@ public class Test { static public void f0( Foo a, Foo b ) { a.f = b; - f1( b ); + //f1( b ); } static public void f1( Foo c ) { -- 2.34.1