// 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;
// 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 );
}
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;
}
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();
}
hash = hash ^ stallSite.hashCode();
}
+ if( fnDefined != null ) {
+ hash = hash ^ fnDefined.hashCode();
+ }
+
return hash;
}
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;
}
}