diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/DepthRegionTraversal.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/DepthRegionTraversal.java index e25174a4c8bce3db0cc09baa1e077da32de83174..bdf2a87f4a4aa49053cffcea396b0ab11eaafa43 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/DepthRegionTraversal.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/DepthRegionTraversal.java @@ -6,10 +6,11 @@ import jadx.core.dex.nodes.IRegion; import jadx.core.dex.nodes.MethodNode; import jadx.core.dex.trycatch.ExceptionHandler; import jadx.core.utils.exceptions.JadxOverflowException; +import jadx.core.utils.exceptions.JadxRuntimeException; public class DepthRegionTraversal { - private static final int ITERATIVE_LIMIT = 500; + private static final int ITERATIVE_LIMIT_MULTIPLIER = 5; private DepthRegionTraversal() { } @@ -21,10 +22,13 @@ public class DepthRegionTraversal { public static void traverseIterative(MethodNode mth, IRegionIterativeVisitor visitor) { boolean repeat; int k = 0; + int limit = ITERATIVE_LIMIT_MULTIPLIER * mth.getBasicBlocks().size(); do { repeat = traverseIterativeStepInternal(mth, visitor, mth.getRegion()); - if (k++ > ITERATIVE_LIMIT) { - throw new JadxOverflowException("Iterative traversal limit reached, method: " + mth); + if (k++ > limit) { + throw new JadxRuntimeException("Iterative traversal limit reached: " + + "limit: " + limit + ", visitor: " + visitor.getClass().getName() + + ", blocks count: " + mth.getBasicBlocks().size()); } } while (repeat); } @@ -32,6 +36,7 @@ public class DepthRegionTraversal { public static void traverseIncludingExcHandlers(MethodNode mth, IRegionIterativeVisitor visitor) { boolean repeat; int k = 0; + int limit = ITERATIVE_LIMIT_MULTIPLIER * mth.getBasicBlocks().size(); do { repeat = traverseIterativeStepInternal(mth, visitor, mth.getRegion()); if (!repeat) { @@ -42,8 +47,10 @@ public class DepthRegionTraversal { } } } - if (k++ > ITERATIVE_LIMIT) { - throw new JadxOverflowException("Iterative traversal limit reached, method: " + mth); + if (k++ > limit) { + throw new JadxRuntimeException("Iterative traversal limit reached: " + + "limit: " + limit + ", visitor: " + visitor.getClass().getName() + + ", blocks count: " + mth.getBasicBlocks().size()); } } while (repeat); } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/IfRegionVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/IfRegionVisitor.java index e0bdc2dc0965825b28f3aab0c30cf6b6a5340b20..dc6b1e3b0d94dd734611ab7f22177ab3a4b03477 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/IfRegionVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/IfRegionVisitor.java @@ -24,6 +24,10 @@ public class IfRegionVisitor extends AbstractVisitor { @Override public void visit(MethodNode mth) { + if (mth.isNoCode()) { + return; + } + DepthRegionTraversal.traverseIterative(mth, TERNARY_VISITOR); DepthRegionTraversal.traverse(mth, PROCESS_IF_REGION_VISITOR); DepthRegionTraversal.traverseIterative(mth, REMOVE_REDUNDANT_ELSE_VISITOR);