「メモリストンプ」とは何ですか?


95

私は「記憶を踏み鳴らす」について言及しているこのブログ投稿に出くわしました

メモリを簡単に踏み付けることができるC ++プログラム(マネージコードの世界で生まれた場合、おそらく聞いたこともないもの)

そして実際、私はそれについて聞いたことがありません!

それで、これは何ですか、メモリを踏み鳴らして、メモリを踏みつけますか?いつ発生しますか?


4
メモリストンプの良い例は次の質問です。stackoverflow.com
Phillip Ngan

回答:


117

コードの一部が競合する方法で別のコードがそのメモリを使用していることを認識せずにメモリを操作すると、メモリは「踏みにじられ」ます。メモリを踏みつける一般的な方法はいくつかあります。

1つは、たとえば100バイトのメモリを割り当てますが、100番目のアドレスを超えて何かを格納します。このメモリは、まったく異なるものを保持するために使用される場合があります。何かが踏みつけられた犠牲者に何かがアクセスしようとすると問題が発生し、踏みつけられたコードはまったく無関係である可能性があるため、これは特にデバッグが困難です。

もう1つは、解放後にメモリにアクセスしています。メモリは別のオブジェクトに割り当てられます。この場合も、問題を示すコードは、同じアドレスを取得した新しく割り当てられたオブジェクトに関連していて、問題の原因となったコードには関連していない可能性があります。


3
これは、メモリを踏み鳴らす良い例です。
patryk.beza 2015

33

多くの場合、これはバッファオーバーランです。例として、このコード:

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
別のスレッドがあり、別のオペレーティングシステムで同じ例をほぼ議論しています... stackoverflow.com/questions/31016660
Christian

2
@クリスチャンOSとは関係ありません。これは未定義の動作です。
ST3、2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.