From 4b314e9d9943366256383f6d18a1c44a4ace340a Mon Sep 17 00:00:00 2001 From: Skylot Date: Tue, 19 Nov 2019 18:26:12 +0000 Subject: [PATCH] fix: don't eliminate StringBuilder if no String arg present --- .../core/dex/visitors/SimplifyVisitor.java | 14 ++++++++ .../TestStringBuilderElimination4Neg.java | 33 +++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 jadx-core/src/test/java/jadx/tests/integration/others/TestStringBuilderElimination4Neg.java diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/SimplifyVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/SimplifyVisitor.java index bb1a6c5a3..c693f3efd 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/SimplifyVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/SimplifyVisitor.java @@ -332,6 +332,20 @@ public class SimplifyVisitor extends AbstractVisitor { } args.add(arg); } + + boolean stringArgFound = false; + for (InsnArg arg : args) { + if (arg.getType().equals(ArgType.STRING)) { + stringArgFound = true; + break; + } + } + if (!stringArgFound) { + // TODO: convert one arg to string using `String.valueOf()` + return null; + } + + // all check passed removeStringBuilderInsns(mth, toStrInsn, chain); InsnNode concatInsn = new InsnNode(InsnType.STR_CONCAT, args); diff --git a/jadx-core/src/test/java/jadx/tests/integration/others/TestStringBuilderElimination4Neg.java b/jadx-core/src/test/java/jadx/tests/integration/others/TestStringBuilderElimination4Neg.java new file mode 100644 index 000000000..5fe85a9d5 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/others/TestStringBuilderElimination4Neg.java @@ -0,0 +1,33 @@ +package jadx.tests.integration.others; + +import org.junit.jupiter.api.Test; + +import jadx.core.dex.nodes.ClassNode; +import jadx.tests.api.IntegrationTest; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.MatcherAssert.assertThat; + +public class TestStringBuilderElimination4Neg extends IntegrationTest { + + public static class TestCls { + private K k; + private V v; + + public String test() { + StringBuilder sb = new StringBuilder(); + sb.append(k); + sb.append('='); + sb.append(v); + return sb.toString(); + } + } + + @Test + public void test() { + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + + assertThat(code, containsString("sb.append('=');")); + } +}