2012-12-02 11 views
86

मैं सिर्फ across this blog post जो "स्मृति stomping" का उल्लेख आया:"मेमोरी स्टॉम्प" क्या है?

एक सी ++ प्रोग्राम है जो स्मृति (कुछ आप शायद भले ही आप एक प्रबंधित कोड दुनिया में पैदा हुए थे कभी नहीं सुना है stomping की आसानी से सक्षम है।)

और वास्तव में मैंने कभी इसके बारे में नहीं सुना है!

तो, यह क्या है, एक स्मृति stomp स्मृति stomping है? यह कब होता है?

+4

मेमोरी स्टॉम्प का एक अच्छा उदाहरण यह प्रश्न है: http://stackoverflow.com/questions/31016660/why-is-my-for-loop-not-breaking-code –

उत्तर

109

मेमोरी "stomped" है जब कोड का एक टुकड़ा एहसास है कि एक और कोड एक तरीका है कि संघर्ष में है कि स्मृति उपयोग कर रहा है बिना स्मृति manipulates। मेमोरी को स्टंप किए जाने के कई सामान्य तरीके हैं।

एक का आवंटन किया जाता है, का कहना है, स्मृति के 100 बाइट्स लेकिन फिर 100 वीं पते के अतीत कुछ भंडारण। इस स्मृति का उपयोग कुछ पूरी तरह से अलग रखने के लिए किया जा सकता है। यह डीबग करना विशेष रूप से कठिन होता है क्योंकि समस्या तब दिखाई देगी जब कुछ पीड़ित पीड़ितों तक पहुंचने का प्रयास करता है, और उस पर चिपकने वाला कोड पूरी तरह से असंबंधित हो सकता है।

एक और स्मृति तक पहुँचने के बाद यह मुक्त कर दिया गया था। स्मृति किसी अन्य ऑब्जेक्ट के लिए आवंटित की जा सकती है। दोबारा, समस्या जो समस्या को दिखाती है वह नव-आवंटित ऑब्जेक्ट से संबंधित हो सकती है, जिसने वही पता प्राप्त किया है और समस्या के कारण कोड से असंबंधित है।

+3

[यहां] (http: // stackoverflow.com/questions/31016660/why-does-this-for-loop-exit-on-some-platforms-and-not-on-others) स्मृति स्टॉम्पिंग का अच्छा उदाहरण है। –

32

अक्सर यह एक बफर ओवररन होता है; एक उदाहरण के रूप में, इस कोड:

char buffer[8]; 
buffer[8] = 'a'; 

होगा जो कुछ buffer के बाद स्मृति में अगली बात में होता है पर "stomp"। आम तौर पर, 'स्टॉम्पिंग' तब होती है जब स्मृति अनजाने में लिखी जाती है।

8

अन्य उत्तर मूल रूप से सही हैं, लेकिन मैं एक उदाहरण देना चाहते हैं।

int a[10], i;  
for (i = 0; i < 11 ; i++) 
    a[i] = 0; 

int i, a[10];  
for (i = 0; i < 11 ; i++) 
    a[i] = 0; 

इन नमूनों अनंत लूप में नेतृत्व कर सकते हैं (या नेतृत्व नहीं कर सकते हैं), क्योंकि यह अपरिभाषित व्यवहार है।

बहुत संभावना चर i स्मृति में बस सरणी के बाद संग्रहित है। तो a[10] तक पहुंचने से वास्तव में i अन्य शब्दों में पहुंच सकता है, यह लूप काउंटर को रीसेट कर सकता है।

मुझे लगता है कि यह एक अच्छा उदाहरण है जो स्मृति "stomping" प्रदर्शित करता है।

+0

अलग-अलग ऑपरेटिंग सिस्टम पर एक ही उदाहरण पर चर्चा करते हुए, अन्यथा धागा है ... http://stackoverflow.com/questions/31016660 – Christian

+1

@ क्रिस्टियन इसका ओएस के साथ कुछ लेना देना नहीं है। यह एक अनिर्धारित व्यवहार है। – ST3

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