Fix tabbing.... Please fix your editors so they do tabbing correctly!!! (Spaces...
[IRC.git] / Robust / src / Analysis / Disjoint / Taint.java
index e5ab027ba569fbe044dfaa8ddb6eeabe24b78970..0f47a4de10e27317a5e48c8079a8360bd42b40cb 100644 (file)
@@ -32,7 +32,7 @@ public class Taint extends Canonical {
   // a stall site and live variable or
   // an sese (rblock) and an in-set var
   // only one identifer will be non-null
-  
+
   // identify an sese (rblock) + inset var
   protected FlatSESEEnterNode sese;
 
@@ -42,66 +42,84 @@ public class Taint extends Canonical {
   // either type of taint includes a var
   // and allocation site
   protected TempDescriptor var;
-  protected AllocSite      allocSite;
+  protected Alloc allocSite;
+
+  // taints have a new, possibly null element which is
+  // the FlatNode at which the tainted reference was
+  // defined, which currently supports DFJ but doesn't
+  // hinder other analysis modes
+  protected FlatNode fnDefined;
 
   // existance predicates must be true in a caller
   // context for this taint's effects to transfer from this
   // callee to that context
   protected ExistPredSet preds;
 
-  public static Taint factory( FlatSESEEnterNode sese,
-                               TempDescriptor    insetVar,
-                               AllocSite         as,
-                               ExistPredSet      eps ) {
-    Taint out = new Taint( sese, null, insetVar, as, eps );
-    out = (Taint) Canonical.makeCanonical( out );
+  public Taint reTaint(FlatNode fn) {
+    Taint out=new Taint(sese, stallSite, var, allocSite, fn, preds);
+    out = (Taint) Canonical.makeCanonical(out);
+    return out;
+  }
+
+  public static Taint factory(FlatSESEEnterNode sese,
+                              TempDescriptor insetVar,
+                              Alloc as,
+                              FlatNode whereDefined,
+                              ExistPredSet eps) {
+    Taint out = new Taint(sese, null, insetVar, as, whereDefined, eps);
+    out = (Taint) Canonical.makeCanonical(out);
     return out;
   }
 
-  public static Taint factory( FlatNode       stallSite,
-                               TempDescriptor var,
-                               AllocSite      as,
-                               ExistPredSet   eps ) {
-    Taint out = new Taint( null, stallSite, var, as, eps );
-    out = (Taint) Canonical.makeCanonical( out );
+  public static Taint factory(FlatNode stallSite,
+                              TempDescriptor var,
+                              Alloc as,
+                              FlatNode whereDefined,
+                              ExistPredSet eps) {
+    Taint out = new Taint(null, stallSite, var, as, whereDefined, eps);
+    out = (Taint) Canonical.makeCanonical(out);
     return out;
   }
 
-  public static Taint factory( FlatSESEEnterNode sese,
-                               FlatNode          stallSite,
-                               TempDescriptor    var,
-                               AllocSite         as,
-                               ExistPredSet      eps ) {
-    Taint out = new Taint( sese, stallSite, var, as, eps );
-    out = (Taint) Canonical.makeCanonical( out );
+  public static Taint factory(FlatSESEEnterNode sese,
+                              FlatNode stallSite,
+                              TempDescriptor var,
+                              Alloc as,
+                              FlatNode whereDefined,
+                              ExistPredSet eps) {
+    Taint out = new Taint(sese, stallSite, var, as, whereDefined, eps);
+    out = (Taint) Canonical.makeCanonical(out);
     return out;
   }
 
-  protected Taint( FlatSESEEnterNode sese,
-                   FlatNode          stallSite,
-                   TempDescriptor    v,
-                   AllocSite         as,
-                   ExistPredSet      eps ) {
-    assert 
+  protected Taint(FlatSESEEnterNode sese,
+                  FlatNode stallSite,
+                  TempDescriptor v,
+                  Alloc as,
+                  FlatNode fnDefined,
+                  ExistPredSet eps) {
+    assert
       (sese == null && stallSite != null) ||
-      (sese != null && stallSite == null);
-      
+    (sese != null && stallSite == null);
+
     assert v   != null;
     assert as  != null;
     assert eps != null;
-    
+
     this.sese      = sese;
     this.stallSite = stallSite;
     this.var       = v;
     this.allocSite = as;
+    this.fnDefined = fnDefined;
     this.preds     = eps;
   }
 
-  protected Taint( Taint t ) {
-    this( t.sese, 
-          t.stallSite, 
-          t.var, 
-          t.allocSite, 
+  protected Taint(Taint t) {
+    this( t.sese,
+          t.stallSite,
+          t.var,
+          t.allocSite,
+          t.fnDefined,
           t.preds );
   }
 
@@ -125,24 +143,28 @@ public class Taint extends Canonical {
     return var;
   }
 
-  public AllocSite getAllocSite() {
+  public Alloc getAllocSite() {
     return allocSite;
   }
 
+  public FlatNode getWhereDefined() {
+    return fnDefined;
+  }
+
   public ExistPredSet getPreds() {
     return preds;
   }
 
-  public boolean equalsSpecific( Object o ) {
-    if( !equalsIgnorePreds( o ) ) {
+  public boolean equalsSpecific(Object o) {
+    if( !equalsIgnorePreds(o) ) {
       return false;
     }
-        
+
     Taint t = (Taint) o;
-    return preds.equals( t.preds );
+    return preds.equals(t.preds);
   }
 
-  public boolean equalsIgnorePreds( Object o ) {
+  public boolean equalsIgnorePreds(Object o) {
     if( o == null ) {
       return false;
     }
@@ -155,29 +177,37 @@ public class Taint extends Canonical {
 
     boolean seseEqual;
     if( sese == null ) {
-      seseEqual = (t.sese == null);      
+      seseEqual = (t.sese == null);
     } else {
-      seseEqual = sese.equals( t.sese );
+      seseEqual = sese.equals(t.sese);
     }
 
     boolean stallSiteEqual;
     if( stallSite == null ) {
       stallSiteEqual = (t.stallSite == null);
     } else {
-      stallSiteEqual = stallSite.equals( t.stallSite );
+      stallSiteEqual = stallSite.equals(t.stallSite);
     }
 
-    return 
-      seseEqual                      && 
+    boolean fnDefinedEqual;
+    if( fnDefined == null ) {
+      fnDefinedEqual = (t.fnDefined == null);
+    } else {
+      fnDefinedEqual = fnDefined.equals(t.fnDefined);
+    }
+
+    return
+      seseEqual                      &&
       stallSiteEqual                 &&
-      var      .equals( t.var  )     &&
-      allocSite.equals( t.allocSite );
+      fnDefinedEqual                 &&
+      var.equals(t.var)     &&
+      allocSite.equals(t.allocSite);
   }
 
   public int hashCodeSpecific() {
     int hash = allocSite.hashCode();
     hash = hash ^ var.hashCode();
-  
+
     if( sese != null ) {
       hash = hash ^ sese.hashCode();
     }
@@ -186,6 +216,10 @@ public class Taint extends Canonical {
       hash = hash ^ stallSite.hashCode();
     }
 
+    if( fnDefined != null ) {
+      hash = hash ^ fnDefined.hashCode();
+    }
+
     return hash;
   }
 
@@ -194,20 +228,21 @@ public class Taint extends Canonical {
     String s;
 
     if( isRBlockTaint() ) {
-      if( sese.getIsCallerSESEplaceholder() ) {
-        s = "placeh";
-      } else {
-        s = sese.getPrettyIdentifier();
-      }
-
+      s = sese.getPrettyIdentifier();
     } else {
       s = stallSite.toString();
     }
 
-    return 
+    String f = "";
+    if( fnDefined != null ) {
+      f += ", "+fnDefined;
+    }
+
+    return
       "("+s+
       "-"+var+
       ", "+allocSite.toStringBrief()+
+      f+
       "):"+preds;
   }
 }