私はJetbrainsのFernFlowerのa forkに取り組んでいます。JVMバイトコード、ローカル変数のタイプはどのようにして見つけることができますか?
FernFlowerについて私を本当に悩ますことの1つは、bpush/spushなどの値に基づいてローカル変数の型を決定することです.JodeとProcyonは何とかローカル変数の元の値を見つける方法を見つけます。
ここに元のソースコードがあります。
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);
}
FernFlowerを逆コンパイルすると、それはこの出力:
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);
}
をしかしJODE /プロキオンで逆コンパイルするとき、それは、元のローカル変数の型を出力:
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);
}
私がどのように思っていましたコンパイル時にローカル変数型情報が格納されていないと思ったのでこれが可能ですか? FernFlowerに同じ機能を追加するにはどうしたらいいですか?
逆コンパイラがどのローカルタイプを使用するかを決めることは可能でしょうか?(例: 'byte'対' int')? –
多くの場合、それらのスロットを使用する手順から推論できるはずです。バイトコードを自分自身で見てください。特に、呼び出される 'String.valueOf()'のさまざまなオーバーロードがあります。この場合、デバッグ情報もあるように見えます。それ以外の場合は、その名前も利用できませんでした。 – EJP
デバッグ情報がなければ、コンパイルされたコードにはLocalVariableTableが存在しないので、元の宣言された型がどのように推定されるかわかりません。 –