diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/InitCodeVariables.java b/jadx-core/src/main/java/jadx/core/dex/visitors/InitCodeVariables.java index 944939995..9df3b6897 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/InitCodeVariables.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/InitCodeVariables.java @@ -52,7 +52,7 @@ public class InitCodeVariables extends AbstractVisitor { } } - private static void initCodeVar(SSAVar ssaVar) { + public static void initCodeVar(SSAVar ssaVar) { if (ssaVar.isCodeVarSet()) { return; } 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 09ae30f4a..8b459f587 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 @@ -401,6 +401,7 @@ public class SimplifyVisitor extends AbstractVisitor { concatInsn.copyAttributesFrom(toStrInsn); concatInsn.remove(AFlag.DONT_GENERATE); concatInsn.remove(AFlag.REMOVE); + checkResult(mth, concatInsn); return concatInsn; } catch (Exception e) { LOG.warn("Can't convert string concatenation: {} insn: {}", mth, toStrInsn, e); @@ -408,6 +409,17 @@ public class SimplifyVisitor extends AbstractVisitor { return null; } + /* String concat without assign to variable will cause compilation error */ + private static void checkResult(MethodNode mth, InsnNode concatInsn) { + if (concatInsn.getResult() == null) { + RegisterArg resArg = InsnArg.reg(0, ArgType.STRING); + SSAVar ssaVar = mth.makeNewSVar(resArg); + InitCodeVariables.initCodeVar(ssaVar); + ssaVar.setType(ArgType.STRING); + concatInsn.setResult(resArg); + } + } + /** * Remove and unbind all instructions with StringBuilder */ diff --git a/jadx-core/src/test/java/jadx/tests/integration/others/TestStringConcatWithoutResult.java b/jadx-core/src/test/java/jadx/tests/integration/others/TestStringConcatWithoutResult.java new file mode 100644 index 000000000..9e2b8ecd8 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/others/TestStringConcatWithoutResult.java @@ -0,0 +1,32 @@ +package jadx.tests.integration.others; + +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import jadx.tests.api.IntegrationTest; + +import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; + +public class TestStringConcatWithoutResult extends IntegrationTest { + private static final Logger LOG = LoggerFactory.getLogger(TestStringConcatWithoutResult.class); + + public static class TestCls { + public static final boolean LOG_DEBUG = false; + + public void test(int i) { + String msg = "Input arg value: " + i; + if (LOG_DEBUG) { + LOG.debug(msg); + } + } + } + + @Test + public void test() { + noDebugInfo(); + assertThat(getClassNode(TestCls.class)) + .code() + .containsOne(" = \"Input arg value: \" + i;"); + } +}