0

如何在 GNU/linux 中创建堆栈溢出的条件?

4

8 回答 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 回答