import java.util.Map.Entry;
import java.io.*;
-import IR.FieldDescriptor;
-import IR.Flat.FlatCall;
-import IR.Flat.FlatMethod;
-import IR.Flat.FlatNode;
-import IR.Flat.TempDescriptor;
-import IR.Flat.FlatSESEEnterNode;
+import IR.*;
+import IR.Flat.*;
+import Analysis.Pointer.Edge;
/////////////////////////////////////////////
//
// support interprocedural analysis
private Hashtable<Taint, Set<Effect>> taint2effects;
+ // redundant views of the effect set for
+ // efficient retrieval
+ private Hashtable<FlatSESEEnterNode, Hashtable<Taint, Set<Effect>> > sese2te;
+ private Hashtable<FlatNode, Hashtable<Taint, Set<Effect>> > stallSite2te;
+
+ public static State state;
+ public static BuildStateMachines buildStateMachines;
+
+
public EffectsAnalysis() {
taint2effects = new Hashtable<Taint, Set<Effect>>();
+
+ sese2te = new Hashtable<FlatSESEEnterNode, Hashtable<Taint, Set<Effect>> >();
+ stallSite2te = new Hashtable<FlatNode, Hashtable<Taint, Set<Effect>> >();
}
public Iterator iteratorTaintEffectPairs() {
return taint2effects.entrySet().iterator();
}
-
- public Hashtable<Taint, Set<Effect>> getSESEEffects(FlatSESEEnterNode sese){
-
- Hashtable<Taint, Set<Effect>> taint2Effects = new Hashtable<Taint, Set<Effect>>();
- Iterator iter=iteratorTaintEffectPairs();
- while (iter.hasNext()) {
- Entry entry = (Entry) iter.next();
- Taint taint = (Taint) entry.getKey();
- Set<Effect> effects = (Set<Effect>) entry.getValue();
- if (taint.getSESE().equals(sese)) {
- Iterator<Effect> eIter = effects.iterator();
- while (eIter.hasNext()) {
- Effect effect = eIter.next();
- if (taint.getSESE().equals(sese)) {
- Set<Effect> effectSet = taint2Effects.get(taint);
- if (effectSet == null) {
- effectSet = new HashSet<Effect>();
- }
- effectSet.add(effect);
- taint2Effects.put(taint, effectSet);
- }
- }
- }
- }
-
- return taint2Effects;
-
- }
-
- public Hashtable<Taint, Set<Effect>> getStallSiteEffects(FlatNode fn, TempDescriptor td){
-
- Hashtable<Taint, Set<Effect>> taint2Effects = new Hashtable<Taint, Set<Effect>>();
- Iterator iter=iteratorTaintEffectPairs();
- while(iter.hasNext()){
- Entry entry=(Entry)iter.next();
- Taint taint=(Taint)entry.getKey();
- Set<Effect> effects=(Set<Effect>)entry.getValue();
- if(taint.getStallSite().equals(fn)){
- Iterator<Effect> eIter=effects.iterator();
- while (eIter.hasNext()) {
- Effect effect = eIter.next();
- if( taint.getStallSite().equals(fn) && taint.getVar().equals(td) ){
- Set<Effect> effectSet=taint2Effects.get(taint);
- if(effectSet==null){
- effectSet=new HashSet<Effect>();
- }
- effectSet.add(effect);
- taint2Effects.put(taint, effectSet);
- }
- }
- }
- }
- return taint2Effects;
- }
-
- protected void add(Taint t, Effect e) {
- if( t.getSESE() != null &&
- t.getSESE().getIsCallerSESEplaceholder() ) {
- return;
- }
+ protected void add(Taint t, Effect e, FlatNode currentProgramPoint) {
Taint tNoPreds = Canonical.changePredsTo( t,
ReachGraph.predsEmpty
);
+ if( state.RCR ) {
+ buildStateMachines.addToStateMachine( t, e, currentProgramPoint );
+ }
+
+ // add to the global bag
Set<Effect> effectSet = taint2effects.get(tNoPreds);
if (effectSet == null) {
effectSet = new HashSet<Effect>();
}
effectSet.add(e);
taint2effects.put(tNoPreds, effectSet);
+
+ // add to the alternate retrieval bags
+ if( t.getSESE() != null ) {
+ FlatSESEEnterNode sese = t.getSESE();
+
+ Hashtable<Taint, Set<Effect>> te = sese2te.get( sese );
+ if( te == null ) {
+ te = new Hashtable<Taint, Set<Effect>>();
+ }
+
+ Set<Effect> effects = te.get(tNoPreds);
+ if (effects == null) {
+ effects = new HashSet<Effect>();
+ }
+ effects.add(e);
+ te.put(tNoPreds, effects);
+
+ sese2te.put(sese, te);
+
+ } else {
+ assert t.getStallSite() != null;
+ FlatNode stallSite = t.getStallSite();
+
+ Hashtable<Taint, Set<Effect>> te = stallSite2te.get( stallSite );
+ if( te == null ) {
+ te = new Hashtable<Taint, Set<Effect>>();
+ }
+
+ Set<Effect> effects = te.get(tNoPreds);
+ if (effects == null) {
+ effects = new HashSet<Effect>();
+ }
+ effects.add(e);
+ te.put(tNoPreds, effects);
+ stallSite2te.put(stallSite, te);
+ }
+ }
+
+
+ public Hashtable<Taint, Set<Effect>> get( FlatSESEEnterNode sese ) {
+ return sese2te.get(sese);
}
+ public Hashtable<Taint, Set<Effect>> get( FlatNode stallSite ) {
+ return stallSite2te.get(stallSite);
+ }
+
+
- public void analyzeFlatFieldNode(ReachGraph rg, TempDescriptor rhs, FieldDescriptor fld) {
+ public void analyzeFlatFieldNode(ReachGraph rg, TempDescriptor rhs, FieldDescriptor fld, FlatNode currentProgramPoint) {
VariableNode vn = rg.td2vn.get(rhs);
if( vn == null ) {
for (Iterator<Taint> taintSetIter = taintSet.iterator(); taintSetIter.hasNext();) {
Taint taint = taintSetIter.next();
- add(taint, effect);
+ add(taint, effect, currentProgramPoint);
+ }
+ }
+ }
+
+ public void analyzeFlatFieldNode(Set<Edge> sources, FieldDescriptor fld, FlatNode currentProgramPoint) {
+ for (Edge edge:sources) {
+ TaintSet taintSet = edge.getTaints();
+ Alloc affectedAlloc = edge.getDst();
+ Effect effect = new Effect(affectedAlloc, Effect.read, fld);
+
+ for (Iterator<Taint> taintSetIter = taintSet.iterator(); taintSetIter.hasNext();) {
+ Taint taint = taintSetIter.next();
+ add(taint, effect, currentProgramPoint);
}
}
}
- public void analyzeFlatSetFieldNode(ReachGraph rg, TempDescriptor lhs, FieldDescriptor fld, boolean strongUpdate) {
+ public void analyzeFlatSetFieldNode(ReachGraph rg, TempDescriptor lhs, FieldDescriptor fld, FlatNode currentProgramPoint, boolean strongUpdate) {
VariableNode vn = rg.td2vn.get(lhs);
if( vn == null ) {
for (Iterator<Taint> taintSetIter = taintSet.iterator(); taintSetIter.hasNext();) {
Taint taint = taintSetIter.next();
- add( taint, effect );
+ add( taint, effect, currentProgramPoint );
if (strongUpdate) {
- add( taint, effectSU );
+ add( taint, effectSU, currentProgramPoint );
}
}
}
}
+ public void analyzeFlatSetFieldNode(Set<Edge> dstedges, FieldDescriptor fld, FlatNode currentProgramPoint) {
+
+ for (Edge edge:dstedges) {
+ TaintSet taintSet = edge.getTaints();
+ Alloc affectedAlloc = edge.getDst();
+ Effect effect = new Effect(affectedAlloc, Effect.write, fld);
+ for (Iterator<Taint> taintSetIter = taintSet.iterator(); taintSetIter.hasNext();) {
+ Taint taint = taintSetIter.next();
+ add( taint, effect, currentProgramPoint );
+ }
+ }
+ }
+
+
public String toString() {
return taint2effects.toString();
}
*
* }
*/
+
+ public Hashtable<Taint, Set<Effect>> getAllEffects() {
+ return taint2effects;
+ }
}