5

スタックオーバーフローを引き起こして取得Segmentation faultする1つの明白な方法は、スタックフレームがブームになるまで、スタックフレームを互いに再帰的にプッシュすることです。新しいスタックフレームをプッシュしなくても、スタックオーバーフローが発生する可能性があるのではないかと思います。

十分な大きさのアレイを作成することも経験からそれを行うことができますが、他の可能なシナリオはありますか?

4

4 に答える 4

3

C99はサイズ変更可能な配列を使用します。これを使用して、より大きな配列にサイズ変更し続けることができます。ただし、このサイズ変更可能な配列は、を使用して実装されallocaます。UNIXenvのサンプルコードは次のとおりです。

#include <stdio.h>
#include <alloca.h>
#include <stdlib.h>
#include <stdbool.h>

int
main()
{
    while (true)
    {
        void *p = alloca(32UL);
        printf("new memory allocated at %p \n", p);
    }
    exit(EXIT_SUCCESS);
}

そして、あなたの出力はこのようになります

new memory allocated at 0xbf800a60 
new memory allocated at 0xbf800a30 
new memory allocated at 0xbf800a00 
new memory allocated at 0xbf8009d0 
new memory allocated at 0xbf8009a0 
[1]    3977 segmentation fault  ./a.out

allocamalloc、スタックポインタを調整することによってスタックにメモリを割り当てたことを除いて、関数ファミリに含まれています。

于 2012-04-11T09:28:10.633 に答える
1

悪用alloca()または_alloca()WindowsSDK/ VSで開発している場合:

alloca()関数は、呼び出し元のスタックフレームにサイズバイトのスペースを割り当てます。

Note_alloca()は廃止され、。が優先され_malloca()ます。

于 2012-04-11T09:11:54.110 に答える
1

基本的に、「スタック」は単なるメモリであり、スタックオーバーフローは、ESP/EBPがこのメモリの範囲を超えた場合です。

これは、いくつかの方法で実行できます。

  1. 残りのスタックスペースのサイズよりも大きい、スタックに割り当てられた巨大な配列を作成します。int x[10000000];
  2. ESPを直接設定します。__asm mov esp, 0x0
  3. スタックが破損しているため、現在の関数が巻き戻されると、ESP/EBPはガベージに設定されます。int x; memset(&x, 0, 10000000);

そして他の無数の方法...

于 2012-04-11T09:16:31.793 に答える
1

スタックサイズよりも大きい配列を宣言して使用するには、次のようにします。

$ ulimit -s
8192
$

それから

int main(void)
{
    volatile char bla[8192 * 1024 + 16] = {0};
}

実行時にセグメンテーション違反が発生する可能性があります。

于 2012-04-11T09:20:37.910 に答える