porting effects analysis
authorjjenista <jjenista>
Thu, 27 May 2010 19:11:38 +0000 (19:11 +0000)
committerjjenista <jjenista>
Thu, 27 May 2010 19:11:38 +0000 (19:11 +0000)
Robust/src/Analysis/Disjoint/Canonical.java
Robust/src/Analysis/Disjoint/CanonicalOp.java
Robust/src/Analysis/Disjoint/ReachGraph.java
Robust/src/Analysis/Disjoint/RefEdge.java
Robust/src/Tests/disjoint/simple/test.java

index ffc68f2bac9996f3867930250ed77b5c65f1d52c..12f1ea88219853cf895540f88c032f243572fe46 100644 (file)
@@ -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;    
+  }
+
 }
index 59b72f0d720231aa695dd5dc082ee0f452924901..c32390cd073dde82572f8ebb1d32e9cc7e93a528 100644 (file)
@@ -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;
index 7fbab6f03a919b7eb910d166bc48fadb98ceebf8..f8c62b2baae46316ea26300034aa1d6b387f621e 100644 (file)
@@ -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<HeapRegionNode>());
+//    }
+
+
   }
 
   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()
+                                                       )
+                                      );
        }
       }
     }
index 54f6f5ab6b1e3fd651b9cefbb81acb0fa97c5a92..92a8fbb7d1010031b7733dad841de14a785fa4ac 100644 (file)
@@ -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,
index a9ced8b4b04652498c56c44cce74f61c1fc11919..aec52ac36f8c48ef428889a3e9878de002014683 100644 (file)
@@ -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 ) {