diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/IfNode.java b/jadx-core/src/main/java/jadx/core/dex/instructions/IfNode.java index 35d870771..021623d00 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/IfNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/IfNode.java @@ -14,9 +14,11 @@ import static jadx.core.utils.BlockUtils.selectOther; public class IfNode extends GotoNode { + // change default types priority private static final ArgType ARG_TYPE = ArgType.unknown( - PrimitiveType.INT, PrimitiveType.OBJECT, PrimitiveType.ARRAY, - PrimitiveType.BOOLEAN, PrimitiveType.SHORT, PrimitiveType.CHAR); + PrimitiveType.INT, + PrimitiveType.OBJECT, PrimitiveType.ARRAY, + PrimitiveType.BOOLEAN, PrimitiveType.BYTE, PrimitiveType.SHORT, PrimitiveType.CHAR); protected IfOp op; diff --git a/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver4.java b/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver4.java new file mode 100644 index 000000000..a4e2c5965 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver4.java @@ -0,0 +1,52 @@ +package jadx.tests.integration.types; + +import jadx.core.dex.nodes.ClassNode; +import jadx.tests.api.IntegrationTest; + +import java.util.Arrays; + +import org.junit.Test; + +import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + +public class TestTypeResolver4 extends IntegrationTest { + + public static class TestCls { + + private static String test(byte[] strArray, int offset) { + int len = strArray.length; + int start = offset + f(strArray, offset); + int end = start; + while (end + 1 < len && (strArray[end] != 0 || strArray[end + 1] != 0)) { + end += 2; + } + byte[] arr = Arrays.copyOfRange(strArray, start, end); + return new String(arr); + } + + private static int f(byte[] strArray, int offset) { + return 0; + } + + public void check() { + String test = test(("1234" + "utfstr\0\0" + "4567").getBytes(), 4); + assertThat(test, is("utfstr")); + } + } + + @Test + public void test() { + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + + assertThat(code, containsOne("(strArray[end] != (byte) 0 || strArray[end + 1] != (byte) 0)")); + } + + @Test + public void test2() { + noDebugInfo(); + getClassNode(TestCls.class); + } +}