0

理解を助けてください - なぜこの実行時エラーが発生するのですか:

*** スタック破壊が検出されました ***:
プログラムはシグナル SIGABRT を受信しました。中止されました。

次のコードの場合:

#define WORD_SIZE   (sizeof(int))
#define FLOOR_MASK  0xfffffffc


static void SetVal(void* _block, int _size)
{
    *(int*)_block = _size;
}

void BufferInit(void* _buffer, size_t _totalSize)
{
  int alignedSize;

  assert(_buffer);

  /* align _totalSize to be WORD_SIZE multiple */
  alignedSize = _totalSize & FLOOR_MASK;

  /* mark end of buffer */
  SetVal(_buffer + alignedSize, END_VAL);
}

int main()
{
    Byte buffer[36];

    BufferInit(buffer, 37);

    return 0;
}

PS: 実行の最後にエラーが発生します (オンライン"return 0;")。

ありがとう。

4

2 に答える 2

3

関数はSetVal()、末尾として指定した場所に 4 バイトを書き込みます。あれは:

BufferInit(buffer, 37);

... Leads to ... 

SetVal(_buffer + alignedSize, END_VAL);

... which does ...

*(int*)_block = _size;

alignedSize36 (37 & ~3 = 36) [~3 = 0xFFFFFFFC] です。オフセット 36 の 4 バイトは、バイト 36、37、38、および 39 に書き込みます。バッファは元々 36 バイトの長さなので、バッファの外にあります。バッファの長さを 40 バイトに変更するか、37 を 33 [またはそれ以下の数値] に変更してください。

于 2013-02-13T22:52:37.370 に答える
0

愚かな間違い..

バッファのサイズを超えました:

alignedSize [= buffer size] = 36
bytes allocated for buffer:   0-35

(buffer + 36)= buffer [36]を変更していますが、これはバッファのメモリ制限を超えています。

修正されたコード:

SetVal(_buffer + alignedSize - WORD_SIZE, END_VAL); 
于 2013-02-13T22:19:24.490 に答える