add -V option for baksmali to verify the bytecode

git-svn-id: https://smali.googlecode.com/svn/trunk@664 55b6fa8a-2a1e-11de-a435-ffa8d773f76a
This commit is contained in:
JesusFreke@JesusFreke.com 2010-03-03 03:26:53 +00:00
parent 7025dfb753
commit 7bb8ace93b
3 changed files with 25 additions and 4 deletions

View File

@ -248,7 +248,7 @@ public class MethodDefinition {
return methodItems;
}
if (baksmali.registerInfo != 0 || baksmali.deodex) {
if (baksmali.registerInfo != 0 || baksmali.deodex || baksmali.verify) {
methodAnalyzer.analyze();
ValidationException validationException = methodAnalyzer.getValidationException();
@ -256,6 +256,15 @@ public class MethodDefinition {
methodItems.add(new CommentMethodItem(stg,
String.format("ValidationException: %s" ,validationException.getMessage()),
validationException.getCodeAddress(), Integer.MIN_VALUE));
} else if (baksmali.verify) {
methodAnalyzer.verify();
validationException = methodAnalyzer.getValidationException();
if (validationException != null) {
methodItems.add(new CommentMethodItem(stg,
String.format("ValidationException: %s" ,validationException.getMessage()),
validationException.getCodeAddress(), Integer.MIN_VALUE));
}
}
}
List<AnalyzedInstruction> instructions = methodAnalyzer.getInstructions();

View File

@ -46,13 +46,15 @@ public class baksmali {
public static boolean outputDebugInfo = true;
public static boolean addCodeOffsets = false;
public static boolean deodex = false;
public static boolean verify = false;
public static int registerInfo = 0;
public static String bootClassPath;
public static void disassembleDexFile(DexFile dexFile, boolean deodex, String outputDirectory,
String[] classPathDirs, String bootClassPath, boolean noParameterRegisters,
boolean useLocalsDirective, boolean useSequentialLabels,
boolean outputDebugInfo, boolean addCodeOffsets, int registerInfo)
boolean outputDebugInfo, boolean addCodeOffsets, int registerInfo,
boolean verify)
{
baksmali.noParameterRegisters = noParameterRegisters;
baksmali.useLocalsDirective = useLocalsDirective;
@ -62,8 +64,9 @@ public class baksmali {
baksmali.deodex = deodex;
baksmali.registerInfo = registerInfo;
baksmali.bootClassPath = bootClassPath;
baksmali.verify = verify;
if (registerInfo != 0 || deodex) {
if (registerInfo != 0 || deodex || verify) {
try {
ClassPath.InitializeClassPath(classPathDirs, bootClassPath==null?null:bootClassPath.split(":"), dexFile);
} catch (Exception ex) {

View File

@ -102,6 +102,7 @@ public class main {
boolean outputDebugInfo = true;
boolean addCodeOffsets = false;
boolean deodex = false;
boolean verify = false;
int registerInfo = 0;
@ -216,6 +217,9 @@ public class main {
case 'F':
fixRegisters = true;
break;
case 'V':
verify = true;
break;
default:
assert false;
}
@ -262,7 +266,7 @@ public class main {
baksmali.disassembleDexFile(dexFile, deodex, outputDirectory, bootClassPathDirsArray, bootClassPath,
noParameterRegisters, useLocalsDirective, useSequentialLabels, outputDebugInfo, addCodeOffsets,
registerInfo);
registerInfo, verify);
}
if ((doDump || write) && !dexFile.isOdex()) {
@ -417,6 +421,10 @@ public class main {
.withDescription("add comments to the disassembly containing the code offset for each address")
.create("f");
Option verifyDexOption = OptionBuilder.withLongOpt("verify")
.withDescription("perform bytecode verification")
.create("V");
basicOptions.addOption(versionOption);
basicOptions.addOption(helpOption);
basicOptions.addOption(outputDirOption);
@ -435,6 +443,7 @@ public class main {
debugOptions.addOption(writeDexOption);
debugOptions.addOption(sortOption);
debugOptions.addOption(fixSignedRegisterOption);
debugOptions.addOption(verifyDexOption);
for (Object option: basicOptions.getOptions()) {