Sto lavorando su a fork di FernFlower di Jetbrains e ho aggiunto miglioramenti minori ad esso.Bytecode JVM, come posso trovare il tipo di variabili locali?
Una cosa che mi infastidisce davvero di FernFlower è che basa il tipo di variabile locale in base al suo valore in bpush/spush ecc. Mentre Jode e Procyon in qualche modo trovano un modo per trovare il valore originale di una variabile locale.
Ecco il codice sorgente originale.
public static void main(String[] args) throws Exception {
int hello = 100;
char a2 = 100;
short y1o = 100;
int hei = 100;
System.out.println(a2+" "+y1o+", "+hei+", "+hello);
}
Quando decompilato con FernFlower, esso Risulterà:
public static void main(String[] args) throws Exception {
byte hello = 100;
char a2 = 100;
byte y1o = 100;
byte hei = 100;
System.out.println(a2 + " " + y1o + ", " + hei + ", " + hello);
}
Ma quando decompilato con Jode/Procyon Produce il originali tipi di variabili locali:
public static void main(String[] args)
throws Exception
{
int hello = 100;
char a2 = 'd';
short y1o = 100;
byte hei = 100;
System.out.println(a2 + " " + y1o + ", " + hei + ", " + hello);
}
Mi chiedevo come è questo è possibile perché ho pensato che nessuna informazione di tipo variabile locale è stata archiviata al momento della compilazione? Come posso aggiungere la stessa funzionalità a FernFlower?
È possibile che i decompilatori si siano presi delle libertà nel decidere quale tipo locale usare (ad esempio 'byte' contro' int')? –
Dovresti essere in grado di dedurlo in molti casi dalle istruzioni che usano quegli slot. Dai un'occhiata al codice byte, in particolare i vari overload di 'String.valueOf()' che vengono chiamati. In questo caso sembra che ci fossero anche alcune informazioni di debug, altrimenti i nomi non sarebbero stati disponibili neanche. – EJP
Senza informazioni di debug non ci sarebbe LocalVariableTable nel codice compilato, quindi non vedo come il tipo dichiarato originale possa essere dedotto. –