diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/BlockNode.java b/jadx-core/src/main/java/jadx/core/dex/nodes/BlockNode.java index 003d5f22c..73acca6da 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/BlockNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/BlockNode.java @@ -14,6 +14,7 @@ import jadx.core.dex.attributes.nodes.LoopInfo; import jadx.core.utils.BlockUtils; import jadx.core.utils.EmptyBitSet; import jadx.core.utils.InsnUtils; +import jadx.core.utils.exceptions.JadxRuntimeException; import static jadx.core.utils.Utils.lockList; @@ -70,6 +71,9 @@ public class BlockNode extends AttrNode implements IBlock { successors = lockList(successors); predecessors = lockList(predecessors); dominatesOn = lockList(dominatesOn); + if (domFrontier == null) { + throw new JadxRuntimeException("Dominance frontier not set for block: " + this); + } } /** diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/blocksmaker/BlockFinallyExtract.java b/jadx-core/src/main/java/jadx/core/dex/visitors/blocksmaker/BlockFinallyExtract.java index e08d28fbe..affa9da84 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/blocksmaker/BlockFinallyExtract.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/blocksmaker/BlockFinallyExtract.java @@ -8,6 +8,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -194,11 +195,21 @@ public class BlockFinallyExtract extends AbstractVisitor { laBefore.runAnalysis(); } + int removeApplied = 0; for (BlocksRemoveInfo removeInfo : removes) { - if (!applyRemove(mth, removeInfo)) { - return false; + if (applyRemove(mth, removeInfo)) { + removeApplied++; + removeInfo.setApplied(true); } } + if (removeApplied == 0) { + return false; + } + if (removeApplied != removes.size()) { + throw new JadxRuntimeException("Some finally instructions failed to remove: " + + removes.stream().filter(n -> !n.isApplied()).map(BlocksRemoveInfo::toString).collect(Collectors.joining(",")) + ); + } LiveVarAnalysis laAfter = null; diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/blocksmaker/helpers/BlocksRemoveInfo.java b/jadx-core/src/main/java/jadx/core/dex/visitors/blocksmaker/helpers/BlocksRemoveInfo.java index a1bcac243..aba9b5bee 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/blocksmaker/helpers/BlocksRemoveInfo.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/blocksmaker/helpers/BlocksRemoveInfo.java @@ -23,6 +23,8 @@ public final class BlocksRemoveInfo { private BlockNode startPredecessor; + private boolean applied; + public BlocksRemoveInfo(BlocksPair start) { this.start = start; } @@ -99,13 +101,22 @@ public final class BlocksRemoveInfo { return null; } + public boolean isApplied() { + return applied; + } + + public void setApplied(boolean applied) { + this.applied = applied; + } + @Override public String toString() { - return "BRI start: " + start + return "BRI{start: " + start + ", end: " + end - + ", list: " + processed + + ", processed: " + processed + ", outs: " + outs + ", regMap: " + regMap - + ", split: " + startSplitIndex; + + ", split: " + startSplitIndex + "-" + endSplitIndex + + "}"; } }