diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/LoopRegionVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/LoopRegionVisitor.java index bdcfbe466..7b04ab139 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/LoopRegionVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/LoopRegionVisitor.java @@ -104,8 +104,10 @@ public class LoopRegionVisitor extends AbstractVisitor implements IRegionVisitor return false; } // can't make loop if argument from increment instruction is assign in loop - for (InsnArg iArg : incrInsn.getArguments()) { - if (iArg.isRegister() && assignOnlyInLoop(mth, loopRegion, (RegisterArg) iArg)) { + List args = new LinkedList(); + incrInsn.getRegisterArgs(args); + for (RegisterArg iArg : args) { + if (assignOnlyInLoop(mth, loopRegion, (RegisterArg) iArg)) { return false; } } diff --git a/jadx-core/src/test/java/jadx/tests/integration/arith/TestArith3.java b/jadx-core/src/test/java/jadx/tests/integration/arith/TestArith3.java new file mode 100644 index 000000000..8af2a00ea --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/arith/TestArith3.java @@ -0,0 +1,43 @@ +package jadx.tests.integration.arith; + +import jadx.core.dex.nodes.ClassNode; +import jadx.tests.api.IntegrationTest; + +import org.junit.Test; + +import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.not; +import static org.junit.Assert.assertThat; + +public class TestArith3 extends IntegrationTest { + + public static class TestCls { + private int vp; + + private void test(byte[] buffer) { + int n = ((buffer[3] & 255) + 4) + ((buffer[2] & 15) << 8); + while (n + 4 < buffer.length) { + int c = buffer[n] & 255; + int p = (buffer[n + 2] & 255) + ((buffer[n + 1] & 31) << 8); + int len = (buffer[n + 4] & 255) + ((buffer[n + 3] & 15) << 8); + switch (c) { + case 27: + this.vp = p; + break; + } + n += len + 5; + } + } + } + + @Test + public void test() { + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + + assertThat(code, containsOne("while (n + 4 < buffer.length) {")); + assertThat(code, containsOne("n += len + 5;")); + assertThat(code, not(containsString("; n += len + 5) {"))); + } +} diff --git a/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariables5.java b/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariables5.java new file mode 100644 index 000000000..fcc446412 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariables5.java @@ -0,0 +1,56 @@ +package jadx.tests.integration.variables; + +import jadx.core.dex.nodes.ClassNode; +import jadx.tests.api.IntegrationTest; + +import org.junit.Test; + +import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.not; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +public class TestVariables5 extends IntegrationTest { + + public static class TestCls { + public String f = "str//ing"; + private boolean enabled; + + private void testIfInLoop() { + int j = 0; + for (int i = 0; i < f.length(); i++) { + char ch = f.charAt(i); + if (ch == '/') { + j++; + if (j == 2) { + setEnabled(true); + return; + } + } + } + setEnabled(false); + } + + private void setEnabled(boolean b) { + this.enabled = b; + } + + public void check() { + setEnabled(false); + testIfInLoop(); + assertTrue(enabled); + } + } + + @Test + public void test() { + noDebugInfo(); + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + + assertThat(code, not(containsString("int i2++;"))); + assertThat(code, containsOne("int i = 0;")); + assertThat(code, containsOne("i++;")); + } +}