"Hafıza baskısı" nedir?


96

Sadece geldi bu blog yayınında karşısında “memleketinden belleği” bahseder:

hafızayı kolayca ezebilen bir C ++ programı (yönetilen bir kod dünyasında doğduysanız muhtemelen hiç duymadığınız bir şey.)

Ve aslında bunu hiç duymadım!

Öyleyse, bu ne, bir hafıza ezmesi, hafızayı ezmek mi? Ne zaman meydana gelir?


4
Bellek tıkanıklığına iyi bir örnek şu sorudur: stackoverflow.com/questions/31016660/…
Phillip Ngan

Yanıtlar:


118

Bellek, bir kod parçası başka bir kod parçasının o belleği çakışacak şekilde kullandığını fark etmeden belleği manipüle ettiğinde "ezilir". Belleği bastırmanın birkaç yaygın yolu vardır.

Biri, örneğin 100 bayt bellek ayırıyor, ancak daha sonra 100. adresi geçen bir şeyi depoluyor. Bu hafıza tamamen farklı bir şeyi tutmak için kullanılabilir. Bu, özellikle hata ayıklaması zordur, çünkü bir şey ezilen kurbana erişmeye çalıştığında sorun ortaya çıkacaktır ve üzerinde ezilen kod tamamen alakasız olabilir.

Bir diğeri, serbest bırakıldıktan sonra belleğe erişiyor. Hafıza başka bir nesne için tahsis edilebilir. Yine, sorunu gösteren kod, aynı adresi alan ve soruna neden olan kodla ilgisi olmayan, yeni tahsis edilen nesne ile ilgili olabilir.


3
İşte hafızayı çiğnemenin güzel bir örneği.
patryk.beza

34

Çoğu zaman bir tampon taşmasıdır; örnek olarak bu kod:

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

hafızadaki bir sonraki şeyde ne olursa olsun "ezip geçecek" buffer. Genel olarak konuşursak, 'stomping', belleğin istemeden yazılmasıdır.


9

Diğer cevaplar temelde doğrudur, ancak bir örnek vermek isterim.

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;

Bu örnekler, tanımsız bir davranış olduğu için sonsuz döngüye yol açabilir (veya yönlendirmeyebilir).

iBellekteki büyük olasılıkla değişken diziden hemen sonra saklanır. Yani erişim a[10]aslında erişebilir i, başka bir deyişle döngü sayacını sıfırlayabilir.

Bence hafızanın "ezilmesini" gösteren iyi bir örnek.


1
Hemen hemen aynı örneği farklı işletim sistemlerinde tartışan başka bir konu var ... stackoverflow.com/questions/31016660
Christian

2
@Christian Bir işletim sistemi ile ilgisi yoktur. Bu tanımlanmamış bir davranıştır.
ST3
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.