पर विचार करें इस IMHO (सरल) उदाहरण:क्या कोई जावा डिकंपेलर है जो ओवरलोडेड विधियों को कॉल को सही ढंग से डिमंपाइल कर सकता है?
public class DecompilerTest {
public static void main(String[] args) {
Object s1 = "The", s2 = "answer";
doPrint((Object) "You should know:");
for (int i = 0; i < 2; i++) {
doPrint(s1);
doPrint(s2);
s1 = "is";
s2 = new Integer(42);
}
System.out.println();
}
private static void doPrint(String s1) {
System.out.print("Wrong!");
}
private static void doPrint(Object s1) {
System.out.print(s1 + " ");
}
}
स्रोत/लक्ष्य 1.1 स्तर डिबग जानकारी के बिना के साथ संकलित (अर्थात् कोई स्थानीय चर जानकारी मौजूद होना चाहिए) और यह डिकंपाइल की कोशिश करो। मैंने जाड, जेडी-जीयूआई और फर्नाफ्लॉवर की कोशिश की, और उनमें से सभी को कम से कम एक बार गलत कहा गया (यानी कार्यक्रम कम से कम एक बार "गलत!" मुद्रित किया गया है)
क्या वास्तव में कोई जावा डिकंपेलर नहीं है जो सही अनुमान लगा सकता है ऐसा लगता है कि यह गलत अधिभार को कॉल नहीं करेगा?
संपादित करें: लक्ष्य स्तर 1.1 ताकि जावा 6-विशिष्ट फास्ट-सत्यापन जानकारी मौजूद न हो। इससे डिकंपेलर को एक सुराग मिल सकता है जिसे एस 1 को Object
के रूप में घोषित किया गया है और String
के रूप में नहीं। Decompilers इस जानकारी के बिना भी कोड को संकुचित करने में सक्षम होना चाहिए (आवश्यक रूप से मूल परिवर्तनीय प्रकार नहीं मिलता है, लेकिन एक ही व्यवहार दिखाएं), खासकर जब से बहुत सारे obfuscators इसे भी पट्टी करते हैं।
क्या डीकम्पाइलर गलत:
- वे पहली बार कॉल में
(Object)
लिए डाली याद किया। - उन्होंने
s1
के प्रकारString
के रूप में अनुमानित किया, लेकिनdoPrint
पर कॉल में एक कलाकार जोड़ने के लिए भूल गए (ताकि ऑब्जेक्ट संस्करण के बजाय स्ट्रिंग संस्करण को कॉल किया जा सके)। - एक क्रैपी एक (मैंने सूचीबद्ध भी नहीं किया है) स्ट्रिंग होने के लिए
s2
के प्रकार का भी अनुमान लगाता है, जिससे असंगत कोड होता है।
किसी भी मामले में, यह कोड कभी भी String
अधिभार को कॉल नहीं करता है, लेकिन अपूर्ण कोड किया गया है।
आपका क्या मतलब है "उन्हें कॉल गलत मिला"? अपघटन के बाद वे क्या स्रोत उत्पन्न करते हैं? – skaffman
एचएम, और क्यों 1.1? – Bozho