Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /* Soot - a J*va Optimization Framework
   * Copyright (C) 2003 Ondrej Lhotak
   *
   * This library is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
   * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the
  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  * Boston, MA 02111-1307, USA.
  */
 
 package soot.jimple.toolkits.pointer;
 import soot.*;
 import soot.jimple.*;
 import java.util.*;

Generates side-effect information from a PointsToAnalysis.
 
 public class SideEffectAnalysis {
     CallGraph cg;
     int rwsetcount = 0;
 
     public void findNTRWSetsSootMethod method ) {
 	if.containsKeymethod )
 	    && .containsKeymethod ) ) return;
 	
 	MethodRWSet read = null;
 	MethodRWSet write = null;
 	forIterator sIt = method.retrieveActiveBody().getUnits().iterator(); sIt.hasNext(); ) {
 	    final Stmt s = (StmtsIt.next();
             RWSet ntr = ntReadSetmethods );
             ifntr != null ) {
                 ifread == null ) read = new MethodRWSet();
                 read.unionntr );
             }
             RWSet ntw = ntWriteSetmethods );
             ifntw != null ) {
                 ifwrite == null ) write = new MethodRWSet();
                 write.unionntw );
             }
 	}
 	.putmethodread );
 	.putmethodwrite );
 	SootClass c = method.getDeclaringClass();
     }
 
     public RWSet nonTransitiveReadSetSootMethod method ) {
 	findNTRWSetsmethod );
 	return .getmethod );
     }
 
     public RWSet nonTransitiveWriteSetSootMethod method ) {
 	findNTRWSetsmethod );
 	return .getmethod );
     }
 
     public SideEffectAnalysisPointsToAnalysis paCallGraph cg ) {
 	this. = pa;
 	this. = cg;
         this. = new TransitiveTargetscg );
     }
 
     public SideEffectAnalysisPointsToAnalysis paCallGraph cgFilter filter ) {
     // This constructor allows customization of call graph edges to
     // consider via the use of a transitive targets filter.
     // For example, using the NonClinitEdgesPred, you can create a 
     // SideEffectAnalysis that will ignore static initializers
     // - R. Halpert 2006-12-02
 	this. = pa;
 	this. = cg;
         this. = new TransitiveTargetscgfilter );
     }
 
     private RWSet ntReadSetSootMethod methodStmt stmt ) {
 	ifstmt instanceof AssignStmt ) {
 	    AssignStmt a = (AssignStmtstmt;
 	    Value r = a.getRightOp();
 	    return addValuermethodstmt );
 	}
         return null;
     }
     public RWSet readSetSootMethod methodStmt stmt ) {
 	RWSet ret = null;
         Iterator<MethodOrMethodContexttargets = .iteratorstmt );
         whiletargets.hasNext() ) {
             SootMethod target = (SootMethodtargets.next();
             iftarget.isNative() ) {
                ifret == null ) ret = new SiteRWSet();
                ret.setCallsNative();
            } else iftarget.isConcrete() ) {
                RWSet ntr = nonTransitiveReadSet(target);
                ifntr != null ) {
                    ifret == null ) ret = new SiteRWSet();
                    ret.unionntr );
                }
            }
        }
        ifret == null ) return ntReadSetmethodstmt );
        ret.unionntReadSetmethodstmt ) );
        return ret;
    }
    private RWSet ntWriteSetSootMethod methodStmt stmt ) {
        ifstmt instanceof AssignStmt ) {
	    AssignStmt a = (AssignStmtstmt;
	    Value l = a.getLeftOp();
	    return addValuelmethodstmt );
	}
        return null;
    }
    public RWSet writeSetSootMethod methodStmt stmt ) {
	RWSet ret = null;
        Iterator<MethodOrMethodContexttargets = .iteratorstmt );
        whiletargets.hasNext() ) {
            SootMethod target = (SootMethodtargets.next();
            iftarget.isNative() ) {
                ifret == null ) ret = new SiteRWSet();
                ret.setCallsNative();
            } else iftarget.isConcrete() ) {
                RWSet ntw = nonTransitiveWriteSet(target);
                ifntw != null ) {
                    ifret == null ) ret = new SiteRWSet();
                    ret.unionntw );
                }
            }
	}
        ifret == null ) return ntWriteSetmethodstmt );
        ret.unionntWriteSetmethodstmt ) );
	return ret;
    }
    protected RWSet addValueValue vSootMethod mStmt s ) {
	RWSet ret = null;
	ifv instanceof InstanceFieldRef ) {
	    InstanceFieldRef ifr = (InstanceFieldRefv;
	    PointsToSet base = .reachingObjects( (Localifr.getBase() );
	    ret = new StmtRWSet();
	    ret.addFieldRefbaseifr.getField() );
else ifv instanceof StaticFieldRef ) {
	    StaticFieldRef sfr = (StaticFieldRefv;
	    ret = new StmtRWSet();
	    ret.addGlobalsfr.getField() );
else ifv instanceof ArrayRef ) {
	    ArrayRef ar = (ArrayRefv;
	    PointsToSet base = .reachingObjects( (Localar.getBase() );
	    ret = new StmtRWSet();
	}
	return ret;
    }
    public String toString() {
        return "SideEffectAnalysis: PA="++" CG="+;
    }
New to GrepCode? Check out our FAQ X