如何在 GNU/linux 中创建堆栈溢出的条件?
Bhrigu Pandey
问问题
4411 次
8 回答
12
一个没有出路的递归函数应该可以解决问题
伪代码,我的 c 有点生疏了
void stack_overflow()
{
stack_overflow();
}
于 2008-12-25T15:07:30.033 回答
9
我建议阅读 phrack 杂志的文章“为了乐趣和利润而粉碎堆栈”。它还包含示例代码。
于 2008-12-25T16:34:18.127 回答
4
维基百科文章中有代码示例。为什么你要造成一个超出我的...
于 2008-12-25T15:07:24.620 回答
4
您只需要考虑在 C 中使用堆栈的是什么。
- 动态内存分配(带
malloc()
)使用堆; - 局部变量和函数调用堆栈使用堆栈。
所以,你所要做的就是耗尽堆栈。函数上的无限递归或大型局部变量创建(尽管超出范围,但不要让它们被清理)应该这样做。
于 2008-12-25T15:08:23.510 回答
1
使用 alloca() 或 strdupa()
于 2008-12-25T15:29:32.250 回答
1
在其他答案中已经提到了很多例子。但每个人似乎都错过了这一点。
要强制堆栈溢出,需要了解堆栈的大小。在 linux 中,堆栈的默认大小是 8MB。
ulimit -a //would give you the default stack size
ulimit -s 16384 // sets the stack size to 16M bytes
因此,如果您将堆栈大小调整到那么小,即使使用 100 个整数的数组也可以强制堆栈溢出。
于 2012-07-04T21:50:47.583 回答
0
最简单的方法就是声明一个足够大的自动堆栈变量。不需要递归或分配。有趣的是,这不是编译时错误。所需尺寸因平台而异:
#define SIZE 10000000
int main(int argc, char **argv)
{
char a[SIZE];
}
于 2008-12-26T11:32:15.443 回答
0
《如何在linux中创建堆栈溢出的条件》
与在 Windows 上创建堆栈溢出的方式相同。
Jason 的答案可能有效,但一些编译器通过将其优化为循环。我认为添加 aa 参数可以解决问题:
int Add(int num)
{
num += Add(num);
return num;
}
于 2008-12-26T12:23:22.563 回答