“ memory stomp” คืออะไร?


96

ฉันเพิ่งเจอบล็อกโพสต์นี้ซึ่งกล่าวถึง“ ความทรงจำที่ย่ำแย่”

โปรแกรม C ++ ที่สามารถเหยียบหน่วยความจำได้อย่างง่ายดาย (สิ่งที่คุณอาจไม่เคยได้ยินมาก่อนหากคุณเกิดในโลกแห่งรหัสที่มีการจัดการ)

และอันที่จริงฉันไม่เคยได้ยินมาก่อน!

แล้วนี่คืออะไรความทรงจำเหยียบความทรงจำ เกิดขึ้นเมื่อใด


4
ตัวอย่างที่ดีของ memory stomp คือคำถามนี้: stackoverflow.com/questions/31016660/…
Phillip Ngan

คำตอบ:


118

หน่วยความจำถูก "เหยียบ" เมื่อโค้ดส่วนหนึ่งจัดการกับหน่วยความจำโดยไม่ทราบว่าโค้ดส่วนอื่นใช้หน่วยความจำนั้นในลักษณะที่ขัดแย้งกัน มีหลายวิธีทั่วไปที่สามารถเหยียบหน่วยความจำได้

หนึ่งคือการจัดสรรหน่วยความจำ 100 ไบต์ แต่จัดเก็บบางอย่างผ่านที่อยู่ที่ 100 หน่วยความจำนี้อาจใช้เพื่อเก็บสิ่งที่แตกต่างไปจากเดิมอย่างสิ้นเชิง นี่เป็นเรื่องยากโดยเฉพาะอย่างยิ่งที่จะแก้ไขข้อบกพร่องเนื่องจากปัญหาจะปรากฏขึ้นเมื่อมีบางสิ่งพยายามเข้าถึงเหยื่อที่ถูกกระทืบและรหัสที่เหยียบมันอาจไม่เกี่ยวข้องกันโดยสิ้นเชิง

อีกประการหนึ่งคือการเข้าถึงหน่วยความจำหลังจากได้รับอิสระ หน่วยความจำอาจถูกจัดสรรให้กับวัตถุอื่น อีกครั้งรหัสที่แสดงปัญหาอาจเกี่ยวข้องกับวัตถุที่จัดสรรใหม่ซึ่งมีที่อยู่เดียวกันและไม่เกี่ยวข้องกับรหัสที่ทำให้เกิดปัญหา


3
นี่คือตัวอย่างที่ดีของการเหยียบหน่วยความจำ
patryk.beza

34

บ่อยครั้งที่บัฟเฟอร์ถูกบุกรุก เป็นตัวอย่างรหัสนี้:

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

จะ "กระทืบ" กับสิ่งที่เกิดขึ้นในสิ่งต่อไปในความทรงจำหลังจากbufferนั้น โดยทั่วไปแล้ว 'เหยียบ' คือเมื่อความทรงจำถูกเขียนถึงโดยไม่ได้ตั้งใจ


9

คำตอบอื่น ๆ นั้นถูกต้อง แต่ฉันขอยกตัวอย่าง

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ในอีกนัยหนึ่งมันสามารถรีเซ็ตตัวนับลูป

ฉันคิดว่ามันเป็นตัวอย่างที่ดีที่แสดงให้เห็นถึงความทรงจำ "เหยียบ"


1
มี anther thread ซึ่งพูดถึงตัวอย่างเดียวกันนี้ในระบบปฏิบัติการที่แตกต่างกัน ... stackoverflow.com/questions/31016660
Christian

2
@ คริสเตียนมันไม่มีอะไรเกี่ยวข้องกับระบบปฏิบัติการ นี่คือพฤติกรรมที่ไม่ได้กำหนด
ST3
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.