[core] NPE in PrepareForCodeGen-Visitor
Issue details
For this app https://apkpure.net/database-modeler-lite/adrian.adbm/download/1.4 and class com.google.android.gms.measurement.internal.r9 I found a NPE for method H(String, long)
Generated Code is:
/* lots of duplicated blocks warnings */
/* JADX ERROR: NullPointerException in pass: PrepareForCodeGen
java.lang.NullPointerException
at jadx.core.dex.visitors.PrepareForCodeGen.removeInstructions(PrepareForCodeGen.java:118)
at jadx.core.dex.visitors.PrepareForCodeGen.visit(PrepareForCodeGen.java:85)
*/
private final boolean H(java.lang.String r46, long r47) {
/*
Method dump skipped, instruction units count: 3416
To view this dump change 'Code comments level' option to 'DEBUG'
*/
throw new UnsupportedOperationException("Method not decompiled: com.google.android.gms.measurement.internal.r9.H(java.lang.String, long):boolean");
}
A simple check for null (https://github.com/skylot/jadx/commit/146a0fe80a97431bba774a059489c15a4ba8b67f) gives a much better result, even if this fix is not complete. The duplicated blocks warnings are still present, but code is generated.
If this is wrong and result should never be null, skipping instruction remove could still be a workaround + logging "Please report this issue" could be an option.
Fixing all issues of this method is too complex, but perhaps it's possible to find simpler methods with this error.
Tested with latest git.
Relevant log output or stacktrace
ERROR: NullPointerException in pass: PrepareForCodeGen in method: com.google.android.gms.measurement.internal.r9.H(java.lang.String, long):boolean, file: classes.dex
java.lang.NullPointerException: Cannot invoke "jadx.core.dex.instructions.args.RegisterArg.getSVar()" because "result" is null
at jadx.core.dex.visitors.PrepareForCodeGen.removeInstructions(PrepareForCodeGen.java:118)
at jadx.core.dex.visitors.PrepareForCodeGen.visit(PrepareForCodeGen.java:85)
at jadx.core.dex.visitors.DepthTraversal.visit(DepthTraversal.java:25)
at jadx.core.dex.visitors.DepthTraversal.lambda$visit$1(DepthTraversal.java:13)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
at jadx.core.dex.visitors.DepthTraversal.visit(DepthTraversal.java:13)
at jadx.core.ProcessClass.process(ProcessClass.java:82)
at jadx.core.ProcessClass.generateCode(ProcessClass.java:126)
at jadx.core.dex.nodes.ClassNode.generateClassCode(ClassNode.java:405)
at jadx.core.dex.nodes.ClassNode.decompile(ClassNode.java:393)
at jadx.core.dex.nodes.ClassNode.decompile(ClassNode.java:311)
at jadx.gui.treemodel.JClass.lambda$getLoadTask$0(JClass.java:86)
at jadx.core.utils.tasks.TaskExecutor.wrapTask(TaskExecutor.java:198)
at jadx.core.utils.tasks.TaskExecutor.runStages(TaskExecutor.java:173)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
at java.base/java.lang.Thread.run(Thread.java:1583)
Provide sample and class/method full name
App https://apkpure.net/database-modeler-lite/adrian.adbm/download/1.4
Class com.google.android.gms.measurement.internal.r9
Method H(String, long)
Jadx version
1.5.6, latest git
Source: skylot/jadx