X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=Robust%2Fsrc%2FAnalysis%2FDisjoint%2FEffectsAnalysis.java;h=07abff412bdf388b351eb5f63bcaa11fb554b475;hb=a241479f3823d36df9f3bd709cffd7f2951c9730;hp=52244a537e9b04b8a986852719509e5718023803;hpb=dbc671bc1c6957945000ca681aa9c0af4c0b9515;p=IRC.git diff --git a/Robust/src/Analysis/Disjoint/EffectsAnalysis.java b/Robust/src/Analysis/Disjoint/EffectsAnalysis.java index 52244a53..07abff41 100644 --- a/Robust/src/Analysis/Disjoint/EffectsAnalysis.java +++ b/Robust/src/Analysis/Disjoint/EffectsAnalysis.java @@ -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> taint2effects; + // redundant views of the effect set for + // efficient retrieval + private Hashtable> > sese2te; + private Hashtable> > stallSite2te; + + public static State state; + public static BuildStateMachines buildStateMachines; + + public EffectsAnalysis() { taint2effects = new Hashtable>(); + + sese2te = new Hashtable> >(); + stallSite2te = new Hashtable> >(); } @@ -49,82 +58,74 @@ public class EffectsAnalysis { public Iterator iteratorTaintEffectPairs() { return taint2effects.entrySet().iterator(); } - - public Hashtable> getSESEEffects(FlatSESEEnterNode sese){ - - Hashtable> taint2Effects = new Hashtable>(); - Iterator iter=iteratorTaintEffectPairs(); - while (iter.hasNext()) { - Entry entry = (Entry) iter.next(); - Taint taint = (Taint) entry.getKey(); - Set effects = (Set) entry.getValue(); - if (taint.getSESE().equals(sese)) { - Iterator eIter = effects.iterator(); - while (eIter.hasNext()) { - Effect effect = eIter.next(); - if (taint.getSESE().equals(sese)) { - Set effectSet = taint2Effects.get(taint); - if (effectSet == null) { - effectSet = new HashSet(); - } - effectSet.add(effect); - taint2Effects.put(taint, effectSet); - } - } - } - } - - return taint2Effects; - - } - - public Hashtable> getStallSiteEffects(FlatNode fn, TempDescriptor td){ - - Hashtable> taint2Effects = new Hashtable>(); - Iterator iter=iteratorTaintEffectPairs(); - while(iter.hasNext()){ - Entry entry=(Entry)iter.next(); - Taint taint=(Taint)entry.getKey(); - Set effects=(Set)entry.getValue(); - if(taint.getStallSite().equals(fn)){ - Iterator eIter=effects.iterator(); - while (eIter.hasNext()) { - Effect effect = eIter.next(); - if( taint.getStallSite().equals(fn) && taint.getVar().equals(td) ){ - Set effectSet=taint2Effects.get(taint); - if(effectSet==null){ - effectSet=new HashSet(); - } - 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 effectSet = taint2effects.get(tNoPreds); if (effectSet == null) { effectSet = new HashSet(); } effectSet.add(e); taint2effects.put(tNoPreds, effectSet); + + // add to the alternate retrieval bags + if( t.getSESE() != null ) { + FlatSESEEnterNode sese = t.getSESE(); + + Hashtable> te = sese2te.get( sese ); + if( te == null ) { + te = new Hashtable>(); + } + + Set effects = te.get(tNoPreds); + if (effects == null) { + effects = new HashSet(); + } + effects.add(e); + te.put(tNoPreds, effects); + + sese2te.put(sese, te); + + } else { + assert t.getStallSite() != null; + FlatNode stallSite = t.getStallSite(); + + Hashtable> te = stallSite2te.get( stallSite ); + if( te == null ) { + te = new Hashtable>(); + } + + Set effects = te.get(tNoPreds); + if (effects == null) { + effects = new HashSet(); + } + effects.add(e); + te.put(tNoPreds, effects); + stallSite2te.put(stallSite, te); + } + } + + + public Hashtable> get( FlatSESEEnterNode sese ) { + return sese2te.get(sese); } + public Hashtable> 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 taintSetIter = taintSet.iterator(); taintSetIter.hasNext();) { Taint taint = taintSetIter.next(); - add(taint, effect); + add(taint, effect, currentProgramPoint); + } + } + } + + public void analyzeFlatFieldNode(Set 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 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 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 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 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> getAllEffects() { + return taint2effects; + } }