InstanceFieldRef fr = (InstanceFieldRef)st.getFieldRef(); Immediate base = (Immediate)fr.getBase(); if (!m.isStatic() && !base.equals(jb.getThisLocal())) {
Variable thisVar = statementSwitch.getMethodInfo().lookupLocalVariable(jb.getThisLocal()); if (baseVar.equals(thisVar)) { int i = 1;
init = Jimple.v().newAssignStmt(Jimple.v().newInstanceFieldRef(jbody.getThisLocal(), f.makeRef()), SootTranslationHelpers.v().getDefaultValue(f.getType()));
Variable thisLocal = this.statementSwitch.getMethodInfo().lookupLocalVariable(jb.getThisLocal());
/** * Creates an implementation of setResult() that writes the given intent into * the correct field */ private void createSetResultMethod() { // We need to create an implementation of "getIntent". If there is already such // an implementation, we don't touch it. if (component.declaresMethod("void setResult(int,android.content.Intent)")) return; Type intentType = RefType.v("android.content.Intent"); List<Type> params = new ArrayList<>(); params.add(IntType.v()); params.add(intentType); SootMethod sm = Scene.v().makeSootMethod("setResult", params, VoidType.v(), Modifier.PUBLIC); component.addMethod(sm); sm.addTag(SimulatedCodeElementTag.TAG); JimpleBody b = Jimple.v().newBody(sm); sm.setActiveBody(b); b.insertIdentityStmts(); Local lcIntent = b.getParameterLocal(1); b.getUnits().add(Jimple.v().newAssignStmt( Jimple.v().newInstanceFieldRef(b.getThisLocal(), resultIntentField.makeRef()), lcIntent)); b.getUnits().add(Jimple.v().newReturnVoidStmt()); // Activity.setResult() is final. We need to change that SootMethod smSetResult = Scene.v() .grabMethod("<android.app.Activity: void setResult(int,android.content.Intent)>"); if (smSetResult != null && smSetResult.getDeclaringClass().isApplicationClass()) smSetResult.setModifiers(smSetResult.getModifiers() & ~Modifier.FINAL); }
/** * Creates an implementation of setIntent() that writes the given intent into * the correct field */ private void createSetIntentMethod() { // We need to create an implementation of "getIntent". If there is already such // an implementation, we don't touch it. if (component.declaresMethod("void setIntent(android.content.Intent)")) return; Type intentType = RefType.v("android.content.Intent"); SootMethod sm = Scene.v().makeSootMethod("setIntent", Collections.singletonList(intentType), VoidType.v(), Modifier.PUBLIC); component.addMethod(sm); sm.addTag(SimulatedCodeElementTag.TAG); JimpleBody b = Jimple.v().newBody(sm); sm.setActiveBody(b); b.insertIdentityStmts(); Local lcIntent = b.getParameterLocal(0); b.getUnits().add(Jimple.v() .newAssignStmt(Jimple.v().newInstanceFieldRef(b.getThisLocal(), intentField.makeRef()), lcIntent)); b.getUnits().add(Jimple.v().newReturnVoidStmt()); }
/** * Creates an implementation of getIntent() that returns the intent from our ICC * model */ private void createGetIntentMethod() { // We need to create an implementation of "getIntent". If there is already such // an implementation, we don't touch it. if (component.declaresMethod("android.content.Intent getIntent()")) return; Type intentType = RefType.v("android.content.Intent"); SootMethod sm = Scene.v().makeSootMethod("getIntent", Collections.<Type>emptyList(), intentType, Modifier.PUBLIC); component.addMethod(sm); sm.addTag(SimulatedCodeElementTag.TAG); JimpleBody b = Jimple.v().newBody(sm); sm.setActiveBody(b); b.insertIdentityStmts(); LocalGenerator localGen = new LocalGenerator(b); Local lcIntent = localGen.generateLocal(intentType); b.getUnits().add(Jimple.v().newAssignStmt(lcIntent, Jimple.v().newInstanceFieldRef(b.getThisLocal(), intentField.makeRef()))); b.getUnits().add(Jimple.v().newReturnStmt(lcIntent)); }
b.insertIdentityStmts(); final Local thisLocal = b.getThisLocal(); final Local binderLocal = b.getParameterLocal(0); Stmt firstNonIdentityStmt = b.getFirstNonIdentityStmt(); final Local thisLocal = b.getThisLocal(); final Local binderLocal = b.getParameterLocal(0);
args.add(newElement); body.getUnits().add(Jimple.v().newInvokeStmt(Jimple.v().newVirtualInvokeExpr(body.getThisLocal(), setElement.makeRef(), args))); body.getUnits().add(Jimple.v().newAssignStmt(counter, Jimple.v().newAddExpr(counter, IntConstant.v(1)))); body.getUnits().add(Jimple.v().newGotoStmt(loopHead));
SootMethod superConstructor = objArrayClass.getMethod(SootMethod.constructorName, argTypes); body.getUnits().add(Jimple.v().newInvokeStmt( Jimple.v().newSpecialInvokeExpr(body.getThisLocal(), superConstructor.makeRef(), body.getParameterLocals()))); elementTypeName = elementTypeName.replace('.', '/'); body.getUnits().add(Jimple.v().newAssignStmt( Jimple.v().newInstanceFieldRef(body.getThisLocal(), elemTypeField.makeRef()), ClassConstant.v(elementTypeName))); Jimple.v().newInstanceFieldRef(body.getThisLocal(), arrFields[i].makeRef())); retStmts.add(ret); retStmts.add(Jimple.v().newReturnStmt(retLocal)); Jimple.v().newInstanceFieldRef(body.getThisLocal(), elemField.makeRef())); body.getUnits().add(ret); body.getUnits().add(Jimple.v().newReturnStmt(retLocal)); for (int i = 0; i < num_exact; i++) { Unit asn = Jimple.v().newAssignStmt( Jimple.v().newInstanceFieldRef(body.getThisLocal(), arrFields[i].makeRef()), body.getParameterLocal(1)); updates.add(asn); Jimple.v().newInstanceFieldRef(body.getThisLocal(), elemField.makeRef()), body.getParameterLocal(1)); body.getUnits().add(asn);