Apa yang dimaksud dengan "hentakan memori"?

95

Saya baru saja menemukan entri blog ini yang menyebutkan "memori yang menghentak":

program C ++ yang dengan mudah mampu menginjak memori (sesuatu yang mungkin belum pernah Anda dengar jika Anda lahir di dunia kode terkelola.)

Dan sebenarnya saya belum pernah mendengarnya!

Jadi, apa ini, memori yang menginjak, memori yang menginjak? Kapan itu terjadi?

berkerut
sumber
4
Contoh yang baik dari langkah memori adalah pertanyaan ini: stackoverflow.com/questions/31016660/…
Phillip Ngan

Jawaban:

117

Memori "diinjak" ketika sepotong kode memanipulasi memori tanpa menyadari bahwa potongan kode lain menggunakan memori itu dengan cara yang bertentangan. Ada beberapa cara umum untuk menginjak memori.

Salah satunya mengalokasikan, katakanlah, 100 byte memori tetapi kemudian menyimpan sesuatu yang melewati alamat ke-100. Memori ini mungkin digunakan untuk menyimpan sesuatu yang sama sekali berbeda. Ini sangat sulit untuk di-debug karena masalah akan muncul ketika sesuatu mencoba mengakses korban yang diinjak, dan kode yang menginjaknya mungkin sama sekali tidak terkait.

Yang lainnya adalah mengakses memori setelah dibebaskan. Memori dapat dialokasikan untuk objek lain. Sekali lagi, kode yang menunjukkan masalah mungkin terkait dengan objek yang baru dialokasikan yang mendapat alamat yang sama dan tidak terkait dengan kode yang menyebabkan masalah.

David Schwartz
sumber
3
Ini adalah contoh bagus dari memory stomping.
patryk.beza
33

Seringkali itu adalah buffer overrun; sebagai contoh, kode ini:

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

akan "menginjak" apa pun yang terjadi di hal berikutnya dalam memori setelahnya buffer. Secara umum, 'menghentak' adalah saat memori ditulis secara tidak sengaja.

IronMensan
sumber
9

Jawaban lain pada dasarnya benar, tetapi saya ingin memberikan contoh.

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;

Sampel ini dapat mengarah ke loop tak terbatas (atau mungkin tidak mengarah), karena ini adalah perilaku yang tidak ditentukan.

Variabel yang sangat mungkin idalam memori disimpan tepat setelah array. Jadi mengakses a[10]sebenarnya dapat mengakses idengan kata lain dapat mengatur ulang penghitung loop.

Saya pikir itu adalah contoh yang baik yang menunjukkan memori "menghentak".

ST3
sumber
1
Ada utas lain, membahas hampir sama contoh yang sama pada sistem operasi yang berbeda ... stackoverflow.com/questions/31016660
Christian
2
@Christian Ini tidak ada hubungannya dengan OS. Ini adalah perilaku yang tidak ditentukan.
ST3