/** * Collect all the if statements comparing two locals with an Eq or Ne expression * * @param body * the body to analyze */ private Set<Unit> getRefCandidates(Body body) { Set<Unit> candidates = new HashSet<Unit>(); Iterator<Unit> i = body.getUnits().iterator(); while (i.hasNext()) { Unit u = i.next(); Stmt s = (Stmt) u; if (s.containsFieldRef()) { candidates.add(u); } } return candidates; }
FieldRef fr = null; SootField sf = null; if (s.containsFieldRef()) { fr = s.getFieldRef(); sf = fr.getField();
while (stmtIt.hasNext()) { Stmt s = (Stmt) stmtIt.next(); if (s.containsFieldRef()) { FieldRef ref = s.getFieldRef(); if ((ref instanceof StaticFieldRef)
if (!s.containsFieldRef()) { continue;
while (unitsIt.hasNext()) { Stmt s = (Stmt) unitsIt.next(); if (s.containsFieldRef()) { FieldRef fr = s.getFieldRef(); if (fr.getFieldRef().resolve().getDeclaringClass() == appClass) {
if (s.containsFieldRef()) { FieldRef fieldRef = s.getFieldRef(); handleFieldRef(fieldRef, out);
while (unitIt.hasNext()) { Stmt stmt = (Stmt) unitIt.next(); if (stmt.containsFieldRef()) { Value leftOp = ((AssignStmt) stmt).getLeftOp(); if (leftOp instanceof FieldRef) {
if (s.containsFieldRef()) { FieldRef fieldRef = s.getFieldRef(); handleFieldRef(fieldRef, out);
replace = true; } else if (s.containsFieldRef()) { FieldRef r = s.getFieldRef(); if (r instanceof InstanceFieldRef) {
if (stmt.containsFieldRef()) { FieldRef fr = stmt.getFieldRef(); if (fr instanceof InstanceFieldRef) {
@Override protected void internalTransform(Body b, String phaseName, Map<String, String> options) { // Some apps reference static fields as instance fields. We need to fix // this for not breaking the client analysis. for (Iterator<Unit> unitIt = b.getUnits().iterator(); unitIt.hasNext();) { Stmt s = (Stmt) unitIt.next(); if (s.containsFieldRef() && s instanceof AssignStmt) { FieldRef ref = s.getFieldRef(); // Make sure that the target class has already been loaded if (isTypeLoaded(ref.getFieldRef().type())) { try { if (ref instanceof InstanceFieldRef) { SootField fld = ref.getField(); if (fld != null && fld.isStatic()) { AssignStmt assignStmt = (AssignStmt) s; if (assignStmt.getLeftOp() == ref) { assignStmt.setLeftOp(Jimple.v().newStaticFieldRef(ref.getField().makeRef())); } else if (assignStmt.getRightOp() == ref) { assignStmt.setRightOp(Jimple.v().newStaticFieldRef(ref.getField().makeRef())); } } } } catch (ConflictingFieldRefException ex) { // That field is broken, just don't touch it } } } } }
if (s.containsFieldRef()) { FieldRef ref = s.getFieldRef(); if (ref instanceof StaticFieldRef) {
if (s.containsFieldRef()) { FieldRef fr = s.getFieldRef(); if (fr instanceof StaticFieldRef) {
private boolean methodCallAfterLastFieldRef(Unit u, UnitGraph graph, Local thisLocal) { Queue<Unit> todo = new LinkedList<Unit>(); Set<Unit> done = new HashSet<Unit>(); todo.addAll(graph.getPredsOf(u)); while (!todo.isEmpty()) { Unit unit = todo.poll(); done.add(unit); Stmt s = (Stmt) unit; if (s.containsInvokeExpr()) { return true; } else if (s.containsFieldRef()) { FieldRef fr2 = s.getFieldRef(); if (fr2 instanceof InstanceFieldRef) { InstanceFieldRef ifr2 = (InstanceFieldRef) fr2; if (ifr2.getBase().equals(thisLocal) && !u.equals(unit)) { continue; } } } for (Unit prev : graph.getPredsOf(unit)) { if (!todo.contains(prev) && !done.contains(prev)) { todo.add(prev); } } } return false; }
if (s instanceof AssignStmt && s.containsFieldRef()) { AssignStmt as = (AssignStmt) s; if (as.getLeftOp() instanceof InstanceFieldRef) { if (s.containsFieldRef()) { FieldRef fr2 = s.getFieldRef(); if (fr2 instanceof StaticFieldRef && !u.equals(unit))
/** * Gets the number of other classes on which the given class depends * * @param sc The class for which to count the dependencies * @return The number of dependencies on other classes of the given class */ private int getDependencyCount(SootClass sc) { Set<SootClass> dependencies = new HashSet<>(); for (SootMethod sm : sc.getMethods()) { if (sm.isConcrete()) { for (Unit u : sm.retrieveActiveBody().getUnits()) { Stmt stmt = (Stmt) u; if (stmt.containsFieldRef()) { SootField fld = stmt.getFieldRef().getField(); if (fld.getDeclaringClass() != sc) dependencies.add(fld.getDeclaringClass()); } if (stmt.containsInvokeExpr()) { SootMethod callee = stmt.getInvokeExpr().getMethod(); if (callee.getDeclaringClass() != sc) dependencies.add(callee.getDeclaringClass()); } } } } return dependencies.size(); }
if (st.containsArrayRef()) { mayThrow = true; break; } else if (st.containsFieldRef() && st.getFieldRef() instanceof InstanceFieldRef) { InstanceFieldRef fr = (InstanceFieldRef)st.getFieldRef(); Immediate base = (Immediate)fr.getBase();
Stmt st = (Stmt) u; if (st.containsFieldRef()) { FieldRef fr = st.getFieldRef(); if (fieldSubstitutionMap.containsKey(fr.getField().getSignature())) {
if( s.containsFieldRef() ) { FieldRef fr = s.getFieldRef(); if( fr instanceof StaticFieldRef ) {
if( s.containsFieldRef() ) { FieldRef fr = s.getFieldRef(); if( fr instanceof StaticFieldRef ) {