diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/blocks/BlockExceptionHandler.java b/jadx-core/src/main/java/jadx/core/dex/visitors/blocks/BlockExceptionHandler.java index 362ac072f18f27010f88996226c049e1d5c45aaf..9f8c3961ce3a76aea43eeffc77973f1dc8287537 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/blocks/BlockExceptionHandler.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/blocks/BlockExceptionHandler.java @@ -390,15 +390,23 @@ public class BlockExceptionHandler { private static BlockNode searchTopBlock(MethodNode mth, List blocks) { BlockNode top = BlockUtils.getTopBlock(blocks); if (top != null) { - return top; + return adjustTopBlock(top); } BlockNode topDom = BlockUtils.getCommonDominator(mth, blocks); if (topDom != null) { - return topDom; + return adjustTopBlock(topDom); } throw new JadxRuntimeException("Failed to find top block for try-catch from: " + blocks); } + private static BlockNode adjustTopBlock(BlockNode topBlock) { + if (topBlock.getSuccessors().size() == 1 && !topBlock.contains(AType.EXC_CATCH)) { + // top block can be lifted by other exception handlers included in blocks list, trying to undo that + return topBlock.getSuccessors().get(0); + } + return topBlock; + } + @Nullable private static BlockNode searchBottomBlock(MethodNode mth, List blocks) { // search common post-dominator block inside input set diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/ssa/SSATransform.java b/jadx-core/src/main/java/jadx/core/dex/visitors/ssa/SSATransform.java index 656ce5fa8987c778a91efa0c052442a2e527d47b..0801e0b85b462a5ba5319c9a0d4d4c41296cb47b 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/ssa/SSATransform.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/ssa/SSATransform.java @@ -140,7 +140,7 @@ public class SSATransform extends AbstractVisitor { stack.push(initState); while (!stack.isEmpty()) { RenameState state = stack.pop(); - renameVarsInBlock(state); + renameVarsInBlock(mth, state); for (BlockNode dominated : state.getBlock().getDominatesOn()) { stack.push(RenameState.copyFrom(state, dominated)); } @@ -156,7 +156,7 @@ public class SSATransform extends AbstractVisitor { } } - private static void renameVarsInBlock(RenameState state) { + private static void renameVarsInBlock(MethodNode mth, RenameState state) { BlockNode block = state.getBlock(); for (InsnNode insn : block.getInstructions()) { if (insn.getType() != InsnType.PHI) { @@ -168,8 +168,9 @@ public class SSATransform extends AbstractVisitor { int regNum = reg.getRegNum(); SSAVar var = state.getVar(regNum); if (var == null) { - throw new JadxRuntimeException("Not initialized variable reg: " + regNum - + ", insn: " + insn + ", block:" + block); + // TODO: in most cases issue in incorrectly attached exception handlers + mth.addWarnComment("Not initialized variable reg: " + regNum + ", insn: " + insn + ", block:" + block); + var = state.startVar(reg); } var.use(reg); } diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally8.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally8.java index a30f17d463a08daef4878df9a4e9b40f5b578a59..3424583ebfa65141d4ea7d068ad7cc98d7ea761a 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally8.java +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally8.java @@ -55,7 +55,6 @@ public class TestTryCatchFinally8 extends IntegrationTest { } @Test - @NotYetImplemented public void test2() { disableCompilation(); ClassNode cls = getClassNode(TestCls.class);