From 5c75f249c736d819b04138c3e86a54c54b6839ac Mon Sep 17 00:00:00 2001 From: Jonas Konrad Date: Tue, 1 Dec 2020 11:39:48 +0100 Subject: [PATCH] fix: do not count nop instructions when considering methods for fallback mode printing (#1038) (PR #1039) --- .../java/jadx/core/codegen/MethodGen.java | 8 +- .../fallback/TestFallbackManyNops.java | 27 ++++ .../smali/fallback/TestFallbackManyNops.smali | 117 ++++++++++++++++++ 3 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 jadx-core/src/test/java/jadx/tests/integration/fallback/TestFallbackManyNops.java create mode 100644 jadx-core/src/test/smali/fallback/TestFallbackManyNops.smali diff --git a/jadx-core/src/main/java/jadx/core/codegen/MethodGen.java b/jadx-core/src/main/java/jadx/core/codegen/MethodGen.java index e6b63a2d..786d0a63 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/MethodGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/MethodGen.java @@ -3,6 +3,8 @@ package jadx.core.codegen; import java.util.Collections; import java.util.Iterator; import java.util.List; +import java.util.Objects; +import java.util.stream.Stream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -290,7 +292,11 @@ public class MethodGen { code.startLine("// Can't load method instructions."); return; } - if (insnArr.length > 100) { + long insnCountEstimate = Stream.of(insnArr) + .filter(Objects::nonNull) + .filter(insn -> insn.getType() != InsnType.NOP) + .count(); + if (insnCountEstimate > 100) { code.startLine("// Method dump skipped, instructions count: " + insnArr.length); return; } diff --git a/jadx-core/src/test/java/jadx/tests/integration/fallback/TestFallbackManyNops.java b/jadx-core/src/test/java/jadx/tests/integration/fallback/TestFallbackManyNops.java new file mode 100644 index 00000000..54d72a3b --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/fallback/TestFallbackManyNops.java @@ -0,0 +1,27 @@ +package jadx.tests.integration.fallback; + +import org.junit.jupiter.api.Test; + +import jadx.core.dex.nodes.ClassNode; +import jadx.tests.api.SmaliTest; + +import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.MatcherAssert.assertThat; + +public class TestFallbackManyNops extends SmaliTest { + + @Test + public void test() { + setFallback(); + disableCompilation(); + + ClassNode cls = getClassNodeFromSmali(); + String code = cls.getCode().toString(); + + assertThat(code, containsString("public static void test() {")); + assertThat(code, containsOne("return")); + assertThat(code, not(containsString("Method dump skipped"))); + } +} diff --git a/jadx-core/src/test/smali/fallback/TestFallbackManyNops.smali b/jadx-core/src/test/smali/fallback/TestFallbackManyNops.smali new file mode 100644 index 00000000..1c158321 --- /dev/null +++ b/jadx-core/src/test/smali/fallback/TestFallbackManyNops.smali @@ -0,0 +1,117 @@ +.class public Lfallback/TestFallbackManyNops; +.super Ljava/lang/Object; + +.method public static test()V + .registers 1 + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + return-void +.end method -- GitLab