Comments (2)
Hey,
It's not really out-of-scope, in as much as I never set a scope ;) In general raw switch statements allow impossible (in java) control flow to be created quite easily, so while I attempt to do my best, there are places where I don't get it right :(
In this case there are two things going on - an accounting failure caused by an unexpected rewrite
private static void moveJumpsToTerminalIfEmpty(Op03SimpleStatement switchStatement, List<Op03SimpleStatement> statements) {
++ if (!(switchStatement.getStatement() instanceof SwitchStatement)) return;
SwitchStatement swatch = (SwitchStatement) switchStatement.getStatement();
(haven't run that through regression tests yet though)
The big one is that the branches of the second switch aren't falling inside the body of the first (which javac emits); this is usually fairly easily fixable with the topsort stage (and in this case when done by eye, it's pretty obvious!), but there are some heuristics to try to avoid mashing multiple switches together which have probably gone wrong here.
Will see if I can improve this case, but in general you can always produce impossible code by jumping into the middle of a nested switch (psuedo jasmin) eg
switch (a)
case 0 :
A
if (x) goto label1
B
break
case 1:
switch (b)
case 1:
C
label1:
D
case 2:
E
}
}
(in that case if D + E aren't too big I might try to duplicate them, but you see my point)
WRT this case (hah) If you fix the first bug, you can see that it's not pulled the branches into the correct place this time, will see how fixable that is, but it'll never be perfect from jasmin ;) (or obfuscated control flow!)
/*
* Decompiled with CFR 0.153-SNAPSHOT (d6f6758).
*/
public class TestCase {
/*
* Unable to fully structure code
* Enabled aggressive block sorting
*/
public static void main(String[] var0) {
switch (1) {
default: {
** GOTO lbl6
** case 1:
lbl5:
// 1 sources
return;
lbl6:
// 1 sources
switch (1) {
default: {
return;
}
case 1:
}
return;
}
}
}
}
from cfr.
Yes I suspected that the differences in control flow restrictions between bytecode/Java was somehow responsible for the issue, but I wasn't sure why this would affect the simple example there. Thanks for looking into this!
from cfr.
Related Issues (20)
- CFR API SinkReturns#Decompiled#getPackageName() return emptry string for module-info.class
- CFR incorrectly decompiles stack values being reordered
- aload_0 - astore_2 for different types produces wrong code
- How to get cfr .jar building from source? HOT 1
- module-info cannot be decompiled after packing into jar
- Decompiling specific package(s) HOT 3
- CFR generates incorrect code for type arguments
- CFR may perform incorrect modifications to the type of generic class variables
- CFR generates duplicate variable names inside and outside lambda expressions
- Type argument of null reference generic class variables is converted to Object
- Casting of primitive types may be decompiled as casting of corresponding wrapper classes under certain circumstances
- Type Conversion Expression Lost in Constructor
- Question: Is there any switch to specify a single class to be decompiled? HOT 1
- How can I show the class packages?
- Option to remove the file headers HOT 1
- Question: decompiling multiple files from terminal HOT 1
- How do I decompile using CFR's CFRDriver?
- Ternary Expression Causing Decompilation Type Error
- Incorrect Comparable Expression Produced by Ternary Expression
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from cfr.