From ed8c6626317844f0804876269e30ce998e14df7a Mon Sep 17 00:00:00 2001 From: Skylot Date: Sat, 6 Jul 2019 18:37:34 +0300 Subject: [PATCH] fix: add generic types propagation (#695) --- jadx-core/build.gradle | 5 +- jadx-core/clsp-data/android-29-clst.jar | Bin 0 -> 77171 bytes .../{android-5.1.jar => android-29-res.jar} | Bin 182045 -> 109403 bytes .../src/main/java/jadx/core/clsp/ClsSet.java | 231 ++++++++++-------- .../main/java/jadx/core/clsp/ClspGraph.java | 20 +- .../java/jadx/core/clsp/ConvertToClsSet.java | 2 +- .../src/main/java/jadx/core/clsp/NClass.java | 53 +++- .../src/main/java/jadx/core/clsp/NMethod.java | 65 ++++- .../main/java/jadx/core/codegen/ClassGen.java | 15 +- .../java/jadx/core/codegen/MethodGen.java | 2 +- .../core/dex/instructions/args/ArgType.java | 18 ++ .../core/dex/instructions/args/InsnArg.java | 13 + .../dex/instructions/args/RegisterArg.java | 6 + .../java/jadx/core/dex/nodes/ClassNode.java | 8 +- .../java/jadx/core/dex/nodes/GenericInfo.java | 46 ++++ .../java/jadx/core/dex/nodes/MethodNode.java | 11 +- .../java/jadx/core/dex/nodes/RootNode.java | 28 +++ .../dex/nodes/parser/SignatureParser.java | 18 +- .../core/dex/visitors/PrepareForCodeGen.java | 4 +- .../visitors/regions/LoopRegionVisitor.java | 2 +- .../regions/variables/ProcessVariables.java | 30 ++- .../visitors/typeinference/ITypeBound.java | 4 + .../typeinference/ITypeBoundDynamic.java | 16 ++ .../typeinference/TypeBoundInvokeAssign.java | 77 ++++++ .../typeinference/TypeInferenceVisitor.java | 29 ++- .../visitors/typeinference/TypeUpdate.java | 103 +++++++- .../typeinference/TypeUpdateEntry.java | 4 - .../typeinference/TypeUpdateInfo.java | 16 ++ .../java/jadx/tests/api/IntegrationTest.java | 2 +- .../tests/functional/SignatureParserTest.java | 17 +- .../integration/loops/TestNestedLoops2.java | 2 +- .../integration/types/TestGenerics2.java | 36 +++ .../integration/types/TestGenerics3.java | 57 +++++ .../src/test/smali/types/TestGenerics2.smali | 68 ++++++ 34 files changed, 823 insertions(+), 185 deletions(-) create mode 100644 jadx-core/clsp-data/android-29-clst.jar rename jadx-core/clsp-data/{android-5.1.jar => android-29-res.jar} (58%) create mode 100644 jadx-core/src/main/java/jadx/core/dex/nodes/GenericInfo.java create mode 100644 jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/ITypeBoundDynamic.java create mode 100644 jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeBoundInvokeAssign.java create mode 100644 jadx-core/src/test/java/jadx/tests/integration/types/TestGenerics2.java create mode 100644 jadx-core/src/test/java/jadx/tests/integration/types/TestGenerics3.java create mode 100644 jadx-core/src/test/smali/types/TestGenerics2.smali diff --git a/jadx-core/build.gradle b/jadx-core/build.gradle index f6ccd1389..50fb3e792 100644 --- a/jadx-core/build.gradle +++ b/jadx-core/build.gradle @@ -1,7 +1,6 @@ -ext.jadxClasspath = 'clsp-data/android-5.1.jar' - dependencies { - runtime files(jadxClasspath) + runtime files('clsp-data/android-29-clst.jar') + runtime files('clsp-data/android-29-res.jar') compile files('lib/dx-1.16.jar') // TODO: dx don't support java version > 9 (53) diff --git a/jadx-core/clsp-data/android-29-clst.jar b/jadx-core/clsp-data/android-29-clst.jar new file mode 100644 index 0000000000000000000000000000000000000000..5a4e2de981dcce9a10851669e7dcac889c216adf GIT binary patch literal 77171 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

A-QU!`k8+68?iu6r$5o+F(&vG}DIqQH_DH*R@U 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 delta 73472 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 Q_;+H%0RXpy@PAkT1Gu3vm;e9( diff --git a/jadx-core/src/main/java/jadx/core/clsp/ClsSet.java b/jadx-core/src/main/java/jadx/core/clsp/ClsSet.java index 49205c061..d241c1339 100644 --- a/jadx-core/src/main/java/jadx/core/clsp/ClsSet.java +++ b/jadx-core/src/main/java/jadx/core/clsp/ClsSet.java @@ -12,6 +12,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -22,9 +23,11 @@ import java.util.zip.ZipOutputStream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import jadx.core.dex.info.AccessInfo; import jadx.core.dex.instructions.args.ArgType; import jadx.core.dex.instructions.args.RegisterArg; import jadx.core.dex.nodes.ClassNode; +import jadx.core.dex.nodes.GenericInfo; import jadx.core.dex.nodes.MethodNode; import jadx.core.dex.nodes.RootNode; import jadx.core.utils.exceptions.DecodeException; @@ -55,7 +58,16 @@ public class ClsSet { private NClass[] classes; - public void load(RootNode root) { + public void loadFromClstFile() throws IOException, DecodeException { + try (InputStream input = getClass().getResourceAsStream(CLST_FILENAME)) { + if (input == null) { + throw new JadxRuntimeException("Can't load classpath file: " + CLST_FILENAME); + } + load(input); + } + } + + public void loadFrom(RootNode root) { List list = root.getClasses(true); Map names = new HashMap<>(list.size()); int k = 0; @@ -68,7 +80,8 @@ public class ClsSet { throw new JadxRuntimeException("Duplicate class: " + clsRawName); } k++; - nClass.setMethods(loadMethods(cls, nClass)); + nClass.setGenerics(cls.getGenerics()); + nClass.setMethods(getMethodsDetails(cls)); } else { names.put(clsRawName, null); } @@ -88,45 +101,43 @@ public class ClsSet { } } - private NMethod[] loadMethods(ClassNode cls, NClass nClass) { + private List getMethodsDetails(ClassNode cls) { List methods = new ArrayList<>(); for (MethodNode m : cls.getMethods()) { - if (!m.getAccessFlags().isPublic() - && !m.getAccessFlags().isProtected()) { - continue; - } - - List args = new ArrayList<>(); - - boolean genericArg = false; - for (RegisterArg r : m.getArguments(false)) { - ArgType argType = r.getType(); - if (argType.isGeneric() || argType.isGenericType()) { - args.add(argType); - genericArg = true; - } else { - args.add(null); - } - } - - ArgType retType = m.getReturnType(); - if (!retType.isGeneric() && !retType.isGenericType()) { - retType = null; - } - - boolean varArgs = m.getAccessFlags().isVarArgs(); - - if (genericArg || retType != null || varArgs) { - methods.add(new NMethod( - m.getMethodInfo().getShortId(), - args.isEmpty() - ? new ArgType[0] - : args.toArray(new ArgType[args.size()]), - retType, - varArgs)); + AccessInfo accessFlags = m.getAccessFlags(); + if (accessFlags.isPublic() || accessFlags.isProtected()) { + processMethodDetails(methods, m, accessFlags); } } - return methods.toArray(new NMethod[methods.size()]); + return methods; + } + + private void processMethodDetails(List methods, MethodNode mth, AccessInfo accessFlags) { + List args = mth.getArguments(false); + boolean genericArg = false; + ArgType[] genericArgs; + if (args.isEmpty()) { + genericArgs = null; + } else { + int argsCount = args.size(); + genericArgs = new ArgType[argsCount]; + for (int i = 0; i < argsCount; i++) { + RegisterArg arg = args.get(i); + ArgType argType = arg.getType(); + if (argType.isGeneric() || argType.isGenericType()) { + genericArgs[i] = argType; + genericArg = true; + } + } + } + ArgType retType = mth.getReturnType(); + if (!retType.isGeneric() && !retType.isGenericType()) { + retType = null; + } + boolean varArgs = accessFlags.isVarArgs(); + if (genericArg || retType != null || varArgs) { + methods.add(new NMethod(mth.getMethodInfo().getShortId(), genericArgs, retType, varArgs)); + } } public static NClass[] makeParentsArray(ClassNode cls, Map names) { @@ -207,42 +218,58 @@ public class ClsSet { for (NClass parent : parents) { out.writeInt(parent.getId()); } - NMethod[] methods = cls.getMethods(); - out.writeByte(methods.length); + writeGenerics(out, cls, names); + List methods = cls.getMethodsList(); + out.writeByte(methods.size()); for (NMethod method : methods) { writeMethod(out, method, names); } } } + private static void writeGenerics(DataOutputStream out, NClass cls, Map names) throws IOException { + List genericsList = cls.getGenerics(); + out.writeByte(genericsList.size()); + for (GenericInfo genericInfo : genericsList) { + writeArgType(out, genericInfo.getGenericType(), names); + List extendsList = genericInfo.getExtendsList(); + out.writeByte(extendsList.size()); + for (ArgType type : extendsList) { + writeArgType(out, type, names); + } + + } + } + private static void writeMethod(DataOutputStream out, NMethod method, Map names) throws IOException { - int argCount = 0; - ArgType[] argTypes = method.getArgType(); - for (ArgType arg : argTypes) { - if (arg != null) { - argCount++; - } - } - writeLongString(out, method.getShortId()); - out.writeByte(argCount); - // last argument first - for (int i = argTypes.length - 1; i >= 0; i--) { - ArgType argType = argTypes[i]; - if (argType != null) { - out.writeByte(i); - writeArgType(out, argType, names); + ArgType[] argTypes = method.getGenericArgs(); + if (argTypes == null) { + out.writeByte(0); + } else { + int argCount = 0; + for (ArgType arg : argTypes) { + if (arg != null) { + argCount++; + } + } + out.writeByte(argCount); + // last argument first + for (int i = argTypes.length - 1; i >= 0; i--) { + ArgType argType = argTypes[i]; + if (argType != null) { + out.writeByte(i); + writeArgType(out, argType, names); + } } } - - if (method.getReturnType() != null) { + if (method.getReturnType() == null) { + out.writeBoolean(false); + } else { out.writeBoolean(true); writeArgType(out, method.getReturnType(), names); - } else { - out.writeBoolean(false); } - out.writeBoolean(method.isVarArgs()); } @@ -283,16 +310,7 @@ public class ClsSet { } } - public void load() throws IOException, DecodeException { - try (InputStream input = getClass().getResourceAsStream(CLST_FILENAME)) { - if (input == null) { - throw new JadxRuntimeException("Can't load classpath file: " + CLST_FILENAME); - } - load(input); - } - } - - public void load(File input) throws IOException, DecodeException { + private void load(File input) throws IOException, DecodeException { String name = input.getName(); try (InputStream inputStream = new FileInputStream(input)) { if (name.endsWith(CLST_EXTENSION)) { @@ -313,7 +331,7 @@ public class ClsSet { } } - public void load(InputStream input) throws IOException, DecodeException { + private void load(InputStream input) throws IOException, DecodeException { try (DataInputStream in = new DataInputStream(input)) { byte[] header = new byte[JADX_CLS_SET_HEADER.length()]; int readHeaderLength = in.read(header); @@ -335,18 +353,46 @@ public class ClsSet { for (int j = 0; j < pCount; j++) { parents[j] = classes[in.readInt()]; } - classes[i].setParents(parents); - - int mCount = in.readByte(); - NMethod[] methods = new NMethod[mCount]; - for (int j = 0; j < mCount; j++) { - methods[j] = readMethod(in); - } - classes[i].setMethods(methods); + NClass nClass = classes[i]; + nClass.setParents(parents); + nClass.setGenerics(readGenerics(in)); + nClass.setMethods(readClsMethods(in)); } } } + private List readGenerics(DataInputStream in) throws IOException { + int count = in.readByte(); + if (count == 0) { + return Collections.emptyList(); + } + List list = new ArrayList<>(count); + for (int i = 0; i < count; i++) { + ArgType genericType = readArgType(in); + List extendsList; + byte extCount = in.readByte(); + if (extCount == 0) { + extendsList = Collections.emptyList(); + } else { + extendsList = new ArrayList<>(extCount); + for (int j = 0; j < extCount; j++) { + extendsList.add(readArgType(in)); + } + } + list.add(new GenericInfo(genericType, extendsList)); + } + return list; + } + + private List readClsMethods(DataInputStream in) throws IOException { + int mCount = in.readByte(); + List methods = new ArrayList<>(mCount); + for (int j = 0; j < mCount; j++) { + methods.add(readMethod(in)); + } + return methods; + } + private NMethod readMethod(DataInputStream in) throws IOException { String shortId = readLongString(in); int argCount = in.readByte(); @@ -372,6 +418,7 @@ public class ClsSet { return bounds == 0 ? ArgType.wildcard() : ArgType.wildcard(readArgType(in), bounds); + case GENERIC: String obj = classes[in.readInt()].getName(); int typeLength = in.readByte(); @@ -385,34 +432,20 @@ public class ClsSet { } } return ArgType.generic(obj, generics); + case GENERIC_TYPE: return ArgType.genericType(readString(in)); + case OBJECT: return ArgType.object(classes[in.readInt()].getName()); + case ARRAY: return ArgType.array(readArgType(in)); + case PRIMITIVE: - int shortName = in.readByte(); - switch (shortName) { - case 'Z': - return ArgType.BOOLEAN; - case 'C': - return ArgType.CHAR; - case 'B': - return ArgType.BYTE; - case 'S': - return ArgType.SHORT; - case 'I': - return ArgType.INT; - case 'F': - return ArgType.FLOAT; - case 'J': - return ArgType.LONG; - case 'D': - return ArgType.DOUBLE; - default: - return ArgType.VOID; - } + char shortName = (char) in.readByte(); + return ArgType.parse(shortName); + default: throw new JadxRuntimeException("Unsupported Arg Type: " + ordinal); } diff --git a/jadx-core/src/main/java/jadx/core/clsp/ClspGraph.java b/jadx-core/src/main/java/jadx/core/clsp/ClspGraph.java index d26090c9b..abdfc9475 100644 --- a/jadx-core/src/main/java/jadx/core/clsp/ClspGraph.java +++ b/jadx-core/src/main/java/jadx/core/clsp/ClspGraph.java @@ -10,15 +10,18 @@ import java.util.Map; import java.util.Set; import java.util.WeakHashMap; +import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import jadx.core.dex.info.MethodInfo; +import jadx.core.dex.instructions.args.ArgType; import jadx.core.dex.nodes.ClassNode; import jadx.core.utils.exceptions.DecodeException; import jadx.core.utils.exceptions.JadxRuntimeException; /** - * Classes hierarchy graph + * Classes hierarchy graph with methods additional info */ public class ClspGraph { private static final Logger LOG = LoggerFactory.getLogger(ClspGraph.class); @@ -30,7 +33,7 @@ public class ClspGraph { public void load() throws IOException, DecodeException { ClsSet set = new ClsSet(); - set.load(); + set.loadFromClstFile(); addClasspath(set); } @@ -62,6 +65,19 @@ public class ClspGraph { return nameMap.containsKey(fullName); } + public NClass getClsDetails(ArgType type) { + return nameMap.get(type.getObject()); + } + + @Nullable + public NMethod getMethodDetails(MethodInfo methodInfo) { + NClass cls = nameMap.get(methodInfo.getDeclClass().getRawName()); + if (cls == null) { + return null; + } + return cls.getMethodsMap().get(methodInfo.getShortId()); + } + private NClass addClass(ClassNode cls) { String rawName = cls.getRawName(); NClass nClass = new NClass(rawName, -1); diff --git a/jadx-core/src/main/java/jadx/core/clsp/ConvertToClsSet.java b/jadx-core/src/main/java/jadx/core/clsp/ConvertToClsSet.java index e27b51a4d..adf4addb2 100644 --- a/jadx-core/src/main/java/jadx/core/clsp/ConvertToClsSet.java +++ b/jadx-core/src/main/java/jadx/core/clsp/ConvertToClsSet.java @@ -49,7 +49,7 @@ public class ConvertToClsSet { root.load(inputFiles); ClsSet set = new ClsSet(); - set.load(root); + set.loadFrom(root); set.save(output); LOG.info("Output: {}", output); LOG.info("done"); diff --git a/jadx-core/src/main/java/jadx/core/clsp/NClass.java b/jadx-core/src/main/java/jadx/core/clsp/NClass.java index d7465c723..08dfac6e8 100644 --- a/jadx-core/src/main/java/jadx/core/clsp/NClass.java +++ b/jadx-core/src/main/java/jadx/core/clsp/NClass.java @@ -1,14 +1,24 @@ package jadx.core.clsp; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import jadx.core.dex.nodes.GenericInfo; + /** * Class node in classpath graph */ public class NClass { private final String name; - private NClass[] parents; - private NMethod[] methods; private final int id; + private NClass[] parents; + private Map methodsMap = Collections.emptyMap(); + private List generics = Collections.emptyList(); public NClass(String name, int id) { this.name = name; @@ -31,6 +41,37 @@ public class NClass { this.parents = parents; } + public Map getMethodsMap() { + return methodsMap; + } + + public List getMethodsList() { + List list = new ArrayList<>(methodsMap.size()); + list.addAll(methodsMap.values()); + Collections.sort(list); + return list; + } + + public void setMethodsMap(Map methodsMap) { + this.methodsMap = Objects.requireNonNull(methodsMap); + } + + public void setMethods(List methods) { + Map map = new HashMap<>(methods.size()); + for (NMethod mth : methods) { + map.put(mth.getShortId(), mth); + } + setMethodsMap(map); + } + + public List getGenerics() { + return generics; + } + + public void setGenerics(List generics) { + this.generics = generics; + } + @Override public int hashCode() { return name.hashCode(); @@ -52,12 +93,4 @@ public class NClass { public String toString() { return name; } - - public void setMethods(NMethod[] methods) { - this.methods = methods; - } - - public NMethod[] getMethods() { - return methods; - } } diff --git a/jadx-core/src/main/java/jadx/core/clsp/NMethod.java b/jadx-core/src/main/java/jadx/core/clsp/NMethod.java index c94c8dc69..a9fff0262 100644 --- a/jadx-core/src/main/java/jadx/core/clsp/NMethod.java +++ b/jadx-core/src/main/java/jadx/core/clsp/NMethod.java @@ -1,20 +1,31 @@ package jadx.core.clsp; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + import jadx.core.dex.instructions.args.ArgType; /** * Generic method node in classpath graph. */ -public class NMethod { +public class NMethod implements Comparable { private final String shortId; - private final ArgType[] argType; + + /** + * Array contains only generic args, others set to 'null', size can be less than total args count + */ + @Nullable + private final ArgType[] genericArgs; + + @Nullable private final ArgType retType; + private final boolean varArgs; - public NMethod(String shortId, ArgType[] argType, ArgType retType, boolean varArgs) { + public NMethod(String shortId, @Nullable ArgType[] genericArgs, @Nullable ArgType retType, boolean varArgs) { this.shortId = shortId; - this.argType = argType; + this.genericArgs = genericArgs; this.retType = retType; this.varArgs = varArgs; } @@ -23,10 +34,21 @@ public class NMethod { return shortId; } - public ArgType[] getArgType() { - return argType; + @Nullable + public ArgType[] getGenericArgs() { + return genericArgs; } + @Nullable + public ArgType getGenericArg(int i) { + ArgType[] args = this.genericArgs; + if (args != null && i < args.length) { + return args[i]; + } + return null; + } + + @Nullable public ArgType getReturnType() { return retType; } @@ -34,4 +56,35 @@ public class NMethod { public boolean isVarArgs() { return varArgs; } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof NMethod)) { + return false; + } + NMethod other = (NMethod) o; + return shortId.equals(other.shortId); + } + + @Override + public int hashCode() { + return shortId.hashCode(); + } + + @Override + public int compareTo(@NotNull NMethod other) { + return this.shortId.compareTo(other.shortId); + } + + @Override + public String toString() { + return "NMethod{'" + shortId + '\'' + + ", argTypes=" + genericArgs + + ", retType=" + retType + + ", varArgs=" + varArgs + + '}'; + } } diff --git a/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java b/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java index 00610c444..3adcc830a 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java @@ -5,8 +5,6 @@ import java.util.Comparator; import java.util.HashSet; import java.util.Iterator; import java.util.List; -import java.util.Map; -import java.util.Map.Entry; import java.util.Set; import com.android.dx.rop.code.AccessFlags; @@ -27,6 +25,7 @@ import jadx.core.dex.instructions.mods.ConstructorInsn; import jadx.core.dex.nodes.ClassNode; import jadx.core.dex.nodes.DexNode; import jadx.core.dex.nodes.FieldNode; +import jadx.core.dex.nodes.GenericInfo; import jadx.core.dex.nodes.InsnNode; import jadx.core.dex.nodes.MethodNode; import jadx.core.dex.nodes.parser.FieldInitAttr; @@ -143,7 +142,7 @@ public class ClassGen { clsCode.attachDefinition(cls); clsCode.add(cls.getClassInfo().getAliasShortName()); - addGenericMap(clsCode, cls.getGenericMap(), true); + addGenericMap(clsCode, cls.getGenerics(), true); clsCode.add(' '); ArgType sup = cls.getSuperClass(); @@ -174,23 +173,23 @@ public class ClassGen { } } - public boolean addGenericMap(CodeWriter code, Map> gmap, boolean classDeclaration) { - if (gmap == null || gmap.isEmpty()) { + public boolean addGenericMap(CodeWriter code, List generics, boolean classDeclaration) { + if (generics == null || generics.isEmpty()) { return false; } code.add('<'); int i = 0; - for (Entry> e : gmap.entrySet()) { - ArgType type = e.getKey(); - List list = e.getValue(); + for (GenericInfo genericInfo : generics) { if (i != 0) { code.add(", "); } + ArgType type = genericInfo.getGenericType(); if (type.isGenericType()) { code.add(type.getObject()); } else { useClass(code, type); } + List list = genericInfo.getExtendsList(); if (list != null && !list.isEmpty()) { code.add(" extends "); for (Iterator it = list.iterator(); it.hasNext();) { diff --git a/jadx-core/src/main/java/jadx/core/codegen/MethodGen.java b/jadx-core/src/main/java/jadx/core/codegen/MethodGen.java index 42e4d2466..1d8e0faf4 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/MethodGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/MethodGen.java @@ -99,7 +99,7 @@ public class MethodGen { code.add(mth.isVirtual() ? "/* virtual */ " : "/* direct */ "); } - if (classGen.addGenericMap(code, mth.getGenericMap(), false)) { + if (classGen.addGenericMap(code, mth.getGenerics(), false)) { code.add(' '); } if (ai.isConstructor()) { diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/args/ArgType.java b/jadx-core/src/main/java/jadx/core/dex/instructions/args/ArgType.java index 9bf57accf..28da64260 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/args/ArgType.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/args/ArgType.java @@ -622,6 +622,24 @@ public abstract class ArgType { return 1; } + public boolean containsGenericType() { + if (isGenericType()) { + return true; + } + if (isGeneric()) { + ArgType[] genericTypes = getGenericTypes(); + if (genericTypes != null) { + for (ArgType genericType : genericTypes) { + if (genericType.containsGenericType()) { + return true; + } + } + } + return false; + } + return false; + } + public static ArgType tryToResolveClassAlias(DexNode dex, ArgType type) { if (!type.isObject() || type.isGenericType()) { return type; diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/args/InsnArg.java b/jadx-core/src/main/java/jadx/core/dex/instructions/args/InsnArg.java index d5124a161..4f18cdc92 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/args/InsnArg.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/args/InsnArg.java @@ -10,6 +10,7 @@ import org.slf4j.LoggerFactory; import com.android.dx.io.instructions.DecodedInstruction; import jadx.core.dex.attributes.AFlag; +import jadx.core.dex.instructions.InsnType; import jadx.core.dex.nodes.InsnNode; import jadx.core.utils.InsnUtils; @@ -109,6 +110,18 @@ public abstract class InsnArg extends Typed { if (i == -1) { return null; } + if (insn.getType() == InsnType.MOVE && this.isRegister()) { + // preserve variable name for move insn (needed in `for-each` loop for iteration variable) + String name = ((RegisterArg) this).getName(); + if (name != null) { + InsnArg arg = insn.getArg(0); + if (arg.isRegister()) { + ((RegisterArg) arg).setNameIfUnknown(name); + } else if (arg.isInsnWrap()) { + ((InsnWrapArg) arg).getWrapInsn().getResult().setNameIfUnknown(name); + } + } + } insn.add(AFlag.WRAPPED); InsnArg arg = wrapArg(insn); parent.setArg(i, arg); diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/args/RegisterArg.java b/jadx-core/src/main/java/jadx/core/dex/instructions/args/RegisterArg.java index 3295987a5..ed03eb8d9 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/args/RegisterArg.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/args/RegisterArg.java @@ -97,6 +97,12 @@ public class RegisterArg extends InsnArg implements Named { } } + public void setNameIfUnknown(String name) { + if (getName() == null) { + setName(name); + } + } + public boolean isNameEquals(InsnArg arg) { String n = getName(); if (n == null || !(arg instanceof Named)) { diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java b/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java index 74542b1e1..152565d16 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java @@ -46,7 +46,7 @@ public class ClassNode extends LineAttrNode implements ILoadable, ICodeNode { private AccessInfo accessFlags; private ArgType superClass; private List interfaces; - private Map> genericMap; + private List generics = Collections.emptyList(); private final List methods; private final List fields; @@ -180,7 +180,7 @@ public class ClassNode extends LineAttrNode implements ILoadable, ICodeNode { } try { // parse class generic map - genericMap = sp.consumeGenericMap(); + generics = sp.consumeGenericMap(); // parse super class signature superClass = sp.consumeType(); // parse interfaces signatures @@ -283,8 +283,8 @@ public class ClassNode extends LineAttrNode implements ILoadable, ICodeNode { return interfaces; } - public Map> getGenericMap() { - return genericMap; + public List getGenerics() { + return generics; } public List getMethods() { diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/GenericInfo.java b/jadx-core/src/main/java/jadx/core/dex/nodes/GenericInfo.java new file mode 100644 index 000000000..e70e5649b --- /dev/null +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/GenericInfo.java @@ -0,0 +1,46 @@ +package jadx.core.dex.nodes; + +import java.util.List; + +import jadx.core.dex.instructions.args.ArgType; + +public class GenericInfo { + private final ArgType genericType; + private final List extendsList; + + public GenericInfo(ArgType genericType, List extendsList) { + this.genericType = genericType; + this.extendsList = extendsList; + } + + public ArgType getGenericType() { + return genericType; + } + + public List getExtendsList() { + return extendsList; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + GenericInfo other = (GenericInfo) o; + return genericType.equals(other.genericType) + && extendsList.equals(other.extendsList); + } + + @Override + public int hashCode() { + return 31 * genericType.hashCode() + extendsList.hashCode(); + } + + @Override + public String toString() { + return "GenericInfo{" + genericType + " extends: " + extendsList + '}'; + } +} 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 9fe3e1996..df3654a1d 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 @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Set; import org.jetbrains.annotations.NotNull; @@ -67,7 +66,7 @@ public class MethodNode extends LineAttrNode implements ILoadable, ICodeNode { private RegisterArg thisArg; private List argsList; private List sVars; - private Map> genericMap; + private List generics; private List blocks; private BlockNode enterBlock; @@ -95,7 +94,7 @@ public class MethodNode extends LineAttrNode implements ILoadable, ICodeNode { // don't unload retType and argsList, will be used in jadx-gui after class unload thisArg = null; sVars = Collections.emptyList(); - genericMap = null; + generics = Collections.emptyList(); instructions = null; blocks = null; enterBlock = null; @@ -174,7 +173,7 @@ public class MethodNode extends LineAttrNode implements ILoadable, ICodeNode { return false; } try { - genericMap = sp.consumeGenericMap(); + generics = sp.consumeGenericMap(); List argsTypes = sp.consumeMethodArgs(); retType = sp.consumeType(); @@ -261,8 +260,8 @@ public class MethodNode extends LineAttrNode implements ILoadable, ICodeNode { return retType; } - public Map> getGenericMap() { - return genericMap; + public List getGenerics() { + return generics; } private static void initTryCatches(MethodNode mth, Code mthCode, InsnNode[] insnByOffset) { diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/RootNode.java b/jadx-core/src/main/java/jadx/core/dex/nodes/RootNode.java index c25249520..a8d2f2294 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/RootNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/RootNode.java @@ -13,16 +13,19 @@ import jadx.api.ResourceFile; import jadx.api.ResourceType; import jadx.api.ResourcesLoader; import jadx.core.clsp.ClspGraph; +import jadx.core.clsp.NMethod; import jadx.core.dex.info.ClassInfo; import jadx.core.dex.info.ConstStorage; import jadx.core.dex.info.FieldInfo; import jadx.core.dex.info.InfoStorage; import jadx.core.dex.info.MethodInfo; +import jadx.core.dex.instructions.args.ArgType; import jadx.core.dex.visitors.typeinference.TypeUpdate; import jadx.core.utils.CacheStorage; import jadx.core.utils.ErrorsCounter; import jadx.core.utils.StringUtils; import jadx.core.utils.android.AndroidResourcesUtils; +import jadx.core.utils.exceptions.DecodeException; import jadx.core.utils.exceptions.JadxRuntimeException; import jadx.core.utils.files.DexFile; import jadx.core.utils.files.InputFile; @@ -191,6 +194,31 @@ public class RootNode { return cls.dex().deepResolveField(cls, field); } + @Nullable + public ArgType getMethodGenericReturnType(MethodInfo callMth) { + MethodNode methodNode = deepResolveMethod(callMth); + if (methodNode != null) { + ArgType returnType = methodNode.getReturnType(); + if (returnType == null) { + try { + methodNode.load(); + returnType = methodNode.getReturnType(); + } catch (DecodeException e) { + LOG.error("Method load error", e); + } + } + if (returnType != null && (returnType.isGeneric() || returnType.isGenericType())) { + return returnType; + } + return null; + } + NMethod methodDetails = clsp.getMethodDetails(callMth); + if (methodDetails != null) { + return methodDetails.getReturnType(); + } + return null; + } + public List getDexNodes() { return dexNodes; } diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/parser/SignatureParser.java b/jadx-core/src/main/java/jadx/core/dex/nodes/parser/SignatureParser.java index 5d7b983e9..dfcc71e38 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/parser/SignatureParser.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/parser/SignatureParser.java @@ -1,10 +1,9 @@ package jadx.core.dex.nodes.parser; +import java.util.ArrayList; import java.util.Collections; -import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; -import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -13,6 +12,7 @@ import jadx.core.Consts; import jadx.core.dex.attributes.IAttributeNode; import jadx.core.dex.attributes.annotations.Annotation; import jadx.core.dex.instructions.args.ArgType; +import jadx.core.dex.nodes.GenericInfo; import jadx.core.utils.exceptions.JadxRuntimeException; public class SignatureParser { @@ -219,11 +219,11 @@ public class SignatureParser { *

* Example: "" */ - public Map> consumeGenericMap() { + public List consumeGenericMap() { if (!lookAhead('<')) { - return Collections.emptyMap(); + return Collections.emptyList(); } - Map> map = new LinkedHashMap<>(2); + List list = new ArrayList<>(); consume('<'); while (true) { if (lookAhead('>') || next() == STOP_CHAR) { @@ -231,15 +231,15 @@ public class SignatureParser { } String id = consumeUntil(':'); if (id == null) { - LOG.error("Can't parse generic map: {}", sign); - return Collections.emptyMap(); + LOG.error("Failed to parse generic map: {}", sign); + return Collections.emptyList(); } tryConsume(':'); List types = consumeExtendsTypesList(); - map.put(ArgType.genericType(id), types); + list.add(new GenericInfo(ArgType.genericType(id), types)); } consume('>'); - return map; + return list; } /** diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/PrepareForCodeGen.java b/jadx-core/src/main/java/jadx/core/dex/visitors/PrepareForCodeGen.java index 2fb10f056..88fca6889 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/PrepareForCodeGen.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/PrepareForCodeGen.java @@ -259,11 +259,11 @@ public class PrepareForCodeGen extends AbstractVisitor { private void addMethodMsg(MethodNode mth) { if (commentedCount > 0) { - String msg = "JADX WARN: Illegal instructions before constructor call commented (this can break semantics)"; + String msg = "Illegal instructions before constructor call commented (this can break semantics)"; if (brokenCode || regionDepth > 1) { mth.addWarn(msg); } else { - mth.addComment(msg); + mth.addComment("JADX WARN: " + msg); } } } 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 a4a6335b0..9b1e170c4 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 @@ -327,7 +327,7 @@ public class LoopRegionVisitor extends AbstractVisitor implements IRegionVisitor LOG.warn("Generic type differs: '{}' and '{}' in {}", gType, varType, mth); return false; } - if (!iterableArg.isRegister()) { + if (!iterableArg.isRegister() || !iterableType.isObject()) { return true; } // TODO: add checks diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/variables/ProcessVariables.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/variables/ProcessVariables.java index b6b5834bb..89424e09c 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/variables/ProcessVariables.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/variables/ProcessVariables.java @@ -26,6 +26,8 @@ import jadx.core.dex.nodes.MethodNode; import jadx.core.dex.regions.loops.LoopRegion; import jadx.core.dex.visitors.AbstractVisitor; import jadx.core.dex.visitors.regions.DepthRegionTraversal; +import jadx.core.dex.visitors.typeinference.TypeCompare; +import jadx.core.dex.visitors.typeinference.TypeCompareEnum; import jadx.core.utils.RegionUtils; import jadx.core.utils.Utils; import jadx.core.utils.exceptions.JadxException; @@ -64,19 +66,25 @@ public class ProcessVariables extends AbstractVisitor { private void checkCodeVars(MethodNode mth, List codeVars) { int unknownTypesCount = 0; for (CodeVar codeVar : codeVars) { - codeVar.getSsaVars().stream() - .filter(ssaVar -> ssaVar.contains(AFlag.IMMUTABLE_TYPE)) - .forEach(ssaVar -> { - ArgType ssaType = ssaVar.getAssign().getInitType(); - if (ssaType.isTypeKnown() && !ssaType.equals(codeVar.getType())) { - mth.addWarn("Incorrect type for immutable var: ssa=" + ssaType - + ", code=" + codeVar.getType() - + ", for " + ssaVar.getDetailedVarInfo(mth)); - } - }); - if (codeVar.getType() == null) { + ArgType codeVarType = codeVar.getType(); + if (codeVarType == null) { codeVar.setType(ArgType.UNKNOWN); unknownTypesCount++; + } else { + codeVar.getSsaVars().stream() + .filter(ssaVar -> ssaVar.contains(AFlag.IMMUTABLE_TYPE)) + .forEach(ssaVar -> { + ArgType ssaType = ssaVar.getAssign().getInitType(); + if (ssaType.isTypeKnown()) { + TypeCompare comparator = mth.root().getTypeUpdate().getComparator(); + TypeCompareEnum result = comparator.compareTypes(ssaType, codeVarType); + if (result == TypeCompareEnum.CONFLICT || result.isNarrow()) { + mth.addWarn("Incorrect type for immutable var: ssa=" + ssaType + + ", code=" + codeVarType + + ", for " + ssaVar.getDetailedVarInfo(mth)); + } + } + }); } } if (unknownTypesCount != 0) { diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/ITypeBound.java b/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/ITypeBound.java index 6d93df77f..f1e932b09 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/ITypeBound.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/ITypeBound.java @@ -5,7 +5,11 @@ import org.jetbrains.annotations.Nullable; import jadx.core.dex.instructions.args.ArgType; import jadx.core.dex.instructions.args.RegisterArg; +/** + * Information to restrict types by applying constraints (or boundaries) + */ public interface ITypeBound { + BoundEnum getBound(); ArgType getType(); diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/ITypeBoundDynamic.java b/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/ITypeBoundDynamic.java new file mode 100644 index 000000000..9611e7fad --- /dev/null +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/ITypeBoundDynamic.java @@ -0,0 +1,16 @@ +package jadx.core.dex.visitors.typeinference; + +import jadx.core.dex.instructions.args.ArgType; + +/** + * 'Dynamic' type bound allows to use requested and not yet applied types + * from {@link TypeUpdateInfo} for more precise restrictions + */ +public interface ITypeBoundDynamic extends ITypeBound { + + /** + * This method will be executed instead of {@link ITypeBound#getType()} + * if {@link TypeUpdateInfo} is available. + */ + ArgType getType(TypeUpdateInfo updateInfo); +} diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeBoundInvokeAssign.java b/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeBoundInvokeAssign.java new file mode 100644 index 000000000..de9cb4cae --- /dev/null +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeBoundInvokeAssign.java @@ -0,0 +1,77 @@ +package jadx.core.dex.visitors.typeinference; + +import jadx.core.dex.instructions.InvokeNode; +import jadx.core.dex.instructions.args.ArgType; +import jadx.core.dex.instructions.args.RegisterArg; +import jadx.core.dex.nodes.RootNode; + +/** + * Special dynamic bound for invoke with generics. + * Bound type calculated using instance generic type. + * TODO: also can depends on argument types + */ +public final class TypeBoundInvokeAssign implements ITypeBoundDynamic { + private final RootNode root; + private final InvokeNode invokeNode; + private final ArgType genericReturnType; + + public TypeBoundInvokeAssign(RootNode root, InvokeNode invokeNode, ArgType genericReturnType) { + this.root = root; + this.invokeNode = invokeNode; + this.genericReturnType = genericReturnType; + } + + @Override + public BoundEnum getBound() { + return BoundEnum.ASSIGN; + } + + @Override + public ArgType getType(TypeUpdateInfo updateInfo) { + return getReturnType(updateInfo.getType(invokeNode.getArg(0))); + } + + @Override + public ArgType getType() { + return getReturnType(invokeNode.getArg(0).getType()); + } + + private ArgType getReturnType(ArgType instanceType) { + ArgType resultGeneric = TypeUpdate.getResultGeneric(root, instanceType, genericReturnType); + if (resultGeneric != null) { + return resultGeneric; + } + return invokeNode.getCallMth().getReturnType(); + } + + @Override + public RegisterArg getArg() { + return invokeNode.getResult(); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + TypeBoundInvokeAssign that = (TypeBoundInvokeAssign) o; + return invokeNode.equals(that.invokeNode); + } + + @Override + public int hashCode() { + return invokeNode.hashCode(); + } + + @Override + public String toString() { + return "InvokeAssign{" + invokeNode.getCallMth().getShortId() + + ", returnType=" + genericReturnType + + ", currentType=" + getType() + + ", instanceArg=" + invokeNode.getArg(0) + + '}'; + } +} 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 37f331298..5e2340a64 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 @@ -16,8 +16,11 @@ import jadx.core.clsp.ClspGraph; import jadx.core.dex.attributes.AFlag; import jadx.core.dex.attributes.AType; import jadx.core.dex.info.ClassInfo; +import jadx.core.dex.info.MethodInfo; import jadx.core.dex.instructions.IndexInsnNode; import jadx.core.dex.instructions.InsnType; +import jadx.core.dex.instructions.InvokeNode; +import jadx.core.dex.instructions.InvokeType; import jadx.core.dex.instructions.PhiInsn; import jadx.core.dex.instructions.args.ArgType; import jadx.core.dex.instructions.args.CodeVar; @@ -51,11 +54,13 @@ import jadx.core.utils.Utils; public final class TypeInferenceVisitor extends AbstractVisitor { private static final Logger LOG = LoggerFactory.getLogger(TypeInferenceVisitor.class); + private RootNode root; private TypeUpdate typeUpdate; @Override public void init(RootNode root) { - typeUpdate = root.getTypeUpdate(); + this.root = root; + this.typeUpdate = root.getTypeUpdate(); } @Override @@ -239,6 +244,10 @@ public final class TypeInferenceVisitor extends AbstractVisitor { } break; + case INVOKE: + addBound(typeInfo, makeAssignInvokeBound((InvokeNode) insn)); + break; + default: ArgType type = insn.getResult().getInitType(); addBound(typeInfo, new TypeBoundConst(BoundEnum.ASSIGN, type)); @@ -246,6 +255,24 @@ public final class TypeInferenceVisitor extends AbstractVisitor { } } + private ITypeBound makeAssignInvokeBound(InvokeNode invokeNode) { + MethodInfo callMth = invokeNode.getCallMth(); + ArgType boundType = callMth.getReturnType(); + ArgType genericReturnType = root.getMethodGenericReturnType(callMth); + if (genericReturnType != null) { + if (genericReturnType.containsGenericType()) { + InvokeType invokeType = invokeNode.getInvokeType(); + if (invokeNode.getArgsCount() != 0 + && invokeType != InvokeType.STATIC && invokeType != InvokeType.SUPER) { + return new TypeBoundInvokeAssign(root, invokeNode, genericReturnType); + } + } else { + boundType = genericReturnType; + } + } + return new TypeBoundConst(BoundEnum.ASSIGN, boundType); + } + @Nullable private ITypeBound makeUseBound(RegisterArg regArg) { InsnNode insn = regArg.getParentInsn(); diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeUpdate.java b/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeUpdate.java index 746f2350b..3abeb8400 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeUpdate.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeUpdate.java @@ -2,23 +2,29 @@ package jadx.core.dex.visitors.typeinference; import java.util.Comparator; import java.util.EnumMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import jadx.core.Consts; +import jadx.core.clsp.NClass; import jadx.core.dex.attributes.AFlag; +import jadx.core.dex.info.MethodInfo; import jadx.core.dex.instructions.InsnType; +import jadx.core.dex.instructions.InvokeNode; import jadx.core.dex.instructions.args.ArgType; import jadx.core.dex.instructions.args.InsnArg; import jadx.core.dex.instructions.args.PrimitiveType; import jadx.core.dex.instructions.args.RegisterArg; import jadx.core.dex.instructions.args.SSAVar; +import jadx.core.dex.nodes.GenericInfo; import jadx.core.dex.nodes.InsnNode; import jadx.core.dex.nodes.RootNode; import jadx.core.utils.exceptions.JadxOverflowException; @@ -34,10 +40,12 @@ public final class TypeUpdate { private static final TypeUpdateFlags FLAGS_EMPTY = new TypeUpdateFlags(); private static final TypeUpdateFlags FLAGS_WIDER = new TypeUpdateFlags().allowWider(); + private final RootNode root; private final Map listenerRegistry; private final TypeCompare comparator; public TypeUpdate(RootNode root) { + this.root = root; this.listenerRegistry = initListenerRegistry(); this.comparator = new TypeCompare(root); } @@ -74,7 +82,7 @@ public final class TypeUpdate { LOG.debug("Applying types, init for {} -> {}", ssaVar, candidateType); updates.forEach(updateEntry -> LOG.debug(" {} -> {}", updateEntry.getType(), updateEntry.getArg())); } - updates.forEach(TypeUpdateEntry::apply); + updateInfo.applyUpdates(); return CHANGED; } @@ -112,7 +120,7 @@ public final class TypeUpdate { private TypeUpdateResult updateTypeForSsaVar(TypeUpdateInfo updateInfo, SSAVar ssaVar, ArgType candidateType) { TypeInfo typeInfo = ssaVar.getTypeInfo(); - if (!inBounds(typeInfo.getBounds(), candidateType)) { + if (!inBounds(updateInfo, typeInfo.getBounds(), candidateType)) { if (Consts.DEBUG) { LOG.debug("Reject type '{}' for {} by bounds: {}", candidateType, ssaVar, typeInfo.getBounds()); } @@ -176,8 +184,17 @@ public final class TypeUpdate { } boolean inBounds(Set bounds, ArgType candidateType) { + return inBounds(null, bounds, candidateType); + } + + private boolean inBounds(@Nullable TypeUpdateInfo updateInfo, Set bounds, ArgType candidateType) { for (ITypeBound bound : bounds) { - ArgType boundType = bound.getType(); + ArgType boundType; + if (updateInfo != null && bound instanceof ITypeBoundDynamic) { + boundType = ((ITypeBoundDynamic) bound).getType(updateInfo); + } else { + boundType = bound.getType(); + } if (boundType != null && !checkBound(candidateType, bound, boundType)) { return false; } @@ -185,10 +202,10 @@ public final class TypeUpdate { return true; } - private boolean inBounds(InsnArg arg, ArgType candidateType) { + private boolean inBounds(TypeUpdateInfo updateInfo, InsnArg arg, ArgType candidateType) { if (arg.isRegister()) { TypeInfo typeInfo = ((RegisterArg) arg).getSVar().getTypeInfo(); - return inBounds(typeInfo.getBounds(), candidateType); + return inBounds(updateInfo, typeInfo.getBounds(), candidateType); } return arg.getType().equals(candidateType); } @@ -258,9 +275,83 @@ public final class TypeUpdate { registry.put(InsnType.NEG, this::suggestAllSameListener); registry.put(InsnType.NOT, this::suggestAllSameListener); registry.put(InsnType.CHECK_CAST, this::checkCastListener); + registry.put(InsnType.INVOKE, this::invokeListener); return registry; } + private TypeUpdateResult invokeListener(TypeUpdateInfo updateInfo, InsnNode insn, InsnArg arg, ArgType candidateType) { + if (insn.getResult() == null) { + return SAME; + } + if (candidateType.isGeneric() || candidateType.isGenericType()) { + InvokeNode invokeNode = (InvokeNode) insn; + MethodInfo callMth = invokeNode.getCallMth(); + if (isAssign(insn, arg)) { + // TODO: implement backward type propagation (from result to instance) + return SAME; + } else { + ArgType returnType = root.getMethodGenericReturnType(callMth); + if (returnType == null) { + return SAME; + } + ArgType resultGeneric = getResultGeneric(root, candidateType, returnType); + if (resultGeneric == null) { + return SAME; + } + return updateTypeChecked(updateInfo, insn.getResult(), resultGeneric); + } + } + return SAME; + } + + @Nullable + public static ArgType getResultGeneric(RootNode root, ArgType instanceType, ArgType genericRetType) { + if (genericRetType == null) { + return null; + } + if (instanceType.isGeneric()) { + NClass clsDetails = root.getClsp().getClsDetails(instanceType); + if (clsDetails == null || clsDetails.getGenerics().isEmpty()) { + return null; + } + List generics = clsDetails.getGenerics(); + ArgType[] actualTypes = instanceType.getGenericTypes(); + if (generics.size() != actualTypes.length) { + return null; + } + Map replaceMap = new LinkedHashMap<>(); + for (int i = 0; i < actualTypes.length; i++) { + ArgType actualType = actualTypes[i]; + ArgType genericType = generics.get(i).getGenericType(); + replaceMap.put(genericType, actualType); + } + return replaceGenericTypes(genericRetType, replaceMap); + } + return null; + } + + private static ArgType replaceGenericTypes(ArgType replaceType, Map replaceMap) { + if (replaceType.isGenericType()) { + return replaceMap.get(replaceType); + } + + ArgType[] genericTypes = replaceType.getGenericTypes(); + if (replaceType.isGeneric() && genericTypes != null && genericTypes.length != 0) { + int size = genericTypes.length; + ArgType[] newTypes = new ArgType[size]; + for (int i = 0; i < size; i++) { + ArgType genericType = genericTypes[i]; + ArgType type = replaceGenericTypes(genericType, replaceMap); + if (type == null) { + type = genericType; + } + newTypes[i] = type; + } + return ArgType.generic(replaceType.getObject(), newTypes); + } + return null; + } + private TypeUpdateResult sameFirstArgListener(TypeUpdateInfo updateInfo, InsnNode insn, InsnArg arg, ArgType candidateType) { InsnArg changeArg = isAssign(insn, arg) ? insn.getArg(0) : insn.getResult(); return updateTypeChecked(updateInfo, changeArg, candidateType); @@ -275,7 +366,7 @@ public final class TypeUpdate { TypeCompareEnum compareTypes = comparator.compareTypes(candidateType, changeArg.getType()); boolean correctType = compareTypes == TypeCompareEnum.EQUAL || (assignChanged ? compareTypes.isWider() : compareTypes.isNarrow()); - if (correctType && inBounds(changeArg, candidateType)) { + if (correctType && inBounds(updateInfo, changeArg, candidateType)) { allowReject = true; } else { return REJECT; diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeUpdateEntry.java b/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeUpdateEntry.java index 0923ea0a2..76448f984 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeUpdateEntry.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeUpdateEntry.java @@ -12,10 +12,6 @@ public final class TypeUpdateEntry { this.type = type; } - public void apply() { - arg.setType(type); - } - public InsnArg getArg() { return arg; } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeUpdateInfo.java b/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeUpdateInfo.java index b6e31df7b..1b2a84ced 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeUpdateInfo.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeUpdateInfo.java @@ -18,6 +18,13 @@ public class TypeUpdateInfo { updates.add(new TypeUpdateEntry(arg, changeType)); } + public void applyUpdates() { + for (TypeUpdateEntry updateEntry : updates) { + InsnArg arg = updateEntry.getArg(); + arg.setType(updateEntry.getType()); + } + } + public boolean isProcessed(InsnArg arg) { if (updates.isEmpty()) { return false; @@ -30,6 +37,15 @@ public class TypeUpdateInfo { return false; } + public ArgType getType(InsnArg arg) { + for (TypeUpdateEntry update : updates) { + if (update.getArg() == arg) { + return update.getType(); + } + } + return arg.getType(); + } + public void rollbackUpdate(InsnArg arg) { updates.removeIf(updateEntry -> updateEntry.getArg() == arg); } diff --git a/jadx-core/src/test/java/jadx/tests/api/IntegrationTest.java b/jadx-core/src/test/java/jadx/tests/api/IntegrationTest.java index 4462e54bf..15020424c 100644 --- a/jadx-core/src/test/java/jadx/tests/api/IntegrationTest.java +++ b/jadx-core/src/test/java/jadx/tests/api/IntegrationTest.java @@ -353,7 +353,7 @@ public abstract class IntegrationTest extends TestUtils { return dynamicCompiler.invoke(cls, methodName, types, args); } - public File getJarForClass(Class cls) throws IOException { + private File getJarForClass(Class cls) throws IOException { List files = compileClass(cls); assertThat("File list is empty", files, not(empty())); diff --git a/jadx-core/src/test/java/jadx/tests/functional/SignatureParserTest.java b/jadx-core/src/test/java/jadx/tests/functional/SignatureParserTest.java index 149bf7dfa..b0a881746 100644 --- a/jadx-core/src/test/java/jadx/tests/functional/SignatureParserTest.java +++ b/jadx-core/src/test/java/jadx/tests/functional/SignatureParserTest.java @@ -1,12 +1,12 @@ package jadx.tests.functional; -import java.util.LinkedHashMap; +import java.util.ArrayList; import java.util.List; -import java.util.Map; import org.junit.jupiter.api.Test; import jadx.core.dex.instructions.args.ArgType; +import jadx.core.dex.nodes.GenericInfo; import jadx.core.dex.nodes.parser.SignatureParser; import static jadx.core.dex.instructions.args.ArgType.INT; @@ -20,7 +20,6 @@ import static jadx.core.dex.instructions.args.ArgType.wildcard; import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.anEmptyMap; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; @@ -92,14 +91,14 @@ class SignatureParserTest { @SuppressWarnings("unchecked") private static void checkGenerics(String g, Object... objs) { - Map> map = new SignatureParser(g).consumeGenericMap(); - Map> expectedMap = new LinkedHashMap<>(); + List genericsList = new SignatureParser(g).consumeGenericMap(); + List expectedList = new ArrayList<>(); for (int i = 0; i < objs.length; i += 2) { ArgType generic = genericType((String) objs[i]); List list = (List) objs[i + 1]; - expectedMap.put(generic, list); + expectedList.add(new GenericInfo(generic, list)); } - assertThat(map, is(expectedMap)); + assertThat(genericsList, is(expectedList)); } @Test @@ -122,7 +121,7 @@ class SignatureParserTest { @Test public void testBadGenericMap() { - Map> map = new SignatureParser(" list = new SignatureParser(" map = this.field; + useInt(map.size()); + Iterator> it = map.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry next = it.next(); + useInt(next.getKey().intValue()); + next.getValue().trim(); + } + } + */ + // @formatter:on + + @Test + public void test() { + ClassNode cls = getClassNodeFromSmali(); + String code = cls.getCode().toString(); + + assertThat(code, containsOne("Entry next")); + assertThat(code, containsOne("useInt(next.getKey().intValue());")); // no Integer cast + } +} diff --git a/jadx-core/src/test/java/jadx/tests/integration/types/TestGenerics3.java b/jadx-core/src/test/java/jadx/tests/integration/types/TestGenerics3.java new file mode 100644 index 000000000..ea5be769e --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/types/TestGenerics3.java @@ -0,0 +1,57 @@ +package jadx.tests.integration.types; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.junit.jupiter.api.Test; + +import jadx.core.dex.nodes.ClassNode; +import jadx.tests.api.IntegrationTest; + +import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.hamcrest.MatcherAssert.assertThat; + +public class TestGenerics3 extends IntegrationTest { + + public static class TestCls { + public static void test() { + List classes = getClasses(); + Collections.sort(classes); + int passed = 0; + for (String cls : classes) { + if (runTest(cls)) { + passed++; + } + } + int failed = classes.size() - passed; + System.out.println("failed: " + failed); + } + + private static boolean runTest(String clsName) { + return false; + } + + private static List getClasses() { + return new ArrayList<>(); + } + } + + @Test + public void test() { + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + + assertThat(code, containsOne("List classes")); + assertThat(code, containsOne("for (String cls : classes) {")); + } + + @Test + public void testNoDebug() { + noDebugInfo(); + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + + assertThat(code, containsOne("List classes")); + } +} diff --git a/jadx-core/src/test/smali/types/TestGenerics2.smali b/jadx-core/src/test/smali/types/TestGenerics2.smali new file mode 100644 index 000000000..3b7519b09 --- /dev/null +++ b/jadx-core/src/test/smali/types/TestGenerics2.smali @@ -0,0 +1,68 @@ +.class public final Ltypes/TestGenerics2; +.super Ljava/lang/Object; +.source "SourceFile" + +# instance fields +.field private field:Ljava/util/Map; + .annotation system Ldalvik/annotation/Signature; + value = { + "Ljava/util/Map<", + "Ljava/lang/Integer;", + "Ljava/lang/String;", + ">;" + } + .end annotation +.end field + +.method public test()V + .registers 5 + + iget-object v4, p0, Ltypes/TestGenerics2;->field:Ljava/util/Map; + + invoke-interface {v4}, Ljava/util/Map;->size()I + move-result v0 + + invoke-static {v0}, Ltypes/TestGenerics2;->useInt(I)V + + invoke-interface {v4}, Ljava/util/Map;->entrySet()Ljava/util/Set; + move-result-object v4 + + invoke-interface {v4}, Ljava/util/Set;->iterator()Ljava/util/Iterator; + move-result-object v4 + + :goto_16 + invoke-interface {v4}, Ljava/util/Iterator;->hasNext()Z + move-result v0 + + if-eqz v0, :ret + + invoke-interface {v4}, Ljava/util/Iterator;->next()Ljava/lang/Object; + move-result-object v0 + + invoke-interface {v0}, Ljava/util/Map$Entry;->getKey()Ljava/lang/Object; + move-result-object v1 + + check-cast v1, Ljava/lang/Integer; + + invoke-virtual {v1}, Ljava/lang/Integer;->intValue()I + move-result v1 + + invoke-static {v1}, Ltypes/TestGenerics2;->useInt(I)V + + invoke-interface {v0}, Ljava/util/Map$Entry;->getValue()Ljava/lang/Object; + move-result-object v0 + + check-cast v0, Ljava/lang/String; + + invoke-interface {v0, p1}, Ljava/lang/String;->trim()Ljava/lang/String; + + goto :goto_16 + + :ret + return-void +.end method + +.method public static useInt(I)V + .registers 3 + return-void +.end method