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.*;
/////////////////////////////////////////////
//
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>>();
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) {
}
effects.add(e);
te.put(tNoPreds, effects);
-
stallSite2te.put(stallSite, te);
}
}
- 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 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 Hashtable<Taint, Set<Effect>> getAllEffects() {
+ return taint2effects;
+ }
}