run ooojava and rcrpointer that print out effects and annotate them with the source...
[IRC.git] / Robust / src / Analysis / Disjoint / EffectsAnalysis.java
index bb1331164151c6e445264beeaf860ef365a6c620..90d2b8e342d2ed42cec4465e0597965a70d615ca 100644 (file)
@@ -6,9 +6,11 @@ import java.io.*;
 
 import IR.*;
 import IR.Flat.*;
+import Analysis.Pointer.Edge;
+import Analysis.Pointer.AllocFactory.AllocNode;
 
 /////////////////////////////////////////////
-// 
+//
 //  Effects analysis computes read/write/strong
 //  update and other sorts of effects for the
 //  scope of a method or rblock.  The effects
@@ -35,7 +37,7 @@ public class EffectsAnalysis {
   private Hashtable<FlatSESEEnterNode, Hashtable<Taint, Set<Effect>> > sese2te;
   private Hashtable<FlatNode,          Hashtable<Taint, Set<Effect>> > stallSite2te;
 
-  public static State              state;
+  public static State state;
   public static BuildStateMachines buildStateMachines;
 
 
@@ -48,9 +50,9 @@ public class EffectsAnalysis {
 
 
   public Set<Effect> getEffects(Taint t) {
-    Taint tNoPreds = Canonical.changePredsTo( t,
-                                              ReachGraph.predsEmpty
-                                              );
+    Taint tNoPreds = Canonical.changePredsTo(t,
+                                             ReachGraph.predsEmpty
+                                             );
     return taint2effects.get(tNoPreds);
   }
 
@@ -59,13 +61,12 @@ public class EffectsAnalysis {
   }
 
   protected void add(Taint t, Effect e, FlatNode currentProgramPoint) {
-
-    Taint tNoPreds = Canonical.changePredsTo( t,
-                                              ReachGraph.predsEmpty
-                                              );
+    Taint tNoPreds = Canonical.changePredsTo(t,
+                                             ReachGraph.predsEmpty
+                                             );
 
     if( state.RCR ) {
-      buildStateMachines.addToStateMachine( t, e, currentProgramPoint );
+      buildStateMachines.addToStateMachine(t, e, currentProgramPoint);
     }
 
     // add to the global bag
@@ -80,7 +81,7 @@ public class EffectsAnalysis {
     if( t.getSESE() != null ) {
       FlatSESEEnterNode sese = t.getSESE();
 
-      Hashtable<Taint, Set<Effect>> te = sese2te.get( sese );
+      Hashtable<Taint, Set<Effect>> te = sese2te.get(sese);
       if( te == null ) {
         te = new Hashtable<Taint, Set<Effect>>();
       }
@@ -98,7 +99,7 @@ public class EffectsAnalysis {
       assert t.getStallSite() != null;
       FlatNode stallSite = t.getStallSite();
 
-      Hashtable<Taint, Set<Effect>> te = stallSite2te.get( stallSite );
+      Hashtable<Taint, Set<Effect>> te = stallSite2te.get(stallSite);
       if( te == null ) {
         te = new Hashtable<Taint, Set<Effect>>();
       }
@@ -110,15 +111,15 @@ public class EffectsAnalysis {
       effects.add(e);
       te.put(tNoPreds, effects);
       stallSite2te.put(stallSite, te);
-    }    
+    }
   }
 
 
-  public Hashtable<Taint, Set<Effect>> get( FlatSESEEnterNode sese ) {
+  public Hashtable<Taint, Set<Effect>> get(FlatSESEEnterNode sese) {
     return sese2te.get(sese);
   }
 
-  public Hashtable<Taint, Set<Effect>> get( FlatNode stallSite ) {
+  public Hashtable<Taint, Set<Effect>> get(FlatNode stallSite) {
     return stallSite2te.get(stallSite);
   }
 
@@ -131,19 +132,32 @@ public class EffectsAnalysis {
       return;
     }
 
-    for (Iterator<RefEdge> iterator = vn.iteratorToReferencees(); iterator.hasNext();) {
-      RefEdge   edge          = iterator.next();
-      TaintSet  taintSet      = edge.getTaints();
+    for (Iterator<RefEdge> iterator = vn.iteratorToReferencees(); iterator.hasNext(); ) {
+      RefEdge edge          = iterator.next();
+      TaintSet taintSet      = edge.getTaints();
       AllocSite affectedAlloc = edge.getDst().getAllocSite();
-      Effect    effect        = new Effect(affectedAlloc, Effect.read, fld);
+      Effect    effect        = new Effect(affectedAlloc, Effect.read, fld, currentProgramPoint);
 
-      for (Iterator<Taint> taintSetIter = taintSet.iterator(); taintSetIter.hasNext();) {
-        Taint taint = taintSetIter.next();        
+      for (Iterator<Taint> taintSetIter = taintSet.iterator(); taintSetIter.hasNext(); ) {
+        Taint taint = taintSetIter.next();
         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().getAllocSite();
+      Effect    effect        = new Effect(affectedAlloc, Effect.read, fld, currentProgramPoint);
+
+      if (taintSet!=null)
+        for (Taint taint : taintSet.getTaints()) {
+          add(taint, effect, currentProgramPoint);
+        }
+    }
+  }
+
   public void analyzeFlatSetFieldNode(ReachGraph rg, TempDescriptor lhs, FieldDescriptor fld, FlatNode currentProgramPoint, boolean strongUpdate) {
 
     VariableNode vn = rg.td2vn.get(lhs);
@@ -151,61 +165,75 @@ public class EffectsAnalysis {
       return;
     }
 
-    for (Iterator<RefEdge> iterator = vn.iteratorToReferencees(); iterator.hasNext();) {
-      RefEdge   edge          = iterator.next();
-      TaintSet  taintSet      = edge.getTaints();
+    for (Iterator<RefEdge> iterator = vn.iteratorToReferencees(); iterator.hasNext(); ) {
+      RefEdge edge          = iterator.next();
+      TaintSet taintSet      = edge.getTaints();
       AllocSite affectedAlloc = edge.getDst().getAllocSite();
-      Effect    effect        = new Effect(affectedAlloc, Effect.write, fld);       
+      Effect    effect        = new Effect(affectedAlloc, Effect.write, fld, currentProgramPoint);
       Effect    effectSU      = null;
 
       if (strongUpdate) {
-        effectSU = new Effect(affectedAlloc, Effect.strongupdate, fld);
+        effectSU = new Effect(affectedAlloc, Effect.strongupdate, fld, currentProgramPoint);
       }
 
-      for (Iterator<Taint> taintSetIter = taintSet.iterator(); taintSetIter.hasNext();) {
+      for (Iterator<Taint> taintSetIter = taintSet.iterator(); taintSetIter.hasNext(); ) {
         Taint taint = taintSetIter.next();
-        add( taint, effect, currentProgramPoint );
+        add(taint, effect, currentProgramPoint);
 
         if (strongUpdate) {
-          add( taint, effectSU, currentProgramPoint );
+          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().getAllocSite();
+      Effect effect = new Effect(affectedAlloc, Effect.write, fld, currentProgramPoint);
+      if (taintSet!=null)
+        for (Taint taint : taintSet.getTaints()) {
+          add(taint, effect, currentProgramPoint);
+        }
+    }
+  }
+
+
   public String toString() {
-    return taint2effects.toString();    
+    return taint2effects.toString();
   }
 
-  public void writeEffects( String outfile ) {
+  public void writeEffects(String outfile) {
     try {
       BufferedWriter bw = new BufferedWriter(new FileWriter(outfile));
-      
-      bw.write( "Effects\n---------------\n\n" );
+
+      bw.write("Effects\n---------------\n\n");
 
       Iterator meItr = taint2effects.entrySet().iterator();
       while( meItr.hasNext() ) {
-        Map.Entry   me      = (Map.Entry)   meItr.next();
-        Taint       taint   = (Taint)       me.getKey();
-        Set<Effect> effects = (Set<Effect>) me.getValue();
+        Map.Entry me      = (Map.Entry)meItr.next();
+        Taint taint   = (Taint)       me.getKey();
+        Set<Effect> effects = (Set<Effect>)me.getValue();
 
         Iterator<Effect> eItr = effects.iterator();
         while( eItr.hasNext() ) {
           Effect e = eItr.next();
-            
-          bw.write( taint+"-->"+e+"\n" );          
+
+          bw.write(taint+"-->"+e+"\n");
         }
       }
 
       bw.close();
-    } catch( IOException e ) {}
+    } catch( IOException e ) {
+    }
   }
 
   /*
    * public MethodEffects getMethodEffectsByMethodContext(MethodContext mc){
    * return mapMethodContextToMethodEffects.get(mc); }
-   * 
+   *
    * public void createNewMapping(MethodContext mcNew) { if(!methodeffects)
    * return; if (!mapMethodContextToMethodEffects.containsKey(mcNew)) {
    * MethodEffects meNew = new MethodEffects();
@@ -227,69 +255,69 @@ public class EffectsAnalysis {
    * return; MethodEffects me = mapMethodContextToMethodEffects.get(mc);
    * me.analyzeFlatFieldNode(og, srcDesc, fieldDesc);
    * mapMethodContextToMethodEffects.put(mc, me); }
-   * 
+   *
    * public void analyzeFlatSetFieldNode(MethodContext mc, OwnershipGraph og,
    * TempDescriptor dstDesc, FieldDescriptor fieldDesc) { if(!methodeffects)
    * return; MethodEffects me = mapMethodContextToMethodEffects.get(mc);
    * me.analyzeFlatSetFieldNode(og, dstDesc, fieldDesc);
    * mapMethodContextToMethodEffects.put(mc, me); }
-   * 
+   *
    * public void analyzeFlatSetElementNode(MethodContext mc, OwnershipGraph og,
    * TempDescriptor dstDesc, FieldDescriptor fieldDesc) { if(!methodeffects)
    * return; MethodEffects me = mapMethodContextToMethodEffects.get(mc);
    * me.analyzeFlatSetElementNode(og, dstDesc, fieldDesc);
    * mapMethodContextToMethodEffects.put(mc, me); }
-   * 
+   *
    * public void analyzeFlatElementNode(MethodContext mc, OwnershipGraph og,
    * TempDescriptor dstDesc, FieldDescriptor fieldDesc) { if(!methodeffects)
    * return; MethodEffects me = mapMethodContextToMethodEffects.get(mc);
    * me.analyzeFlatElementNode(og, dstDesc, fieldDesc);
    * mapMethodContextToMethodEffects.put(mc, me); }
-   * 
-   * 
+   *
+   *
    * public void writeMethodEffectsResult() throws IOException {
-   * 
+   *
    * try { BufferedWriter bw = new BufferedWriter(new FileWriter(
    * "MethodEffects_report.txt"));
-   * 
+   *
    * Set<MethodContext> mcSet = mapMethodContextToMethodEffects.keySet();
    * Iterator<MethodContext> mcIter = mcSet.iterator(); while (mcIter.hasNext())
    * { MethodContext mc = mcIter.next(); MethodDescriptor md =
    * (MethodDescriptor) mc.getDescriptor();
-   * 
+   *
    * int startIdx = 0; if (!md.isStatic()) { startIdx = 1; }
-   * 
+   *
    * MethodEffects me = mapMethodContextToMethodEffects.get(mc); EffectsSet
    * effectsSet = me.getEffects();
-   * 
+   *
    * bw.write("Method " + mc + " :\n"); for (int i = startIdx; i <
    * md.numParameters() + startIdx; i++) {
-   * 
+   *
    * String paramName = md.getParamName(i - startIdx);
-   * 
+   *
    * Set<EffectsKey> effectSet = effectsSet.getReadingSet(i); String keyStr =
    * "{"; if (effectSet != null) { Iterator<EffectsKey> effectIter =
    * effectSet.iterator(); while (effectIter.hasNext()) { EffectsKey key =
    * effectIter.next(); keyStr += " " + key; } } keyStr += " }";
    * bw.write("  Paramter " + paramName + " ReadingSet=" + keyStr + "\n");
-   * 
+   *
    * effectSet = effectsSet.getWritingSet(new Integer(i)); keyStr = "{"; if
    * (effectSet != null) { Iterator<EffectsKey> effectIter =
    * effectSet.iterator(); while (effectIter.hasNext()) { EffectsKey key =
    * effectIter.next(); keyStr += " " + key; } }
-   * 
+   *
    * keyStr += " }"; bw.write("  Paramter " + paramName + " WritingngSet=" +
    * keyStr + "\n");
-   * 
+   *
    * } bw.write("\n");
-   * 
+   *
    * }
-   * 
+   *
    * bw.close(); } catch (IOException e) { System.err.println(e); }
-   * 
+   *
    * }
    */
-  
+
   public Hashtable<Taint, Set<Effect>> getAllEffects() {
     return taint2effects;
   }