web-dev-qa-db-ja.com

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

私はちょうど来ました このブログ投稿全体 「メモリを踏みつぶす」ことについて言及しています:

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

実際、私はそれを聞いたことがありません!

それで、これは何ですか、メモリーストンプ、メモリーストンプ?いつ発生しますか?

90
scravy

別のコードが競合する方法でそのメモリを使用していることを認識せずに、コードがメモリを操作すると、メモリは「破棄」されます。メモリがストンプされる一般的な方法がいくつかあります。

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

もう1つは、メモリが解放された後にアクセスすることです。メモリは別のオブジェクトに割り当てることができます。繰り返しますが、問題を示すコードは、同じアドレスを取得し、問題を引き起こしたコードとは無関係の、新しく割り当てられたオブジェクトに関連している可能性があります。

113
David Schwartz

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

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

bufferの後のメモリ内の次のものにあるものに対して「踏み鳴らし」ます。一般的に、「踏みつけ」とは、メモリが意図せずに書き込まれることです。

32
IronMensan

他の答えは基本的に正しいですが、例を挙げたいと思います。

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にアクセスできました。つまり、ループカウンターをリセットできました。

メモリの「踏みつけ」を示す良い例だと思います。

8
ST3