如何在GNU / linux中创建堆栈溢出的条件?
答案 0 :(得分:12)
一个没有出路的递归函数应该做的伎俩
伪代码,我的c有点生锈
void stack_overflow()
{
stack_overflow();
}
答案 1 :(得分:9)
我建议阅读phrack杂志文章"Smashing the stack for fun and profit"。 它还包含示例代码。
答案 2 :(得分:4)
有code samples in the Wikipedia article。为什么你想让一个人超越我...
答案 3 :(得分:4)
您只需要考虑在C中使用堆栈的内容。
malloc()
)使用堆; 所以,你所要做的就是耗尽筹码。对函数或大型局部变量创建的无限递归(不要让它们通过超出范围来清除)应该这样做。
答案 4 :(得分:1)
使用alloca()或strdupa()
答案 5 :(得分:1)
其他答案中提到了很多例子。但是每个人似乎都错过了这一点。
要强制堆栈溢出,需要了解堆栈的大小。在linux中,堆栈的默认大小为8MB。
ulimit -a //would give you the default stack size
ulimit -s 16384 // sets the stack size to 16M bytes
因此,如果您将堆栈大小调整得那么小,那么即使使用100个整数数组也可以强制堆栈溢出。
答案 6 :(得分:0)
最简单的方法就是声明一个足够大的自动堆栈变量。不需要递归或alloca。有趣的是,这不是编译时错误。所需的大小因平台而异:
#define SIZE 10000000
int main(int argc, char **argv)
{
char a[SIZE];
}
答案 7 :(得分:0)
“如何在linux中创建堆栈溢出的条件”
与在Windows上创建堆栈溢出的方式相同。
杰森的答案可能有用,但有些编译器将其优化为循环。我认为添加一个参数可以解决这个问题: int Add(int num)
{
num += Add(num);
return num;
}