From 2dea6f55b57fc9a185cbc735d6470315bfb61656 Mon Sep 17 00:00:00 2001 From: Skylot Date: Sat, 22 Dec 2018 17:08:06 +0300 Subject: [PATCH] fix: add more details for variable with type inference error --- .../core/dex/instructions/args/SSAVar.java | 46 +++++++++++++++++++ .../typeinference/TypeInferenceVisitor.java | 2 +- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/args/SSAVar.java b/jadx-core/src/main/java/jadx/core/dex/instructions/args/SSAVar.java index 68f4d5362..076296a84 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/args/SSAVar.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/args/SSAVar.java @@ -1,13 +1,19 @@ package jadx.core.dex.instructions.args; import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import jadx.core.dex.attributes.AType; import jadx.core.dex.attributes.AttrNode; +import jadx.core.dex.attributes.nodes.RegDebugInfoAttr; import jadx.core.dex.instructions.PhiInsn; +import jadx.core.dex.nodes.MethodNode; import jadx.core.dex.visitors.typeinference.TypeInfo; public class SSAVar extends AttrNode { @@ -146,4 +152,44 @@ public class SSAVar extends AttrNode { public String toString() { return "r" + regNum + ":" + version + " " + typeInfo.getType(); } + + public String getDetailedVarInfo(MethodNode mth) { + Set types = new HashSet<>(); + Set names = Collections.emptySet(); + + List useArgs = new ArrayList<>(1 + useList.size()); + useArgs.add(assign); + useArgs.addAll(useList); + + if (mth.contains(AType.LOCAL_VARS_DEBUG_INFO)) { + names = new HashSet<>(); + for (RegisterArg arg : useArgs) { + RegDebugInfoAttr debugInfoAttr = arg.get(AType.REG_DEBUG_INFO); + if (debugInfoAttr != null) { + names.add(debugInfoAttr.getName()); + types.add(debugInfoAttr.getRegType()); + } + } + } + + for (RegisterArg arg : useArgs) { + ArgType initType = arg.getInitType(); + if (initType.isTypeKnown()) { + types.add(initType); + } + ArgType type = arg.getType(); + if (type.isTypeKnown()) { + types.add(type); + } + } + StringBuilder sb = new StringBuilder(); + sb.append('r').append(regNum).append('v').append(version); + if (!names.isEmpty()) { + sb.append(", names: ").append(names); + } + if (!types.isEmpty()) { + sb.append(", types: ").append(types); + } + return sb.toString(); + } } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeInferenceVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeInferenceVisitor.java index 37d692164..6827ac908 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeInferenceVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeInferenceVisitor.java @@ -60,7 +60,7 @@ public final class TypeInferenceVisitor extends AbstractVisitor { if (type != null && !type.isTypeKnown()) { boolean changed = tryAllTypes(var, type); if (!changed) { - mth.addComment("JADX WARNING: type inference failed for: " + var + ", bounds: " + typeInfo.getBounds()); + mth.addComment("JADX WARNING: type inference failed for: " + var.getDetailedVarInfo(mth)); } } });