X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=Robust%2Fsrc%2FAnalysis%2FDisjoint%2FTaint.java;h=0f47a4de10e27317a5e48c8079a8360bd42b40cb;hb=eb17be02c22191b3fc7bdc335d9434ada68278de;hp=e5ab027ba569fbe044dfaa8ddb6eeabe24b78970;hpb=0eb7c59b31dc23f54c4c9288ecb721603b67d952;p=IRC.git diff --git a/Robust/src/Analysis/Disjoint/Taint.java b/Robust/src/Analysis/Disjoint/Taint.java index e5ab027b..0f47a4de 100644 --- a/Robust/src/Analysis/Disjoint/Taint.java +++ b/Robust/src/Analysis/Disjoint/Taint.java @@ -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; } }