99

「記憶を踏みにじる」というこのブログ投稿に出くわしました

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

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

それで、これは何ですか、記憶を踏み鳴らし、記憶を踏み鳴らしますか?いつ発生しますか?

4

3 に答える 3

120

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

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

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

于 2012-12-02T12:43:45.337 に答える
34

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

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

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

于 2012-12-02T12:42:56.340 に答える
10

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

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。つまり、ループカウンターをリセットする可能性があります。

記憶の「踏みつけ」を示す良い例だと思います。

于 2015-07-14T08:41:02.047 に答える