From e3dfc5afe5df66fd906e67ab368dfb1d035d8afd Mon Sep 17 00:00:00 2001 From: Julian Dolby Date: Fri, 10 Oct 2014 17:48:37 -0400 Subject: [PATCH] fixes for ir generation --- .../dalvik/drivers/APKCallGraphDriver.java | 22 ++++++++++ .../test/callGraph/DroidBenchCGTest.java | 1 - .../test/callGraph/JVMLDalvikComparison.java | 42 +++++++++++++------ .../wala/dalvik/classLoader/DexIMethod.java | 2 +- .../dex/instructions/UnaryOperation.java | 2 +- .../ssa/AbstractIntRegisterMachine.java | 17 +++++--- .../ibm/wala/dalvik/ssa/DexSSABuilder.java | 22 ++++++++-- .../dalvik/util/AndroidEntryPointLocator.java | 3 ++ 8 files changed, 85 insertions(+), 26 deletions(-) create mode 100644 com.ibm.wala.dalvik.test/source/com/ibm/wala/dalvik/drivers/APKCallGraphDriver.java diff --git a/com.ibm.wala.dalvik.test/source/com/ibm/wala/dalvik/drivers/APKCallGraphDriver.java b/com.ibm.wala.dalvik.test/source/com/ibm/wala/dalvik/drivers/APKCallGraphDriver.java new file mode 100644 index 000000000..6d8da1d60 --- /dev/null +++ b/com.ibm.wala.dalvik.test/source/com/ibm/wala/dalvik/drivers/APKCallGraphDriver.java @@ -0,0 +1,22 @@ +package com.ibm.wala.dalvik.drivers; + +import java.io.IOException; + +import com.ibm.wala.dalvik.test.callGraph.DalvikCallGraphTestBase; +import com.ibm.wala.ipa.callgraph.CGNode; +import com.ibm.wala.ipa.callgraph.CallGraph; +import com.ibm.wala.ipa.cha.ClassHierarchyException; +import com.ibm.wala.util.CancelException; + +public class APKCallGraphDriver { + + public static void main(String[] args) throws ClassHierarchyException, IllegalArgumentException, IOException, CancelException { + CallGraph CG = DalvikCallGraphTestBase.makeAPKCallGraph(args[0]).fst; + System.err.println(CG); + for(CGNode n : CG) { + System.err.println(n); + System.err.println(n.getIR()); + } + } + +} diff --git a/com.ibm.wala.dalvik.test/source/com/ibm/wala/dalvik/test/callGraph/DroidBenchCGTest.java b/com.ibm.wala.dalvik.test/source/com/ibm/wala/dalvik/test/callGraph/DroidBenchCGTest.java index d3dcb241c..0ba6f739e 100644 --- a/com.ibm.wala.dalvik.test/source/com/ibm/wala/dalvik/test/callGraph/DroidBenchCGTest.java +++ b/com.ibm.wala.dalvik.test/source/com/ibm/wala/dalvik/test/callGraph/DroidBenchCGTest.java @@ -33,7 +33,6 @@ import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis; import com.ibm.wala.ipa.cha.ClassHierarchyException; -import com.ibm.wala.properties.WalaProperties; import com.ibm.wala.shrikeCT.InvalidClassFileException; import com.ibm.wala.types.ClassLoaderReference; import com.ibm.wala.types.MethodReference; diff --git a/com.ibm.wala.dalvik.test/source/com/ibm/wala/dalvik/test/callGraph/JVMLDalvikComparison.java b/com.ibm.wala.dalvik.test/source/com/ibm/wala/dalvik/test/callGraph/JVMLDalvikComparison.java index 6fffaabe0..5f82ca64e 100644 --- a/com.ibm.wala.dalvik.test/source/com/ibm/wala/dalvik/test/callGraph/JVMLDalvikComparison.java +++ b/com.ibm.wala.dalvik.test/source/com/ibm/wala/dalvik/test/callGraph/JVMLDalvikComparison.java @@ -14,8 +14,7 @@ import java.io.File; import java.io.IOException; import java.util.Set; -import junit.framework.Assert; - +import org.junit.Assert; import org.junit.Test; import com.ibm.wala.core.tests.callGraph.CallGraphTestUtil; @@ -28,6 +27,7 @@ import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.ipa.callgraph.Entrypoint; import com.ibm.wala.ipa.callgraph.impl.Util; import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; +import com.ibm.wala.ipa.callgraph.propagation.LocalPointerKey; import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis; import com.ibm.wala.ipa.callgraph.propagation.SSAPropagationCallGraphBuilder; import com.ibm.wala.ipa.cha.ClassHierarchy; @@ -36,6 +36,7 @@ import com.ibm.wala.types.MethodReference; import com.ibm.wala.util.CancelException; import com.ibm.wala.util.collections.HashSetFactory; import com.ibm.wala.util.collections.Pair; +import com.ibm.wala.util.intset.OrdinalSet; public class JVMLDalvikComparison extends DalvikCallGraphTestBase { @@ -83,17 +84,32 @@ public class JVMLDalvikComparison extends DalvikCallGraphTestBase { Set androidMethods = applicationMethods(android.fst); Set javaMethods = applicationMethods(java.fst); - Set androidExtra = HashSetFactory.make(androidMethods); - androidExtra.removeAll(javaMethods); - System.err.println(androidExtra); - - Set javaExtra = HashSetFactory.make(javaMethods); - javaExtra.removeAll(androidMethods); - System.err.println(javaExtra); - - System.err.println(edgeDiff(android.fst, java.fst)); - - System.err.println(edgeDiff(java.fst, android.fst)); + if (!androidMethods.containsAll(javaMethods)) { + Set androidExtra = HashSetFactory.make(androidMethods); + androidExtra.removeAll(javaMethods); + Set javaExtra = HashSetFactory.make(javaMethods); + javaExtra.removeAll(androidMethods); + + System.err.println(edgeDiff(java.fst, android.fst)); + System.err.println(javaExtra); + + System.err.println(android.fst); + + for(CGNode n : android.fst) { + System.err.println("### " + n); + if (n.getIR() != null) { + System.err.println(n.getIR()); + + for(int i = 1; i < n.getIR().getSymbolTable().getMaxValueNumber(); i++) { + LocalPointerKey x = new LocalPointerKey(n, i); + OrdinalSet s = android.snd.getPointsToSet(x); + if (s != null && !s.isEmpty()) { + System.err.println(i + ": " + s); + } + } + } + } + } Assert.assertTrue(androidMethods.containsAll(javaMethods)); } diff --git a/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/classLoader/DexIMethod.java b/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/classLoader/DexIMethod.java index 9544a4b8d..20f37fac7 100644 --- a/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/classLoader/DexIMethod.java +++ b/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/classLoader/DexIMethod.java @@ -984,7 +984,7 @@ public class DexIMethod implements IBytecodeMethod { break; case MOVE_EXCEPTION: instructions.add(new UnaryOperation(instLoc, - UnaryOperation.OpID.MOVE, ((Instruction11x)inst).getRegisterA(), + UnaryOperation.OpID.MOVE_EXCEPTION, ((Instruction11x)inst).getRegisterA(), getExceptionReg(), inst.opcode, this)); break; case RETURN_VOID: diff --git a/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/dex/instructions/UnaryOperation.java b/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/dex/instructions/UnaryOperation.java index c9c874453..5a39a6804 100644 --- a/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/dex/instructions/UnaryOperation.java +++ b/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/dex/instructions/UnaryOperation.java @@ -57,7 +57,7 @@ import com.ibm.wala.shrikeBT.IUnaryOpInstruction.IOperator; public class UnaryOperation extends Instruction { - public static enum OpID {MOVE, MOVE_WIDE, NOT, NEGINT, NOTINT, NEGLONG, NOTLONG, NEGFLOAT, NEGDOUBLE, DOUBLETOLONG, DOUBLETOFLOAT, INTTOBYTE, INTTOCHAR, INTTOSHORT, DOUBLETOINT, FLOATTODOUBLE, FLOATTOLONG, FLOATTOINT, LONGTODOUBLE, LONGTOFLOAT, LONGTOINT, INTTODOUBLE, INTTOFLOAT, INTTOLONG}; + public static enum OpID {MOVE, MOVE_WIDE, MOVE_EXCEPTION, NOT, NEGINT, NOTINT, NEGLONG, NOTLONG, NEGFLOAT, NEGDOUBLE, DOUBLETOLONG, DOUBLETOFLOAT, INTTOBYTE, INTTOCHAR, INTTOSHORT, DOUBLETOINT, FLOATTODOUBLE, FLOATTOLONG, FLOATTOINT, LONGTODOUBLE, LONGTOFLOAT, LONGTOINT, INTTODOUBLE, INTTOFLOAT, INTTOLONG}; public final OpID op; public final int source; diff --git a/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/ssa/AbstractIntRegisterMachine.java b/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/ssa/AbstractIntRegisterMachine.java index 26ac8fe85..b84d68d5a 100644 --- a/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/ssa/AbstractIntRegisterMachine.java +++ b/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/ssa/AbstractIntRegisterMachine.java @@ -289,7 +289,7 @@ public abstract class AbstractIntRegisterMachine implements FixedPointConstants @Override public boolean isUnaryNoOp() { - return true; + return false; } @Override @@ -299,9 +299,14 @@ public abstract class AbstractIntRegisterMachine implements FixedPointConstants // Exception e = new Exception("evaluating a MeetOperator"); // e.printStackTrace(); // return NOT_CHANGED; + + if (cfg.getDexMethod().getReference().toString().equals("< Application, Lcom/google/android/gms/tagmanager/v$a, onOpen(Landroid/database/sqlite/SQLiteDatabase;)V >")) { + System.err.println("got here"); + } + if (!bb.isCatchBlock()) { return meet(lhs, rhs, bb, meeter) ? CHANGED : NOT_CHANGED; - } else { + } else { return meetForCatchBlock(lhs, rhs, bb, meeter) ? CHANGED : NOT_CHANGED; } } @@ -418,6 +423,7 @@ public abstract class AbstractIntRegisterMachine implements FixedPointConstants // not already allocated. if (L.locals == null) { L.allocateLocals(); + changed = true; } DexIMethod dMethod = (DexIMethod)L.getBasicBlock().getMethod(); @@ -428,10 +434,8 @@ public abstract class AbstractIntRegisterMachine implements FixedPointConstants int meet = meeter.meetStackAtCatchBlock(bb); if (L.locals[dMethod.getExceptionReg()] == TOP) { - if (meet != TOP) { - changed = true; - L.locals[dMethod.getExceptionReg()] = meet; - } + changed = true; + L.locals[dMethod.getExceptionReg()] = meet; } else if (meet != L.locals[dMethod.getExceptionReg()]) { changed = true; L.locals[dMethod.getExceptionReg()] = meet; @@ -543,6 +547,7 @@ public abstract class AbstractIntRegisterMachine implements FixedPointConstants int nLocals = computeMeetNLocals(rhs); if (nLocals > -1 && L.locals == null) { L.allocateLocals(); + changed = true; } // evaluate the element-wise meet over the locals. diff --git a/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/ssa/DexSSABuilder.java b/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/ssa/DexSSABuilder.java index 87aadaefd..5f7015ca0 100644 --- a/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/ssa/DexSSABuilder.java +++ b/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/ssa/DexSSABuilder.java @@ -71,6 +71,7 @@ import com.ibm.wala.ssa.ISSABasicBlock; import com.ibm.wala.ssa.PhiValue; import com.ibm.wala.ssa.SSAAbstractInvokeInstruction; import com.ibm.wala.ssa.SSACFG; +import com.ibm.wala.ssa.SSACFG.ExceptionHandlerBasicBlock; import com.ibm.wala.ssa.SSAConditionalBranchInstruction; import com.ibm.wala.ssa.SSAGetCaughtExceptionInstruction; import com.ibm.wala.ssa.SSAInstruction; @@ -271,8 +272,11 @@ public class DexSSABuilder extends AbstractIntRegisterMachine { SSACFG.ExceptionHandlerBasicBlock newBB = (SSACFG.ExceptionHandlerBasicBlock) cfg.getNode(bbNumber); SSAGetCaughtExceptionInstruction s = newBB.getCatchInstruction(); int exceptionValue; + if (cfg.getMethod().getReference().toString().equals("< Application, Lcom/google/android/gms/tagmanager/v$a, onOpen(Landroid/database/sqlite/SQLiteDatabase;)V >")) { + System.err.println("got here"); + } if (s == null) { - exceptionValue = symbolTable.newSymbol(); + exceptionValue = symbolTable.newSymbol(); s = insts.GetCaughtExceptionInstruction(bb.getLastInstructionIndex(), bbNumber, exceptionValue); newBB.setCatchInstruction(s); } else { @@ -387,7 +391,7 @@ public class DexSSABuilder extends AbstractIntRegisterMachine { this.symbolTable = symbolTable; this.loader = dexCFG.getMethod().getDeclaringClass().getClassLoader().getReference(); // this.localMap = localMap; - init(this.new NodeVisitor(), this.new EdgeVisitor()); + init(this.new NodeVisitor(cfg), this.new EdgeVisitor()); } @Override @@ -449,7 +453,13 @@ public class DexSSABuilder extends AbstractIntRegisterMachine { * Update the machine state to account for an instruction */ class NodeVisitor extends BasicRegisterMachineVisitor { - // TODO: make sure all visit functions are overridden + private final SSACFG cfg; + + public NodeVisitor(SSACFG cfg) { + this.cfg = cfg; + } + + // TODO: make sure all visit functions are overridden /** * @see com.ibm.wala.shrikeBT.Instruction.Visitor#visitArrayLength(ArrayLengthInstruction) @@ -1229,6 +1239,11 @@ public class DexSSABuilder extends AbstractIntRegisterMachine { } emitInstruction(insts.ConversionInstruction(getCurrentInstructionIndex(), result, val, fromType, toType, overflows)); } + else if (instruction.op == UnaryOperation.OpID.MOVE_EXCEPTION) { + int source = ((DexIMethod)dexCFG.getMethod()).getExceptionReg(); + workingState.setLocal(instruction.destination, source); + } + else { emitInstruction(insts.UnaryOpInstruction(getCurrentInstructionIndex(), instruction.getOperator(), result, val)); @@ -1243,7 +1258,6 @@ public class DexSSABuilder extends AbstractIntRegisterMachine { else workingState.setLocal(instruction.destination+1, workingState.getLocal(instruction.source+1)); } - } } diff --git a/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/util/AndroidEntryPointLocator.java b/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/util/AndroidEntryPointLocator.java index c1b67acc5..50a4bfa57 100644 --- a/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/util/AndroidEntryPointLocator.java +++ b/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/util/AndroidEntryPointLocator.java @@ -352,6 +352,9 @@ nextMethod: final Collection ifMethods = iFace.getDeclaredMethods(); for (final IMethod ifMethod : ifMethods) { final IMethod method = appClass.getMethod(ifMethod.getSelector()); + if (method == null || method.isAbstract()) { + continue; + } if (method.getDeclaringClass().getClassLoader().getReference().equals(ClassLoaderReference.Application)) { // The function is overridden final AndroidEntryPoint ep = new AndroidEntryPoint(selectPositionForHeuristic(method), method, cha);