2011-10-07 38 views
5

Tôi đã được cung cấp một số mã nhà cung cấp bên thứ ba không được hỗ trợ trong một tệp jar của khách hàng và tôi đang cố gắng thiết kế lại nó để tôi thực hiện lại cùng một giao thức được sử dụng để kết nối đến một máy chủ.Lệnh Goto trong mã biên dịch gây ra sự cố

Tôi đã biên dịch nó và một trong các lớp dường như có nhãn và câu lệnh goto trong đó. Trình biên dịch của tôi là ném một hissy-phù hợp với điều này bởi vì như tôi hiểu nó goto không được hỗ trợ trong Java.

tôi không thể đăng tất cả các mã do các vấn đề IP nhưng đây là ý chính của nó (tôi đã đưa các lỗi biên dịch trong các ý kiến):

private void methodName(InputType input) 
     throws ConfigurationException 
    { 
    // initialization code here 
_L2: 
    String x; // The compiler is complaining that "String cannot be resolved to a variable" here 
    String y; // This line is fine though... 
    // Some Code here 

    x = <SOME VALUE> // Compiler complains about "x cannot be resolved to a variable" 
    y = <ANOTHER VALUE> // Compiler is fine with this. 

    // Some more code 
    if(true) goto _L2; else goto _L1 // Multiple issues here see following lines. 
    // Syntax error on token "goto", throw expected 
    // _L2 cannot be resolved to a variable 
    // Syntax error on token "goto", { expected 
    // Syntax error on token "goto", { expected 

_L1: // Syntax error on token "goto", { expected 
     local; // local cannot be resolved to a variable 

     // Some more code 

     JVM INSTR ret 12; // Multiple issues here see following lines. 
     // JVM INSTR ret 12; 
     // Syntax error on token "ret", = expected 

     return; 
    } 

Tôi hiểu rằng các dòng sau bởi dấu hai chấm là Nhãn, nhưng tôi không hiểu điều gì đang xảy ra ở đây.

Dòng với goto đang thử nghiệm cho đúng vì vậy tôi chỉ có thể loại bỏ các nhãn như họ không liên quan ở đây, nhưng tôi không hiểu những gì dòng này có nghĩa là:

local; 

Hoặc này:

JVM INSTR ret 12; 

Bất kỳ hỗ trợ nào giải thích điều này sẽ được đánh giá cao nhất.

+1

Nếu trình biên dịch ngược của bạn yêu cầu chuyển đổi bytecode JVM thành Java, nhưng mã mà nó xuất ra không phải là Java hợp lệ, không phải là một lỗi trong trình biên dịch ngược của bạn? – Raedwald

+0

lưu ý cầu kỳ: hãy cẩn thận với kỹ thuật đảo ngược của bên thứ ba mã nhà cung cấp - và thậm chí đăng bài về nó - nó có thể không được phép của nhà cung cấp:/ – Christian

+0

Tôi nghĩ rằng tôi obfuscated mã càng nhiều càng tốt ... –

Trả lời

4

Bạn đang sử dụng trình biên dịch ngược nào? Hãy thử một số khác, nó có thể tạo ra mã tốt hơn. Tôi đã có trải nghiệm khá tốt với JD-GUI. Chặn điều đó, hãy xem mã bytecode.

+0

Cảm ơn decompiled nó bằng cách sử dụng JD -GUI và có vẻ ổn. Tôi đã sử dụng DJ-Decompiler http://members.fortunecity.com/neshkov/dj.html –

2

Thành thật mà nói, với loại sự cố này, bạn có thể nên xem trực tiếp các bytecode hơn. Hãy thử javap -c trên tệp lớp và xem những gì thực sự diễn ra bên trong phương thức đó.

6

Những gì bạn đang thấy là các tạo phẩm của mã byte, mà trình biên dịch ngược của bạn không thể xử lý đúng cách. Đối với exmaple

_L2: 
    String x; 
    String y; 

    ... 

    if(true) goto _L2; else goto _L1; 
_L1: 

có thể đã được một cái gì đó giống như

do { 
    String x; 
    String y; 

    ... 

} while (true); 

nhưng decompiler đã không thể (hoặc không sự kiện thử) để mảnh các bộ phận này đúng cách với nhau. Tương tự như vậy,

JVM INSTR ret 12 

dường như là hiển thị cho một số mã opcode mà trình giải mã không hiểu chính xác. Tôi không có ý tưởng, những gì các local có thể được.

Các vấn đề liên quan