From 2f5dd171d078fceba3fcc11ff6813bd62fb89b80 Mon Sep 17 00:00:00 2001 From: Jonas Konrad Date: Wed, 9 Dec 2020 21:19:21 +0100 Subject: [PATCH] fix: do not remove method start block when it is referenced from dead code (PR #1044) --- .../dex/visitors/blocksmaker/BlockSplitter.java | 6 +++--- .../others/TestDeadBlockReferencesStart.java | 16 ++++++++++++++++ .../others/TestDeadBlockReferencesStart.smali | 11 +++++++++++ 3 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 jadx-core/src/test/java/jadx/tests/integration/others/TestDeadBlockReferencesStart.java create mode 100644 jadx-core/src/test/smali/others/TestDeadBlockReferencesStart.smali diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/blocksmaker/BlockSplitter.java b/jadx-core/src/main/java/jadx/core/dex/visitors/blocksmaker/BlockSplitter.java index 64cd7c28..c73b6555 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/blocksmaker/BlockSplitter.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/blocksmaker/BlockSplitter.java @@ -339,7 +339,7 @@ public class BlockSplitter extends AbstractVisitor { Set toRemove = new LinkedHashSet<>(); for (BlockNode block : mth.getBasicBlocks()) { if (block.getPredecessors().isEmpty() && block != mth.getEnterBlock()) { - collectSuccessors(block, toRemove); + collectSuccessors(block, mth.getEnterBlock(), toRemove); } } if (toRemove.isEmpty()) { @@ -390,7 +390,7 @@ public class BlockSplitter extends AbstractVisitor { && !block.contains(AFlag.MTH_ENTER_BLOCK); } - private static void collectSuccessors(BlockNode startBlock, Set toRemove) { + private static void collectSuccessors(BlockNode startBlock, BlockNode methodEnterBlock, Set toRemove) { Deque stack = new ArrayDeque<>(); stack.add(startBlock); while (!stack.isEmpty()) { @@ -398,7 +398,7 @@ public class BlockSplitter extends AbstractVisitor { if (!toRemove.contains(block)) { toRemove.add(block); for (BlockNode successor : block.getSuccessors()) { - if (toRemove.containsAll(successor.getPredecessors())) { + if (successor != methodEnterBlock && toRemove.containsAll(successor.getPredecessors())) { stack.push(successor); } } diff --git a/jadx-core/src/test/java/jadx/tests/integration/others/TestDeadBlockReferencesStart.java b/jadx-core/src/test/java/jadx/tests/integration/others/TestDeadBlockReferencesStart.java new file mode 100644 index 00000000..891dbd3e --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/others/TestDeadBlockReferencesStart.java @@ -0,0 +1,16 @@ +package jadx.tests.integration.others; + +import org.junit.jupiter.api.Test; + +import jadx.tests.api.SmaliTest; + +import static jadx.tests.api.utils.JadxMatchers.countString; +import static org.hamcrest.MatcherAssert.assertThat; + +public class TestDeadBlockReferencesStart extends SmaliTest { + @Test + public void test() { + String code = getClassNodeFromSmali().getCode().getCodeStr(); + assertThat(code, countString(0, "throw")); + } +} diff --git a/jadx-core/src/test/smali/others/TestDeadBlockReferencesStart.smali b/jadx-core/src/test/smali/others/TestDeadBlockReferencesStart.smali new file mode 100644 index 00000000..0c93538b --- /dev/null +++ b/jadx-core/src/test/smali/others/TestDeadBlockReferencesStart.smali @@ -0,0 +1,11 @@ +.class Lothers/TestDeadBlockReferencesStart; +.super Ljava/lang/Object; + +.method public test()V + .registers 6 + + :start + return-void + + goto :start +.end method -- GitLab