diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/InsnDecoder.java b/jadx-core/src/main/java/jadx/core/dex/instructions/InsnDecoder.java index 9655c7ac05e0f0f62740485afe50596cde12cb54..8ea513a852022bd1acff07a5052419c45cd655c5 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/InsnDecoder.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/InsnDecoder.java @@ -473,7 +473,7 @@ public class InsnDecoder { case Opcodes.ARRAY_LENGTH: { InsnNode node = new InsnNode(InsnType.ARRAY_LENGTH, 1); node.setResult(InsnArg.reg(insn, 0, ArgType.INT)); - node.addArg(InsnArg.reg(insn, 1, ArgType.unknown(PrimitiveType.ARRAY))); + node.addArg(InsnArg.reg(insn, 1, ArgType.array(ArgType.UNKNOWN))); return node; } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/ConstInlinerVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/ConstInlinerVisitor.java index 58943074dac2480d5599b5147d30e22b7cd20e8c..a3d1fb3fc9651c7fc3cbdc2d35488121968e901a 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/ConstInlinerVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/ConstInlinerVisitor.java @@ -54,7 +54,6 @@ public class ConstInlinerVisitor extends AbstractVisitor { private static boolean replaceConst(MethodNode mth, BlockNode block, InsnNode insn, long literal) { List use = insn.getResult().getTypedVar().getUseList(); - int replace = 0; for (InsnArg arg : use) { InsnNode useInsn = arg.getParentInsn(); @@ -64,9 +63,15 @@ public class ConstInlinerVisitor extends AbstractVisitor { BlockNode useBlock = BlockUtils.getBlockByInsn(mth, useInsn); if (useBlock == block || useBlock.isDominator(block)) { if (arg != insn.getResult() && !registerReassignOnPath(block, useBlock, insn)) { - // in most cases type not equal arg.getType() - // just set unknown type and run type fixer - LiteralArg litArg = InsnArg.lit(literal, ArgType.UNKNOWN); + LiteralArg litArg; + if (use.size() == 2) { + // arg used only in one place + litArg = InsnArg.lit(literal, arg.getType()); + } else { + // in most cases type not equal arg.getType() + // just set unknown type and run type fixer + litArg = InsnArg.lit(literal, ArgType.UNKNOWN); + } if (useInsn.replaceArg(arg, litArg)) { fixTypes(mth, useInsn, litArg); replace++; diff --git a/jadx-core/src/test/java/jadx/tests/internal/TestWrongCode.java b/jadx-core/src/test/java/jadx/tests/internal/TestWrongCode.java new file mode 100644 index 0000000000000000000000000000000000000000..b22baad5fdd2e76cd81f59ce36ec28289be9d740 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/internal/TestWrongCode.java @@ -0,0 +1,29 @@ +package jadx.tests.internal; + +import jadx.api.InternalJadxTest; +import jadx.core.dex.nodes.ClassNode; + +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.not; +import static org.junit.Assert.assertThat; + +public class TestWrongCode extends InternalJadxTest { + + public static class TestCls { + private int f() { + int[] a = null; + return a.length; + } + } + + @Test + public void test() { + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + + assertThat(code, not(containsString("return false.length;"))); + assertThat(code, containsString("return null.length;")); + } +}