3

好奇心から、DJJavaDecompilerとCAVAJJavaDecompiler (Javaバージョンは1.7)を使用して以下のコードを逆コンパイルし ました。これが通常のソースコードです。


    byte a = 10;
    a = (byte) (a +1);

    byte b = 10;
    b = b++;

    byte c = 10;
    c +=c;

    System.out.printf("a=%d \t b=%d \t c=%d\n",a,b,c);

これは、出力を次のように表示します:a = 11 b = 10 c = 20



そして、これが逆コンパイルされたものです:

    byte a = 10;
    a++;
    byte b = 10;
    b++;
    b = b;
    byte c = 10;
    c += c;
    System.out.printf("a= %d \t b = %d \t c = %d\n", new Object[] {
        Byte.valueOf(a), Byte.valueOf(b), Byte.valueOf(c)
    });

これをソースコードとして使用すると、次のように出力されます:a = 11 b = 11 c = 20


byteより明確にするために、それは同じことが起こっていることとは何の関係もありません、intそして私はオンラインコンパイラIDEONEで上記のコードをチェックし、私のものと同じ出力を与えました。

それで、逆コンパイラーは間違ったコードを生成していますか、それとも何か他のものですか?

4

2 に答える 2

4

簡単に答えます。そうです、逆コンパイラが間違ったコードを生成しているようです。これは:

byte b = 10;
b = b++;

行動を強く予測している(b変化しない)。

UPD:さらに、逆コンパイラーの誰も、生成された逆コンパイルされたコードの正確さを100%保証することはできません。

UPD-2:コードの実際のバージョンを提供してもよろしいですか?これは:

byte aa = 10;
a = (byte) (a +1);

もちろん間違いです。それもコンパイルされません:)

UPD-3と言う必要がありますが、Jad逆コンパイラー(Intelプラットフォーム上のWindows 9x / NT /2000の場合はJad1.5.8g)は同じコードを生成します。

    byte b = 10;
    b++;
    b = b;

..。

    java.lang.System.out.printf("a=%d \t b=%d \t c=%d\n", new java.lang.Object[] {...

しかし、これは驚くべきことではありません。CavajJava逆コンパイラーは、Java逆コンパイルエンジンとしてJadを使用します

結論:この動作をJad逆コンパイラーの機能/バグと見なしてください。これは完璧にはほど遠いものです。

于 2013-01-18T18:52:22.680 に答える
-2

これは逆コンパイラについてではありません。Javaコンパイラを使用してコードをコンパイルすると、場合によっては、コンパイラがコードを変更し、結果を変更しない別のコードに最適化します。あなたのコードは:

byte a = 10;
a = (byte) (a + 1);

この場合、Javaコンパイラは、バイトとバイトの間で型キャストする必要がないことを認識しているため、コンパイラは型キャストを削除しようとし、このプロセスで、コードを理解できる最も近いコードに置き換えます。これはコンパイラの出力です。

byte a = 10;
a++;

したがって、これは逆コンパイルプロセスに関するものではありません。Javaコンパイラはコードを変更します。

于 2013-01-18T19:26:30.110 に答える