Skip to content

Commit

Permalink
fix: ignore NOPs in try-catch (#668)
Browse files Browse the repository at this point in the history
  • Loading branch information
skylot committed Jun 19, 2019
1 parent 9c34a31 commit f02a33a
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 4 deletions.
7 changes: 3 additions & 4 deletions jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import jadx.core.dex.instructions.GotoNode;
import jadx.core.dex.instructions.IfNode;
import jadx.core.dex.instructions.InsnDecoder;
import jadx.core.dex.instructions.InsnType;
import jadx.core.dex.instructions.SwitchNode;
import jadx.core.dex.instructions.args.ArgType;
import jadx.core.dex.instructions.args.InsnArg;
Expand Down Expand Up @@ -332,7 +333,7 @@ private static void initTryCatches(MethodNode mth, Code mthCode, InsnNode[] insn
InsnNode insn = null;
while (offset <= end && offset >= 0) {
insn = insnByOffset[offset];
if (insn != null) {
if (insn != null && insn.getType() != InsnType.NOP) {
if (tryBlockStarted) {
catchBlock.addInsn(insn);
} else if (insn.canThrowException()) {
Expand All @@ -343,9 +344,7 @@ private static void initTryCatches(MethodNode mth, Code mthCode, InsnNode[] insn
}
offset = InsnDecoder.getNextInsnOffset(insnByOffset, offset);
}
if (insnByOffset[end] != null) {
insnByOffset[end].add(AFlag.TRY_LEAVE);
} else if (insn != null) {
if (tryBlockStarted && insn != null) {
insn.add(AFlag.TRY_LEAVE);
}
}
Expand Down
7 changes: 7 additions & 0 deletions jadx-core/src/test/java/jadx/tests/api/SmaliTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,13 @@ protected ClassNode getClassNodeFromSmali(String file, String clsName) {
return getClassNodeFromFile(outDex, clsName);
}

/**
* Preferred method for one file smali test
*/
protected ClassNode getClassNodeFromSmali() {
return getClassNodeFromSmaliWithPkg(getTestPkg(), getTestName());
}

protected ClassNode getClassNodeFromSmali(String clsName) {
return getClassNodeFromSmali(clsName, clsName);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package jadx.tests.integration.trycatch;

import org.junit.jupiter.api.Test;

import jadx.core.dex.nodes.ClassNode;
import jadx.tests.api.SmaliTest;

import static jadx.tests.api.utils.JadxMatchers.containsOne;
import static org.hamcrest.MatcherAssert.assertThat;

public class TestTryCatchLastInsn extends SmaliTest {

// @formatter:off
/*
public Exception test() {
? r1 = "result"; // String
try {
r1 = call(); // Exception
} catch(Exception e) {
System.out.println(r1); // String
r1 = e;
}
return r1;
}
*/
// @formatter:on

@Test
public void test() {
ClassNode cls = getClassNodeFromSmali();
String code = cls.getCode().toString();

assertThat(code, containsOne("return call();"));
}
}
34 changes: 34 additions & 0 deletions jadx-core/src/test/smali/trycatch/TestTryCatchLastInsn.smali
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
.class public Ltrycatch/TestTryCatchLastInsn;
.super Ljava/lang/Object;
.source "TestTryCatchLastInsn.java"

.method public test()Ljava/lang/Exception;
.registers 6

.prologue
const-string v1, "result"

:try_start
invoke-direct {p0}, Ltrycatch/TestTryCatchLastInsn;->call()Ljava/lang/Exception;
move-result-object v1
:try_end
.catch Ljava/lang/Exception; {:try_start .. :try_end} :catch

:goto_return
return-object v1

:catch
move-exception v4
sget-object v3, Ljava/lang/System;->out:Ljava/io/PrintStream;
invoke-virtual {v3, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
move-object v1, v4
goto :goto_return
.end method


.method private call()Ljava/lang/Exception;
.registers 2
new-instance v0, Ljava/lang/Exception;
invoke-direct {v0}, Ljava/lang/Exception;-><init>()V
return-object v0
.end method

0 comments on commit f02a33a

Please sign in to comment.