Skip to content

Commit

Permalink
fix: remove unreachable blocks (#451)
Browse files Browse the repository at this point in the history
  • Loading branch information
skylot committed Feb 21, 2019
1 parent f8acc31 commit 0fa19fb
Showing 1 changed file with 37 additions and 0 deletions.
@@ -1,7 +1,10 @@
package jadx.core.dex.visitors.blocksmaker;

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
Expand Down Expand Up @@ -47,6 +50,7 @@ public void visit(MethodNode mth) {
removeJumpAttr(mth);
removeInsns(mth);
removeEmptyDetachedBlocks(mth);
removeUnreachableBlocks(mth);
initBlocksInTargetNodes(mth);
}

Expand Down Expand Up @@ -324,4 +328,37 @@ static boolean removeEmptyDetachedBlocks(MethodNode mth) {
&& block.getSuccessors().isEmpty()
);
}

private void removeUnreachableBlocks(MethodNode mth) {
Set<BlockNode> toRemove = new LinkedHashSet<>();
for (BlockNode block : mth.getBasicBlocks()) {
if (block.getPredecessors().isEmpty() && block != mth.getEnterBlock()) {
toRemove.add(block);
collectSuccessors(block, toRemove);
}
}
if (!toRemove.isEmpty()) {
mth.getBasicBlocks().removeIf(toRemove::contains);

int insnsCount = toRemove.stream().mapToInt(block -> block.getInstructions().size()).sum();
mth.addAttr(AType.COMMENTS, "JADX INFO: unreachable blocks removed: " + toRemove.size()
+ ", instructions: " + insnsCount);
}
}

private void collectSuccessors(BlockNode startBlock, Set<BlockNode> toRemove) {
Deque<BlockNode> stack = new ArrayDeque<>();
stack.add(startBlock);
while (!stack.isEmpty()) {
BlockNode block = stack.pop();
if (!toRemove.contains(block)) {
for (BlockNode successor : block.getSuccessors()) {
if (toRemove.containsAll(successor.getPredecessors())) {
stack.push(successor);
}
}
}
toRemove.add(block);
}
}
}

0 comments on commit 0fa19fb

Please sign in to comment.