Do effects as a global space, don't even need to consider call site transform, taints...
authorjjenista <jjenista>
Sat, 26 Jun 2010 21:36:37 +0000 (21:36 +0000)
committerjjenista <jjenista>
Sat, 26 Jun 2010 21:36:37 +0000 (21:36 +0000)
Robust/src/Analysis/Disjoint/DisjointAnalysis.java
Robust/src/Analysis/Disjoint/EffectSet.java [deleted file]
Robust/src/Analysis/Disjoint/EffectsAnalysis.java
Robust/src/Analysis/Disjoint/ReachGraph.java
Robust/src/Tests/disjoint/taintTest1/makefile

index 21c80a58d4b28eb540e3cf6372ed4c638622fb21..5f02861f7665e42fe96906db619930edfe21d426 100644 (file)
@@ -674,7 +674,7 @@ public class DisjointAnalysis {
     }
 
     if( doEffectsAnalysis ) {
-      effectsAnalysis.writeEffectsPerMethodAndRBlock( "effects.txt" );
+      effectsAnalysis.writeEffects( "effects.txt" );
     }
   }
 
@@ -1087,12 +1087,7 @@ public class DisjointAnalysis {
        rg.assignTempXEqualToTempYFieldF( lhs, rhs, fld );
 
         if( doEffectsAnalysis && fmContaining != fmAnalysisEntry ) {
-          FlatSESEEnterNode seseContaining = 
-            rblockRel.getRBlockStacks( fmContaining, fn ).peek();
-          
-          effectsAnalysis.analyzeFlatFieldNode( fmContaining,
-                                                seseContaining,
-                                                rg, rhs, fld );          
+          effectsAnalysis.analyzeFlatFieldNode( rg, rhs, fld );          
         }
       }          
       break;
@@ -1107,12 +1102,7 @@ public class DisjointAnalysis {
         boolean strongUpdate = rg.assignTempXFieldFEqualToTempY( lhs, fld, rhs );
 
         if( doEffectsAnalysis && fmContaining != fmAnalysisEntry ) {
-          FlatSESEEnterNode seseContaining = 
-            rblockRel.getRBlockStacks( fmContaining, fn ).peek();
-
-          effectsAnalysis.analyzeFlatSetFieldNode( fmContaining, 
-                                                   seseContaining,
-                                                   rg, lhs, fld, strongUpdate );
+          effectsAnalysis.analyzeFlatSetFieldNode( rg, lhs, fld, strongUpdate );
         }
       }           
       break;
@@ -1132,12 +1122,7 @@ public class DisjointAnalysis {
        rg.assignTempXEqualToTempYFieldF( lhs, rhs, fdElement );
         
         if( doEffectsAnalysis && fmContaining != fmAnalysisEntry ) {
-          FlatSESEEnterNode seseContaining = 
-            rblockRel.getRBlockStacks( fmContaining, fn ).peek();
-          
-          effectsAnalysis.analyzeFlatFieldNode( fmContaining,
-                                                seseContaining,
-                                                rg, rhs, fdElement );          
+          effectsAnalysis.analyzeFlatFieldNode( rg, rhs, fdElement );          
         }
       }
       break;
@@ -1163,12 +1148,7 @@ public class DisjointAnalysis {
        rg.assignTempXFieldFEqualToTempY( lhs, fdElement, rhs );
 
         if( doEffectsAnalysis && fmContaining != fmAnalysisEntry ) {
-          FlatSESEEnterNode seseContaining = 
-            rblockRel.getRBlockStacks( fmContaining, fn ).peek();
-          
-          effectsAnalysis.analyzeFlatSetFieldNode( fmContaining, 
-                                                   seseContaining,
-                                                   rg, lhs, fdElement,
+          effectsAnalysis.analyzeFlatSetFieldNode( rg, lhs, fdElement,
                                                    false );
         }
       }
@@ -1339,32 +1319,13 @@ public class DisjointAnalysis {
 
 
         } else {
-          // calculate the method call transform
-          
-          Hashtable<Taint, TaintSet> tCallee2tsCaller = null;
-
-          if( doEffectsAnalysis && fmContaining != fmAnalysisEntry ) {
-            tCallee2tsCaller = new Hashtable<Taint, TaintSet>();
-          }        
-
+          // calculate the method call transform         
           rgCopy.resolveMethodCall( fc, 
                                     fmPossible, 
                                     rgEffect,
                                     callerNodeIDsCopiedToCallee,
-                                    tCallee2tsCaller,
                                     writeDebugDOTs
                                     );
-
-          if( doEffectsAnalysis && fmContaining != fmAnalysisEntry ) {
-            
-            FlatSESEEnterNode seseContaining = 
-              rblockRel.getRBlockStacks( fmContaining, fn ).peek();
-            
-            effectsAnalysis.analyzeFlatCall( fmContaining,
-                                             seseContaining,
-                                             fmPossible, 
-                                             tCallee2tsCaller );
-          }        
         }
         
         rgMergeOfEffects.merge( rgCopy );        
diff --git a/Robust/src/Analysis/Disjoint/EffectSet.java b/Robust/src/Analysis/Disjoint/EffectSet.java
deleted file mode 100644 (file)
index 12d1208..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-package Analysis.Disjoint;
-
-import java.util.HashSet;
-import java.util.Hashtable;
-import java.util.Set;
-import java.util.Iterator;
-import IR.Flat.TempDescriptor;
-
-public class EffectSet {
-
-  private Hashtable<Taint, HashSet<Effect>> taint2effects;
-
-  public EffectSet() {
-    taint2effects = new Hashtable<Taint, HashSet<Effect>>();
-  }
-
-  public void addEffect(Taint t, Effect e) {
-    HashSet<Effect> effectSet = taint2effects.get(t);
-    if (effectSet == null) {
-      effectSet = new HashSet<Effect>();
-    }
-    effectSet.add(e);
-    taint2effects.put(t, effectSet);
-  }
-
-  public Set<Effect> getEffects(Taint t) {
-    return taint2effects.get(t);
-  }
-
-  public Iterator getAllEffectPairs() {
-    return taint2effects.entrySet().iterator();
-  }
-
-  public String toString() {
-    return taint2effects.toString();    
-  }
-}
index cf9eaf385485b1d86092c48c2407f7da852cd986..9603b22e0f19742ad0ba17b71c9e63d55480c4a1 100644 (file)
@@ -27,164 +27,117 @@ import IR.Flat.FlatSESEEnterNode;
 
 public class EffectsAnalysis {
 
-  private Hashtable<FlatMethod,        EffectSet> fm2effectSet;
-  private Hashtable<FlatSESEEnterNode, EffectSet> sese2effectSet;
+  // the effects analysis should combine taints
+  // that match except for predicates--preds just
+  // support interprocedural analysis
+  private Hashtable<Taint, Set<Effect>> taint2effects;
 
   public EffectsAnalysis() {
-    fm2effectSet   = new Hashtable<FlatMethod,        EffectSet>();
-    sese2effectSet = new Hashtable<FlatSESEEnterNode, EffectSet>();
+    taint2effects = new Hashtable<Taint, Set<Effect>>();
   }
 
-  public void analyzeFlatFieldNode(FlatMethod fmContaining, 
-                                   FlatSESEEnterNode seseContaining,
-                                   ReachGraph rg, TempDescriptor rhs, FieldDescriptor fld) {
 
-    VariableNode vn = rg.td2vn.get(rhs);
-    if( vn == null ) {
+  public Set<Effect> getEffects(Taint t) {
+    Taint tNoPreds = Canonical.changePredsTo( t,
+                                              ReachGraph.predsEmpty
+                                              );
+    return taint2effects.get(tNoPreds);
+  }
+
+  public Iterator iteratorTaintEffectPairs() {
+    return taint2effects.entrySet().iterator();
+  }
+
+
+  protected void add(Taint t, Effect e) {
+    if( t.getSESE().getIsCallerSESEplaceholder() ) {
       return;
     }
 
-    for (Iterator<RefEdge> iterator = vn.iteratorToReferencees(); iterator.hasNext();) {
-      RefEdge edge = iterator.next();
-      TaintSet taintSet = edge.getTaints();
-      AllocSite affectedAlloc = edge.getDst().getAllocSite();
-      for (Iterator<Taint> taintSetIter = taintSet.iterator(); taintSetIter.hasNext();) {
-        Taint taint = taintSetIter.next();
-
-        EffectSet effectSet = fm2effectSet.get(fmContaining);
-        if (effectSet == null) {
-          effectSet = new EffectSet();
-        }
-        
-        Effect effect = new Effect(affectedAlloc, Effect.read, fld);
+    Taint tNoPreds = Canonical.changePredsTo( t,
+                                              ReachGraph.predsEmpty
+                                              );
 
-        add( fmContaining,   taint, effect );
-        add( seseContaining, taint, effect );        
-      }
+    Set<Effect> effectSet = taint2effects.get(tNoPreds);
+    if (effectSet == null) {
+      effectSet = new HashSet<Effect>();
     }
+    effectSet.add(e);
+    taint2effects.put(tNoPreds, effectSet);
   }
 
-  public void analyzeFlatSetFieldNode(FlatMethod fmContaining,
-                                      FlatSESEEnterNode seseContaining,
-                                      ReachGraph rg, TempDescriptor lhs, FieldDescriptor fld, boolean strongUpdate) {
 
-    VariableNode vn = rg.td2vn.get(lhs);
+  public void analyzeFlatFieldNode(ReachGraph rg, TempDescriptor rhs, FieldDescriptor fld) {
+
+    VariableNode vn = rg.td2vn.get(rhs);
     if( vn == null ) {
       return;
     }
 
     for (Iterator<RefEdge> iterator = vn.iteratorToReferencees(); iterator.hasNext();) {
-      RefEdge edge = iterator.next();
-      TaintSet taintSet = edge.getTaints();
+      RefEdge   edge          = iterator.next();
+      TaintSet  taintSet      = edge.getTaints();
       AllocSite affectedAlloc = edge.getDst().getAllocSite();
+      Effect    effect        = new Effect(affectedAlloc, Effect.read, fld);
+
       for (Iterator<Taint> taintSetIter = taintSet.iterator(); taintSetIter.hasNext();) {
-        Taint taint = taintSetIter.next();
-        
-        Effect effect = new Effect(affectedAlloc, Effect.write, fld);       
-        add( fmContaining,   taint, effect );       
-        add( seseContaining, taint, effect );
-        
-        if (strongUpdate) {
-          Effect effectSU = new Effect(affectedAlloc, Effect.strongupdate, fld);          
-          add( fmContaining,   taint, effect );          
-          add( seseContaining, taint, effect );
-        }
+        Taint taint = taintSetIter.next();        
+        add(taint, effect);
       }
     }
   }
 
-  public void analyzeFlatCall(FlatMethod fmContaining, FlatSESEEnterNode seseContaining, 
-                              FlatMethod fmCallee, Hashtable<Taint, TaintSet> tCallee2tsCaller) {
-        
-    EffectSet esCallee = getEffectSet(fmCallee);
-    if( esCallee == null ) {
-      esCallee = new EffectSet();
-    }
+  public void analyzeFlatSetFieldNode(ReachGraph rg, TempDescriptor lhs, FieldDescriptor fld, boolean strongUpdate) {
 
-    Iterator meItr = esCallee.getAllEffectPairs();
-    while( meItr.hasNext() ) {
-      Map.Entry       me      = (Map.Entry)       meItr.next();
-      Taint           tCallee = (Taint)           me.getKey();
-      HashSet<Effect> effects = (HashSet<Effect>) me.getValue();
+    VariableNode vn = rg.td2vn.get(lhs);
+    if( vn == null ) {
+      return;
+    }
 
-      if( tCallee2tsCaller.containsKey( tCallee ) ) {
+    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    effectSU      = null;
 
-        Iterator<Taint> tItr = tCallee2tsCaller.get( tCallee ).iterator();
-        while( tItr.hasNext() ) {
-          Taint tCaller = tItr.next();
-          
-          EffectSet esCaller = new EffectSet();
+      if (strongUpdate) {
+        effectSU = new Effect(affectedAlloc, Effect.strongupdate, fld);
+      }
 
-          Iterator<Effect> eItr = effects.iterator();
-          while( eItr.hasNext() ) {
-            Effect e = eItr.next();
-            
-            esCaller.addEffect( tCaller, e );
-          }
+      for (Iterator<Taint> taintSetIter = taintSet.iterator(); taintSetIter.hasNext();) {
+        Taint taint = taintSetIter.next();
+        add( taint, effect );
 
-          add( fmContaining,   tCaller, esCaller );
-          add( seseContaining, tCaller, esCaller );    
+        if (strongUpdate) {
+          add( taint, effectSU );
         }
       }
     }
   }
 
-  public EffectSet getEffectSet(FlatMethod fm) {
-    return fm2effectSet.get(fm);
+
+  public String toString() {
+    return taint2effects.toString();    
   }
 
-  public void writeEffectsPerMethodAndRBlock( String outfile ) {
+  public void writeEffects( String outfile ) {
     try {
       BufferedWriter bw = new BufferedWriter(new FileWriter(outfile));
       
-      bw.write( "Effects Per Method\n\n" );
-
-      Iterator meItr1 = fm2effectSet.entrySet().iterator();
-      while( meItr1.hasNext() ) {
-        Map.Entry  me1 = (Map.Entry)  meItr1.next();
-        FlatMethod fm  = (FlatMethod) me1.getKey();
-        EffectSet  es  = (EffectSet)  me1.getValue();
-
-        bw.write( "\n"+fm+"\n--------------\n" );
-
-        Iterator meItr2 = es.getAllEffectPairs();
-        while( meItr2.hasNext() ) {
-          Map.Entry       me2     = (Map.Entry)       meItr2.next();
-          Taint           taint   = (Taint)           me2.getKey();
-          HashSet<Effect> effects = (HashSet<Effect>) me2.getValue();
-
-          Iterator<Effect> eItr = effects.iterator();
-          while( eItr.hasNext() ) {
-            Effect e = eItr.next();
-            
-            bw.write( "  "+taint+"-->"+e+"\n" );
-          }
-        }
-      }
-
-      
-      bw.write( "\n\nEffects Per RBlock\n\n" );
+      bw.write( "Effects\n---------------\n\n" );
 
-      meItr1 = sese2effectSet.entrySet().iterator();
-      while( meItr1.hasNext() ) {
-        Map.Entry         me1  = (Map.Entry)         meItr1.next();
-        FlatSESEEnterNode sese = (FlatSESEEnterNode) me1.getKey();
-        EffectSet         es   = (EffectSet)         me1.getValue();
+      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();
 
-        bw.write( "\n"+sese.toPrettyString()+"\n--------------\n" );
-
-        Iterator meItr2 = es.getAllEffectPairs();
-        while( meItr2.hasNext() ) {
-          Map.Entry       me2     = (Map.Entry)       meItr2.next();
-          Taint           taint   = (Taint)           me2.getKey();
-          HashSet<Effect> effects = (HashSet<Effect>) me2.getValue();
-
-          Iterator<Effect> eItr = effects.iterator();
-          while( eItr.hasNext() ) {
-            Effect e = eItr.next();
+        Iterator<Effect> eItr = effects.iterator();
+        while( eItr.hasNext() ) {
+          Effect e = eItr.next();
             
-            bw.write( "  "+taint+"-->"+e+"\n" );
-          }
+          bw.write( taint+"-->"+e+"\n" );          
         }
       }
 
@@ -192,84 +145,6 @@ public class EffectsAnalysis {
     } catch( IOException e ) {}
   }
 
-  protected void add( FlatMethod fm, Taint t, Effect e ) {
-    EffectSet es = fm2effectSet.get( fm );    
-    if( es == null ) {
-      es = new EffectSet();
-    }
-    es.addEffect( t, e );
-    
-    fm2effectSet.put( fm, es );
-  }
-
-  protected void add( FlatSESEEnterNode sese, Taint t, Effect e ) {
-
-    if( sese.getIsCallerSESEplaceholder() ) {
-      return;
-    }
-
-    EffectSet es = sese2effectSet.get( sese );    
-    if( es == null ) {
-      es = new EffectSet();
-    }
-    es.addEffect( t, e );
-    
-    sese2effectSet.put( sese, es );
-  }
-
-  protected void add( FlatMethod fm, Taint t, EffectSet es ) {
-    EffectSet esExisting = fm2effectSet.get( fm );    
-    if( esExisting == null ) {
-      esExisting = new EffectSet();
-    }
-
-    Iterator meItr = es.getAllEffectPairs();
-    while( meItr.hasNext() ) {
-      Map.Entry       me      = (Map.Entry)       meItr.next();
-      Taint           taint   = (Taint)           me.getKey();
-      HashSet<Effect> effects = (HashSet<Effect>) me.getValue();
-      
-      Iterator<Effect> eItr = effects.iterator();
-      while( eItr.hasNext() ) {
-        Effect e = eItr.next();
-
-        esExisting.addEffect( taint, e );
-      }      
-    }
-    
-    fm2effectSet.put( fm, esExisting );
-  }
-
-  protected void add( FlatSESEEnterNode sese, Taint t, EffectSet es ) {
-
-    if( sese.getIsCallerSESEplaceholder() ) {
-      return;
-    }
-
-    EffectSet esExisting = sese2effectSet.get( sese );    
-
-    if( esExisting == null ) {
-      esExisting = new EffectSet();
-    }
-
-    Iterator meItr = es.getAllEffectPairs();
-    while( meItr.hasNext() ) {
-      Map.Entry       me      = (Map.Entry)       meItr.next();
-      Taint           taint   = (Taint)           me.getKey();
-      HashSet<Effect> effects = (HashSet<Effect>) me.getValue();
-      
-      Iterator<Effect> eItr = effects.iterator();
-      while( eItr.hasNext() ) {
-        Effect e = eItr.next();
-
-        esExisting.addEffect( taint, e );
-      }      
-    }
-
-    sese2effectSet.put( sese, esExisting );
-  }
-
-
   /*
    * public MethodEffects getMethodEffectsByMethodContext(MethodContext mc){
    * return mapMethodContextToMethodEffects.get(mc); }
index 10be7c50957ac0e982393ceb99c78706eee4d7e5..71a6f98393ef339275d72dfdb779fcfde9bb9efb 100644 (file)
@@ -1670,8 +1670,7 @@ public class ReachGraph {
   // equivalent, just eliminate Taints with bad preds
   protected TaintSet 
     toCallerContext( TaintSet                       ts,
-                     Hashtable<Taint, ExistPredSet> calleeTaintsSatisfied,
-                     Hashtable<Taint, TaintSet>     tCallee2tsCaller
+                     Hashtable<Taint, ExistPredSet> calleeTaintsSatisfied
                      ) {
 
     TaintSet out = TaintSet.factory();
@@ -1699,17 +1698,6 @@ public class ReachGraph {
         out = Canonical.add( out,
                              tCaller
                              );
-
-        // this mapping aids the effects analysis--
-        // ONLY DO IF MASTER MAP IS NOT NULL
-        if( tCallee2tsCaller != null ) {
-          TaintSet tsCaller = tCallee2tsCaller.get( tCallee );
-          if( tsCaller == null ) {
-            tsCaller = TaintSet.factory();
-          }
-          tsCaller = Canonical.add( tsCaller, tCaller );
-          tCallee2tsCaller.put( tCallee, tsCaller );
-        }
       }     
     }    
     
@@ -2218,7 +2206,6 @@ public class ReachGraph {
                        FlatMethod   fmCallee,        
                        ReachGraph   rgCallee,
                        Set<Integer> callerNodeIDsCopiedToCallee,
-                       Hashtable<Taint, TaintSet> tCallee2tsCaller,
                        boolean      writeDebugDOTs
                        ) {
 
@@ -2756,8 +2743,7 @@ public class ReachGraph {
                                                          calleeEdge2calleeStatesSatisfied.get( reCallee ) ),
                                         preds,
                                         toCallerContext( reCallee.getTaints(),
-                                                         calleeEdge2calleeTaintsSatisfied.get( reCallee ),
-                                                         tCallee2tsCaller )
+                                                         calleeEdge2calleeTaintsSatisfied.get( reCallee ) )
                                         );
 
         ChangeSet cs = ChangeSet.factory();
index 75ab66b00d1a89df5257312492fc65a8b53c1f2e..ec24f5e6995ca0da1f5e8e5046aba60c63b0b00a 100644 (file)
@@ -5,7 +5,7 @@ SOURCE_FILES=$(PROGRAM).java
 BUILDSCRIPT=~/research/Robust/src/buildscript
 
 BSFLAGS= -mainclass Test -justanalyze -ooojava -disjoint -disjoint-k 1 -enable-assertions
-DEBUGFLAGS= -disjoint-write-dots final -disjoint-write-initial-contexts -disjoint-write-ihms -disjoint-debug-snap-method main 0 10 true
+DEBUGFLAGS= #-disjoint-write-dots final -disjoint-write-initial-contexts -disjoint-write-ihms -disjoint-debug-snap-method main 0 10 true
 
 all: $(PROGRAM).bin
 
@@ -27,4 +27,4 @@ clean:
        rm -f  *.dot
        rm -f  *.png
        rm -f  aliases.txt
-       rm -f  effects-per-method.txt
+       rm -f  effects.txt