public List<SootField> getExtFields(SootClass sc) { if (classToExtFieldAccesses.containsKey(sc)) { List extAccesses = classToExtFieldAccesses.get(sc); List<SootField> extFields = new ArrayList<SootField>(); for (Iterator accessIt = extAccesses.iterator(); accessIt.hasNext();) { Pair access = (Pair) accessIt.next(); SootField accessedField = ((Stmt) access.getO2()).getFieldRef().getField(); if (!extFields.contains(accessedField)) { extFields.add(accessedField); } } return extFields; } throw new RuntimeException("UseFinder does not search non-application classes: " + sc); }
SootField sf = null; if (s.containsFieldRef()) { fr = s.getFieldRef(); sf = fr.getField(); if (sf != null) {
Stmt s = (Stmt) stmtIt.next(); if (s.containsFieldRef()) { FieldRef ref = s.getFieldRef(); if ((ref instanceof StaticFieldRef) && (Type.toMachineType(((StaticFieldRef) ref).getType()) instanceof RefLikeType)) {
continue; FieldRef fr = s.getFieldRef();
Stmt s = (Stmt) unitsIt.next(); if (s.containsFieldRef()) { FieldRef fr = s.getFieldRef(); if (fr.getFieldRef().resolve().getDeclaringClass() == appClass) { if (fr instanceof StaticFieldRef) {
FieldRef fieldRef = s.getFieldRef(); handleFieldRef(fieldRef, out);
FieldRef fieldRef = s.getFieldRef(); handleFieldRef(fieldRef, out);
FieldRef r = s.getFieldRef(); if (r instanceof InstanceFieldRef) { InstanceFieldRef ir = (InstanceFieldRef) r;
FieldRef fr = stmt.getFieldRef(); if (fr instanceof InstanceFieldRef) { if (((InstanceFieldRef) fr).getBase() == v) {
@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 } } } } }
FieldRef ref = s.getFieldRef(); if (ref instanceof StaticFieldRef) {
FieldRef fr = s.getFieldRef(); if (fr instanceof StaticFieldRef) { SootClass cl = fr.getFieldRef().declaringClass();
public List<SootField> getExtFields(SootClass sc) { if(classToExtFieldAccesses.containsKey(sc)) { List extAccesses = classToExtFieldAccesses.get(sc); List<SootField> extFields = new ArrayList<SootField>(); for(Iterator accessIt = extAccesses.iterator(); accessIt.hasNext(); ) { Pair access = (Pair) accessIt.next(); SootField accessedField = ((Stmt) access.getO2()).getFieldRef().getField(); if(!extFields.contains(accessedField)) extFields.add(accessedField); } return extFields; } throw new RuntimeException("UseFinder does not search non-application classes: " + sc); }
public List<SootField> getExtFields(SootClass sc) { if(classToExtFieldAccesses.containsKey(sc)) { List extAccesses = classToExtFieldAccesses.get(sc); List<SootField> extFields = new ArrayList<SootField>(); for(Iterator accessIt = extAccesses.iterator(); accessIt.hasNext(); ) { Pair access = (Pair) accessIt.next(); SootField accessedField = ((Stmt) access.getO2()).getFieldRef().getField(); if(!extFields.contains(accessedField)) extFields.add(accessedField); } return extFields; } throw new RuntimeException("UseFinder does not search non-application classes: " + sc); }
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; }
/** * 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(); }
FieldRef fr2 = s.getFieldRef(); if (fr2 instanceof StaticFieldRef && !u.equals(unit)) continue;
if (st.containsArrayRef()) { mayThrow = true; break; } else if (st.containsFieldRef() && st.getFieldRef() instanceof InstanceFieldRef) { InstanceFieldRef fr = (InstanceFieldRef)st.getFieldRef(); Immediate base = (Immediate)fr.getBase(); if (!m.isStatic() && !base.equals(jb.getThisLocal())) {
FieldRef fr = s.getFieldRef(); if( fr instanceof StaticFieldRef ) { SootClass cl = fr.getFieldRef().declaringClass();
FieldRef fr = s.getFieldRef(); if( fr instanceof StaticFieldRef ) { SootClass cl = fr.getFieldRef().declaringClass();