Issue details
platform
- macos 14.6.1 (23G93)
- jdk (Zulu 8.78.0.19-CA-macos-aarch64)
- Decompilation tools (jadx-gui 1.4.7)
- javassist (3.30.2-GA)
test code
public class Test {
@Test
@SneakyThrows
@DisplayName("test Handler")
public void test() {
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("Point");
CtMethod method = cc.getDeclaredMethod("parseIntDefault");
method.instrument(
new ExprEditor() {
@Override
public void edit(Handler h) throws CannotCompileException {
// Here the code will print an output in the catch code block
h.insertBefore("{ System.out.println(\"Before println\"); }");
}
}
);
cc.writeFile();
}
}
class Point {
public int parseIntDefault(String num, int defaultNum) {
try{
return Integer.parseInt(num);
} catch (NumberFormatException e) {
e.printStackTrace();
}
return defaultNum;
}
}
Decompile and view source code
/* compiled from: Test.java */
/* loaded from: Point.class */
class Point {
Point() {
}
/* JADX ERROR: IndexOutOfBoundsException in pass: SSATransform
java.lang.IndexOutOfBoundsException: bitIndex < 0: -1
at java.util.BitSet.set(BitSet.java:444)
at jadx.core.dex.visitors.ssa.LiveVarAnalysis.fillBasicBlockInfo(LiveVarAnalysis.java:73)
at jadx.core.dex.visitors.ssa.LiveVarAnalysis.runAnalysis(LiveVarAnalysis.java:36)
at jadx.core.dex.visitors.ssa.SSATransform.process(SSATransform.java:55)
at jadx.core.dex.visitors.ssa.SSATransform.visit(SSATransform.java:41)
*/
public int parseIntDefault(java.lang.String r5, int r6) {
/*
r4 = this;
r0 = r5
int r0 = java.lang.Integer.parseInt(r0) // Catch: java.lang.NumberFormatException -> Lc
return r0
L5:
r7 = r-1
r-1 = r7
r-1.printStackTrace()
r-1 = r6
return r-1
Lc:
r8 = move-exception
java.io.PrintStream r-1 = java.lang.System.out
java.lang.String r0 = "Before println"
r-1.println(r0)
r-1 = r8
goto L5
*/
throw new UnsupportedOperationException("Method not decompiled: Point.parseIntDefault(java.lang.String, int):int");
}
}
Initially I suspected it was a bug in the javassist library, but after executing the code I found that it worked properly.
public class Test {
@Test
@SneakyThrows
@DisplayName("test Handler")
public void test() {
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("Point");
CtMethod method = cc.getDeclaredMethod("parseIntDefault");
method.instrument(
new ExprEditor() {
@Override
public void edit(Handler h) throws CannotCompileException {
// Here the code will print an output in the catch code block
h.insertBefore("{ System.out.println(\"Before println\"); }");
}
}
);
Class<?> aClass = cc.toClass();
Object o = aClass.newInstance();
Method parseIntDefault = aClass.getDeclaredMethod("parseIntDefault", String.class, int.class);
System.err.println(parseIntDefault.invoke(o, "abc", 0));
}
}
class Point {
public int parseIntDefault(String num, int defaultNum) {
try{
return Integer.parseInt(num);
} catch (NumberFormatException e) {
e.printStackTrace();
}
return defaultNum;
}
}
I found that the logic here is normal
Before println
java.lang.NumberFormatException: For input string: "abc"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at Point.parseIntDefault(Test.java:321)
.......
0
Relevant log output or stacktrace
ERROR - [27] IndexOutOfBoundsException in pass: SSATransform in method: Point.parseIntDefault(java.lang.String, int):int, file: Point.class
java.lang.IndexOutOfBoundsException: bitIndex < 0: -1
at java.util.BitSet.set(BitSet.java:444)
at jadx.core.dex.visitors.ssa.LiveVarAnalysis.fillBasicBlockInfo(LiveVarAnalysis.java:73)
at jadx.core.dex.visitors.ssa.LiveVarAnalysis.runAnalysis(LiveVarAnalysis.java:36)
at jadx.core.dex.visitors.ssa.SSATransform.process(SSATransform.java:55)
at jadx.core.dex.visitors.ssa.SSATransform.visit(SSATransform.java:41)
at jadx.core.dex.visitors.DepthTraversal.visit(DepthTraversal.java:26)
at jadx.core.dex.visitors.DepthTraversal.lambda$visit$1(DepthTraversal.java:14)
at java.util.ArrayList.forEach(ArrayList.java:1259)
at jadx.core.dex.visitors.DepthTraversal.visit(DepthTraversal.java:14)
at jadx.core.ProcessClass.process(ProcessClass.java:72)
at jadx.core.ProcessClass.generateCode(ProcessClass.java:115)
at jadx.core.dex.nodes.ClassNode.decompile(ClassNode.java:383)
at jadx.core.dex.nodes.ClassNode.decompile(ClassNode.java:307)
at jadx.api.JavaClass.load(JavaClass.java:127)
at jadx.api.JavaClass.getCodeInfo(JavaClass.java:61)
at jadx.gui.treemodel.JClass.getCodeInfo(JClass.java:109)
at jadx.gui.ui.TabbedPane.lambda$codeJump$2(TabbedPane.java:208)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:750)
2024-09-09 11:16:22.137 java[26036:6167736] TSM AdjustCapsLockLEDForKeyTransitionHandling - _ISSetPhysicalKeyboardCapsLockLED Inhibit
Provide sample and class/method full name
No response
Jadx version
1.4.7
Issue details
platform
test code
Decompile and view source code
Initially I suspected it was a bug in the javassist library, but after executing the code I found that it worked properly.
I found that the logic here is normal
Relevant log output or stacktrace
Provide sample and class/method full name
No response
Jadx version
1.4.7