From 0d509f94b7da3189b37b74b7e85a9b2cc20291ae Mon Sep 17 00:00:00 2001 From: Skylot Date: Thu, 26 Mar 2015 23:42:08 +0300 Subject: [PATCH] core: fix various processing issues --- .../src/main/java/jadx/core/dex/nodes/BlockNode.java | 3 ++- .../src/main/java/jadx/core/dex/nodes/MethodNode.java | 6 ++++-- .../java/jadx/core/dex/visitors/ConstInlineVisitor.java | 8 ++++++-- .../java/jadx/core/dex/visitors/regions/RegionMaker.java | 6 +++++- .../dex/visitors/typeinference/PostTypeInference.java | 4 +++- .../src/main/java/jadx/gui/settings/JadxSettings.java | 2 +- 6 files changed, 21 insertions(+), 8 deletions(-) diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/BlockNode.java b/jadx-core/src/main/java/jadx/core/dex/nodes/BlockNode.java index 5920d2f94..9ac9821d4 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/BlockNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/BlockNode.java @@ -5,6 +5,7 @@ import jadx.core.dex.attributes.AType; import jadx.core.dex.attributes.AttrNode; import jadx.core.dex.attributes.nodes.IgnoreEdgeAttr; import jadx.core.dex.attributes.nodes.LoopInfo; +import jadx.core.utils.EmptyBitSet; import jadx.core.utils.InsnUtils; import java.util.ArrayList; @@ -24,7 +25,7 @@ public class BlockNode extends AttrNode implements IBlock { private List cleanSuccessors; // all dominators - private BitSet doms; + private BitSet doms = EmptyBitSet.EMPTY; // dominance frontier private BitSet domFrontier; // immediate dominator diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java b/jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java index 10a026183..1a4fc9c65 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java @@ -126,9 +126,11 @@ public class MethodNode extends LineAttrNode implements ILoadable { list.add(resultArg); } insnNode.getRegisterArgs(list); - for (int i = 0, listSize = list.size(); i < listSize; i++) { + int argsCount = list.size(); + for (int i = 0; i < argsCount; i++) { if (list.get(i).getRegNum() >= regsCount) { - throw new JadxRuntimeException("Incorrect register number in instruction: " + insnNode); + throw new JadxRuntimeException("Incorrect register number in instruction: " + insnNode + + ", expected to be less than " + regsCount); } } } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/ConstInlineVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/ConstInlineVisitor.java index 009cd6c54..d4dab6e38 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/ConstInlineVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/ConstInlineVisitor.java @@ -106,13 +106,17 @@ public class ConstInlineVisitor extends AbstractVisitor { continue; } LiteralArg litArg; + ArgType argType = arg.getType(); + if (argType.isObject() && literal != 0) { + argType = ArgType.NARROW_NUMBERS; + } if (use.size() == 1 || arg.isTypeImmutable()) { // arg used only in one place - litArg = InsnArg.lit(literal, arg.getType()); + litArg = InsnArg.lit(literal, argType); } else if (useInsn.getType() == InsnType.MOVE && !useInsn.getResult().getType().isTypeKnown()) { // save type for 'move' instructions (hard to find type in chains of 'move') - litArg = InsnArg.lit(literal, arg.getType()); + litArg = InsnArg.lit(literal, argType); } else { // in most cases type not equal arg.getType() // just set unknown type and run type fixer diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMaker.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMaker.java index 1ce9a5e27..42e64bfaa 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMaker.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMaker.java @@ -912,7 +912,11 @@ public class RegionMaker { handler.setHandlerRegion(makeRegion(start, stack)); ExcHandlerAttr excHandlerAttr = start.get(AType.EXC_HANDLER); - handler.getHandlerRegion().addAttr(excHandlerAttr); + if (excHandlerAttr == null) { + LOG.warn("Missing exception handler attribute for start block"); + } else { + handler.getHandlerRegion().addAttr(excHandlerAttr); + } } static boolean isEqualPaths(BlockNode b1, BlockNode b2) { diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/PostTypeInference.java b/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/PostTypeInference.java index 468cf9d9b..8ca2f26cf 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/PostTypeInference.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/PostTypeInference.java @@ -88,8 +88,10 @@ public class PostTypeInference { case CHECK_CAST: { ArgType castType = (ArgType) ((IndexInsnNode) insn).getIndex(); RegisterArg result = insn.getResult(); + ArgType resultType = result.getType(); // don't override generic types of same base class - boolean skip = castType.isObject() && castType.getObject().equals(result.getType().getObject()); + boolean skip = castType.isObject() && resultType.isObject() + && castType.getObject().equals(resultType.getObject()); if (!skip) { // workaround for compiler bug (see TestDuplicateCast) result.getSVar().setType(castType); diff --git a/jadx-gui/src/main/java/jadx/gui/settings/JadxSettings.java b/jadx-gui/src/main/java/jadx/gui/settings/JadxSettings.java index c037b1289..82f0d4d02 100644 --- a/jadx-gui/src/main/java/jadx/gui/settings/JadxSettings.java +++ b/jadx-gui/src/main/java/jadx/gui/settings/JadxSettings.java @@ -18,7 +18,7 @@ public class JadxSettings extends JadxCLIArgs { private static final Font DEFAULT_FONT = new JLabel().getFont(); static final Set SKIP_FIELDS = new HashSet(Arrays.asList( - "files", "input", "outputDir", "printHelp" + "files", "input", "outputDir", "verbose", "printHelp" )); private String lastOpenFilePath = USER_HOME;