提交 9f06d674 编写于 作者: S Skylot

fix: increase region iterative traversal limit (#767)

上级 f228a721
...@@ -6,10 +6,11 @@ import jadx.core.dex.nodes.IRegion; ...@@ -6,10 +6,11 @@ import jadx.core.dex.nodes.IRegion;
import jadx.core.dex.nodes.MethodNode; import jadx.core.dex.nodes.MethodNode;
import jadx.core.dex.trycatch.ExceptionHandler; import jadx.core.dex.trycatch.ExceptionHandler;
import jadx.core.utils.exceptions.JadxOverflowException; import jadx.core.utils.exceptions.JadxOverflowException;
import jadx.core.utils.exceptions.JadxRuntimeException;
public class DepthRegionTraversal { public class DepthRegionTraversal {
private static final int ITERATIVE_LIMIT = 500; private static final int ITERATIVE_LIMIT_MULTIPLIER = 5;
private DepthRegionTraversal() { private DepthRegionTraversal() {
} }
...@@ -21,10 +22,13 @@ public class DepthRegionTraversal { ...@@ -21,10 +22,13 @@ public class DepthRegionTraversal {
public static void traverseIterative(MethodNode mth, IRegionIterativeVisitor visitor) { public static void traverseIterative(MethodNode mth, IRegionIterativeVisitor visitor) {
boolean repeat; boolean repeat;
int k = 0; int k = 0;
int limit = ITERATIVE_LIMIT_MULTIPLIER * mth.getBasicBlocks().size();
do { do {
repeat = traverseIterativeStepInternal(mth, visitor, mth.getRegion()); repeat = traverseIterativeStepInternal(mth, visitor, mth.getRegion());
if (k++ > ITERATIVE_LIMIT) { if (k++ > limit) {
throw new JadxOverflowException("Iterative traversal limit reached, method: " + mth); throw new JadxRuntimeException("Iterative traversal limit reached: "
+ "limit: " + limit + ", visitor: " + visitor.getClass().getName()
+ ", blocks count: " + mth.getBasicBlocks().size());
} }
} while (repeat); } while (repeat);
} }
...@@ -32,6 +36,7 @@ public class DepthRegionTraversal { ...@@ -32,6 +36,7 @@ public class DepthRegionTraversal {
public static void traverseIncludingExcHandlers(MethodNode mth, IRegionIterativeVisitor visitor) { public static void traverseIncludingExcHandlers(MethodNode mth, IRegionIterativeVisitor visitor) {
boolean repeat; boolean repeat;
int k = 0; int k = 0;
int limit = ITERATIVE_LIMIT_MULTIPLIER * mth.getBasicBlocks().size();
do { do {
repeat = traverseIterativeStepInternal(mth, visitor, mth.getRegion()); repeat = traverseIterativeStepInternal(mth, visitor, mth.getRegion());
if (!repeat) { if (!repeat) {
...@@ -42,8 +47,10 @@ public class DepthRegionTraversal { ...@@ -42,8 +47,10 @@ public class DepthRegionTraversal {
} }
} }
} }
if (k++ > ITERATIVE_LIMIT) { if (k++ > limit) {
throw new JadxOverflowException("Iterative traversal limit reached, method: " + mth); throw new JadxRuntimeException("Iterative traversal limit reached: "
+ "limit: " + limit + ", visitor: " + visitor.getClass().getName()
+ ", blocks count: " + mth.getBasicBlocks().size());
} }
} while (repeat); } while (repeat);
} }
......
...@@ -24,6 +24,10 @@ public class IfRegionVisitor extends AbstractVisitor { ...@@ -24,6 +24,10 @@ public class IfRegionVisitor extends AbstractVisitor {
@Override @Override
public void visit(MethodNode mth) { public void visit(MethodNode mth) {
if (mth.isNoCode()) {
return;
}
DepthRegionTraversal.traverseIterative(mth, TERNARY_VISITOR); DepthRegionTraversal.traverseIterative(mth, TERNARY_VISITOR);
DepthRegionTraversal.traverse(mth, PROCESS_IF_REGION_VISITOR); DepthRegionTraversal.traverse(mth, PROCESS_IF_REGION_VISITOR);
DepthRegionTraversal.traverseIterative(mth, REMOVE_REDUNDANT_ELSE_VISITOR); DepthRegionTraversal.traverseIterative(mth, REMOVE_REDUNDANT_ELSE_VISITOR);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册