スタックオーバーフローを引き起こして取得Segmentation fault
する1つの明白な方法は、スタックフレームがブームになるまで、スタックフレームを互いに再帰的にプッシュすることです。新しいスタックフレームをプッシュしなくても、スタックオーバーフローが発生する可能性があるのではないかと思います。
十分な大きさのアレイを作成することも経験からそれを行うことができますが、他の可能なシナリオはありますか?
スタックオーバーフローを引き起こして取得Segmentation fault
する1つの明白な方法は、スタックフレームがブームになるまで、スタックフレームを互いに再帰的にプッシュすることです。新しいスタックフレームをプッシュしなくても、スタックオーバーフローが発生する可能性があるのではないかと思います。
十分な大きさのアレイを作成することも経験からそれを行うことができますが、他の可能なシナリオはありますか?
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
alloca
はmalloc
、スタックポインタを調整することによってスタックにメモリを割り当てたことを除いて、関数ファミリに含まれています。
悪用alloca()
または_alloca()
WindowsSDK/ VSで開発している場合:
alloca()関数は、呼び出し元のスタックフレームにサイズバイトのスペースを割り当てます。
Note_alloca()
は廃止され、。が優先され_malloca()
ます。
基本的に、「スタック」は単なるメモリであり、スタックオーバーフローは、ESP/EBPがこのメモリの範囲を超えた場合です。
これは、いくつかの方法で実行できます。
int x[10000000];
__asm mov esp, 0x0
int x; memset(&x, 0, 10000000);
そして他の無数の方法...
スタックサイズよりも大きい配列を宣言して使用するには、次のようにします。
$ ulimit -s
8192
$
それから
int main(void)
{
volatile char bla[8192 * 1024 + 16] = {0};
}
実行時にセグメンテーション違反が発生する可能性があります。