2011-10-07 12 views
5

मैं एक ग्राहक द्वारा एक जार फ़ाइल में कुछ प्राचीन असमर्थित तीसरी पार्टी के विक्रेता कोड दिया गया है और मैं तो मैं एक ही प्रोटोकॉल यह जोड़ने के लिए इस्तेमाल को फिर से लागू यह इंजीनियर को बदलने का कोशिश कर रहा हूँ एक सर्वर के लिए।गोटो बयान

मैंने इसे संकुचित कर दिया है और कक्षाओं में से एक में लेबल और गेटो स्टेटमेंट हैं। मेरा कंपाइलर इस पर एक फिट-फेंक रहा है क्योंकि मुझे लगता है कि यह जावा में समर्थित नहीं है।

मैं आईपी मुद्दों के कारण सभी कोड पोस्ट नहीं कर सकते, लेकिन यहाँ (मैं टिप्पणी में संकलक त्रुटियों रख दिया है) यह का सार है:

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; 
    } 

मैं समझता हूँ कि लाइनों का पालन किया एक कोलन द्वारा लेबल हैं, लेकिन मुझे नहीं पता कि यहां क्या गलत हो रहा है।

गोटो के साथ लाइन सच के लिए परीक्षण कर रहा है तो मैं बस लेबल के रूप में वे यहाँ अप्रासंगिक हैं को दूर कर सकता है, लेकिन मुझे समझ नहीं आता क्या इस लाइन का अर्थ है:

local; 

या इस:

JVM INSTR ret 12; 

इसकी व्याख्या करने वाली कोई भी सहायता सबसे सराहना की जाएगी।

+1

यदि आपका डिकंपेलर जावा में जेवीएम बाइटकोड को कन्वर्ट करने का दावा करता है, लेकिन जो कोड यह आउटपुट कर रहा है वह मान्य जावा नहीं है, क्या यह आपके डिकंपेलर में एक बग नहीं है? – Raedwald

+0

picky ध्यान दें: - और यहां तक ​​कि इसके बारे में पोस्टिंग - रिवर्स इंजीनियरिंग तीसरी पार्टी के विक्रेता कोड के साथ सावधान रहना यह विक्रेता द्वारा अनुमति नहीं दी जा सकती है:/ – Christian

+0

मुझे लगता है मैं कोड के रूप में ज्यादा संभव के रूप में समझ से परे ... –

उत्तर

4

आप किस डिकंपेलर का उपयोग कर रहे हैं? एक और कोशिश करें, यह बेहतर कोड उत्पन्न कर सकता है। मुझे JD-GUI के साथ बहुत अच्छा अनुभव था। इसे छोड़कर, बाइटकोड देखें।

+0

धन्यवाद जद का उपयोग कर decompiled यह -GUI और यह ठीक लग रहा है। मैं डीजे-डीकंपेलर http://members.fortunecity.com/neshkov/dj.html का उपयोग कर रहा था –

2

ईमानदार होने के लिए, इस तरह के मुद्दों के साथ आप सीधे बाइटकोड को देखने से बेहतर हो सकते हैं। कक्षा फ़ाइल पर javap -c आज़माएं और देखें कि वास्तव में उस विधि के अंदर क्या चल रहा है।

6

जो आप देख रहे हैं वह बाइट-कोड की कलाकृतियों हैं, जो आपके डिकंपलर ठीक से संभाल नहीं सकते थे, जैसा कि लगता है। उदाहरण के लिए

_L2: 
    String x; 
    String y; 

    ... 

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

do { 
    String x; 
    String y; 

    ... 

} while (true); 

की तरह कुछ हो सकता है, लेकिन decompiler में सक्षम नहीं था (या घटना की कोशिश नहीं की है) ठीक से एक साथ इन भागों टुकड़ा करने के लिए। इसी तरह,

JVM INSTR ret 12 

कुछ opcode, जो decompiler ठीक से समझ में नहीं आया के लिए एक प्रतिपादन हो रहा है। मुझे नहीं पता, local क्या हो सकता है।

संबंधित मुद्दे