Patch in effects analysis hooks....have to add new accessor methods...add interface...
[IRC.git] / Robust / src / Analysis / Disjoint / EffectsAnalysis.java
index 52244a537e9b04b8a986852719509e5718023803..07abff412bdf388b351eb5f63bcaa11fb554b475 100644 (file)
@@ -4,12 +4,9 @@ import java.util.*;
 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;
 
 /////////////////////////////////////////////
 // 
@@ -34,8 +31,20 @@ public class EffectsAnalysis {
   // 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>> >();
   }
 
 
@@ -49,82 +58,74 @@ public class EffectsAnalysis {
   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 ) {
@@ -139,12 +140,25 @@ public class EffectsAnalysis {
 
       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 ) {
@@ -164,16 +178,30 @@ public class EffectsAnalysis {
 
       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();    
   }
@@ -289,4 +317,8 @@ public class EffectsAnalysis {
    * 
    * }
    */
+  
+  public Hashtable<Taint, Set<Effect>> getAllEffects() {
+    return taint2effects;
+  }
 }