From 150acd9db94f9886f6fc32e89acc15a1a5c1466f Mon Sep 17 00:00:00 2001 From: "JesusFreke@JesusFreke.com" Date: Sun, 24 Jan 2010 20:43:52 +0000 Subject: [PATCH] Implemented verification for if-lt/ge/gt/le git-svn-id: https://smali.googlecode.com/svn/trunk@584 55b6fa8a-2a1e-11de-a435-ffa8d773f76a --- .../dexlib/Code/Analysis/MethodAnalyzer.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/dexlib/src/main/java/org/jf/dexlib/Code/Analysis/MethodAnalyzer.java b/dexlib/src/main/java/org/jf/dexlib/Code/Analysis/MethodAnalyzer.java index 7161b363..421562a1 100644 --- a/dexlib/src/main/java/org/jf/dexlib/Code/Analysis/MethodAnalyzer.java +++ b/dexlib/src/main/java/org/jf/dexlib/Code/Analysis/MethodAnalyzer.java @@ -487,6 +487,11 @@ public class MethodAnalyzer { case IF_EQ: case IF_NE: return handleIfEqNe(analyzedInstruction); + case IF_LT: + case IF_GE: + case IF_GT: + case IF_LE: + return handleIf(analyzedInstruction); } assert false; return false; @@ -1282,6 +1287,28 @@ public class MethodAnalyzer { return true; } + private boolean handleIf(AnalyzedInstruction analyzedInstruction) { + TwoRegisterInstruction instruction = (TwoRegisterInstruction)analyzedInstruction.instruction; + + RegisterType registerType = analyzedInstruction.getPreInstructionRegisterType(instruction.getRegisterA()); + assert registerType != null; + + if (registerType.category == RegisterType.Category.Unknown) { + return false; + } + checkRegister(registerType, Primitive32BitCategories); + + registerType = analyzedInstruction.getPreInstructionRegisterType(instruction.getRegisterB()); + assert registerType != null; + + if (registerType.category == RegisterType.Category.Unknown) { + return false; + } + checkRegister(registerType, Primitive32BitCategories); + + return true; + } + private static void checkRegister(RegisterType registerType, EnumSet validCategories) { if (!validCategories.contains(registerType.category)) { //TODO: add expected categories to error message