2010-05-18 19 views
14

मुझे थोड़ी देर के लिए jmp निर्देश के बारे में पता चला है, लेकिन यह मुझे कभी भी असुरक्षित रूप से असुरक्षित होने के रूप में कभी नहीं मारा। मुझे हाल ही में सीआईएल चश्मा और was very surprised to discover jmp is considered unverifiable की जांच करने का कारण था।सीएलआर का जेएमपी निर्देश अविश्वसनीय क्यों है?

+0

इस किया जाएगा क्योंकि यह तो गंतव्य कोड ब्लॉक करने के लिए सिले वर्तमान आंशिक रूप से कोड ब्लॉक के निष्पादन के प्रभाव ... ढेर के बारे में कुछ पुष्टि नहीं कर सके/ढेर पर नज़र रखने के अपने छोटे से मन की तरंग में झंडा करने लगता है .. यह नहीं कि मैं निश्चित रूप से यह निश्चित रूप से जानता हूं ... हालांकि यह तुरंत जानकारी से ऑफसेट है ... http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.jmp .aspx ... जो स्पष्ट रूप से बताता है कि कोई स्टैक जानकारी ट्रैक/स्थानांतरित नहीं होती है। शायद "फ्रंट एंड" के नीचे कुछ ऐसा है जो माइक्रोसॉफ्ट छुपा रहा है। – War

+0

मुझे नहीं पता कि यह अविश्वसनीय क्यों है, लेकिन मेरे पास जानकारी का एक दिलचस्प हिस्सा है। हमारा ईक्यूएटीसी प्रोफाइलर प्रोफाइल के सभी कोड के बारे में अज्ञात आंकड़े एकत्र करता है (EQATEC Analytics, btw का उपयोग करके)। चूंकि जेएमपी मुश्किल था और प्रोफाइलर द्वारा बेहतर तरीके से संभाला नहीं गया था, हमने यह ट्रैक करने का फैसला किया कि यह वास्तव में कितनी बार हुआ। अब हमारे पास 2 मिलियन से अधिक प्रोफाइल हैं, जो 1 मिलियन से अधिक प्रोफाइल असेंबली से एकत्र हुए हैं, कुल 20 बिलियन सीआईएल निर्देश हैं। काफी। और कितने जंप थे? कोई नहीं! हां, हमारे किसी भी उपयोगकर्ता के ऐप्स (एनईटीसीएफ, एसएल, डब्ल्यूपी 7, एफ # आदि) में एक जेएमपी कभी नहीं हुआ है। काफी आश्चर्य है। –

+1

मैं वास्तव में भी आश्चर्यचकित नहीं हूं। कोई संकलक मुझे पता नहीं है कि शायद प्रबंधित सी ++ jmp निर्देश को छोड़ देता है, क्योंकि यह अविश्वसनीय है। विश्वसनीय वर्ग पुस्तकालयों में jmp का कोई भी उपयोग squirreled हो सकता है। – naasking

उत्तर

4

वजह से, के विपरीत call, callvirt, या calli, जहां फोन करने वाले का ढेर फ्रेम ढेर पर बना रहेगा भविष्य कोड पहुँच सुरक्षा stackwalks द्वारा देखा जा करने के लिए शुरू हो रहा है (शायद परोक्ष रूप से) कॉल प्राप्त करने वाला द्वारा एक, एक jmp अनुदेश नीचे आँसू फोन करने वाले का कैली में संक्रमण से पहले ढेर फ्रेम और कैलिली ट्रिगर कर सकते हैं कि किसी भी सीएएस स्टैकवॉक के लिए अदृश्य है।

संपादित करें: मुझे लगता है कि नाकाबिंग गलत होने के उत्तर के बारे में सही है। अब मुझे लगता है कि (सत्यापन योग्य) tail.call अनुक्रमों और (अविश्वसनीय) जेएमपी अनुक्रमों के बीच का अंतर यह हो सकता है कि एक पूंछ कॉल को तर्क स्टैक पर कॉल को तर्कों को धक्का देने की आवश्यकता होती है जहां उन्हें सामान्य तरीके से सत्यापित किया जा सकता है, जबकि jmp मूल्यांकन स्टैक को रिक्त होने की आवश्यकता होती है और कूद-ई के कूद-एआर के तर्कों का उत्तराधिकारी बनने का कारण बनता है। jmp निर्देशों की जांच करने के लिए सत्यापनकर्ता को जटिल करने का शायद कोई कारण नहीं था, लेकिन tail.call अनुक्रमों पर लगाए गए शर्तों के समान ऐसा करना संभव हो सकता है (जिसमें से एक है कि कॉलर और कैली एक ही असेंबली में होना चाहिए, जो नियम मेरे सीएएस अनुमान ऊपर, कम से कम .Deny() कॉल तक)। (विभाजन तृतीय, धारा 3,37)

वर्तमान तर्क गंतव्य विधि के लिए स्थानांतरित कर रहे हैं:

यदि हां, तो इस कल्पना के प्रासंगिक हिस्सा होगा।

मूल्यांकन स्टैक खाली होना चाहिए जब यह निर्देश निष्पादित किया जाता है। कॉलिंग सम्मेलन, नंबर और प्रकार गंतव्य पते पर तर्क मौजूदा विधि से मेल खाना चाहिए।

+0

पहली बार ब्लश पर उचित होने पर, यह निकट जांच के लिए खड़ा नहीं है। द।tailcall उपसर्ग लगभग समान व्यवहार है, यद्यपि अधिक सामान्य, लेकिन .tailcall सत्यापित करने योग्य है। प्रलेखन बस बताता है कि अविश्वसनीय से विश्वसनीय कोड पर कॉल करते समय। टेलकॉल को अनदेखा किया जाता है। यदि यही कारण है कि jmp अविश्वसनीय है, तो मुझे नहीं लगता कि वे jmp के लिए एक ही व्यवहार का उपयोग क्यों नहीं करते थे। – naasking

+0

बहुत अच्छा मुद्दा, धन्यवाद नास्किंग। –

+0

मुझे लगता है कि "रॉड्रिगो कुम्पेरा" जो लिंक किए गए ब्लॉग पेज पर पोस्ट करते हैं, यह सही है: यदि कोई भी तर्क उप-रेफरी है, तो आप स्थानीय के संदर्भ को एक जंप निष्पादित कर सकते हैं। एक अपेक्षाकृत सरल एक यद्यपि यह सुनिश्चित करने के लिए एक नियंत्रण प्रवाह विश्लेषण की आवश्यकता नहीं है। मैं डरता था कि वे परेशान नहीं होना चाहते थे क्योंकि जेएमपी मुख्य रूप से सी ++ का समर्थन करने के लिए जोड़ा गया था। .टेलकॉल के लिए भी यही खतरा मौजूद है, इसलिए मुझे यकीन नहीं है कि यह कैसे संभाला जाता है, यानी। अविश्वसनीय, या .tailcall अनदेखा। मुझे इसे किसी बिंदु पर परीक्षण करना होगा। – naasking

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