मैंने हाल ही में एवीएम 2/एएस 3 के लिए एक डिकंपेलर बनाया है, और मैंने देखा है कि फ्लैश कंपाइलर बहुत सारे असुरक्षित कोड को उत्सर्जित करता है। उदाहरण के लिए, एक निश्चित अनुप्रयोग के लिए मैंने कार्यक्षमता में किसी भी हानि के बिना कोड के लगभग 10% को हटा दिया है। यह केवल निश्चित रूप से मृत कोड था जिसे सशर्त ओपोड्स द्वारा संदर्भित नहीं किया गया था और न ही अपवाद हैंडलिंग ब्लॉक द्वारा।फ्लैश एक्शनस्क्रिप्ट 3 कंपाइलर अनावश्यक कोड क्यों छोड़ता है?
इसके अलावा, इस स्निपेट को देखो:
...
313 setproperty y
315 getlocal 12
317 returnvalue 318 jump L9
L3:
322 getlocal 8
324 returnvalue
L9:
325 jump L10 ; L10 (opcode #331) does not ever exist.
; Technically, it is a jump beyond
; the end of function. This is invalid code!
L2:
329 pushnull
330 returnvalue
ठीक है, निश्चित रूप से यह अमान्य कोड है, जो भी मर चुका है और इसलिए (codebase सूजन के अलावा) कोई प्रतिकूल प्रभाव पैदा नहीं होगा। लेकिन यह कभी भी उस कोड को क्यों छोड़ देता है? और सत्यापनकर्ता इसे क्यों स्वीकार करता है?
इसे अपवाद तालिका से संदर्भित नहीं किया गया था (जैसा कि बहुत अधिक नहीं था, बहुत अधिक - निर्देशों के 10 - मृत कोड ब्लॉक), और spec से निर्णय लेते हुए, आप या तो एक कूद ऑपोड के माध्यम से नियंत्रण स्थानांतरित कर सकते हैं या एक अपवाद। कोई कूद नहीं है। – whitequark
@wvxvw वैसे, 'अंत में ब्लॉक एएस 3 में एक अजीब और भयानक हैक के साथ किए जाते हैं, जहां कंपाइलर जानबूझकर चालक और वीएम चाल करने के लिए अमान्य ऑपोडोड उत्पन्न करता है, फिर जानबूझकर, उन्हें अनदेखा करता है। फ्लैश सिर्फ एक विशाल डब्ल्यूटीएफ है। – whitequark
@wvxvw, क्या मैंने आपको सही ढंग से समझा है? यदि आप ऑपकोड का एक निश्चित अनुक्रम निष्पादित करते हैं तो वीएम चलने वाले कोड को किसी भी तरह से अपने ओपोड स्ट्रीम की जांच करने की अनुमति देता है, संभवतः उन्हें डेटा स्टैक पर धक्का देकर? +50 यदि आप संदर्भ पा सकते हैं। – whitequark