Linux是否在较低的堆栈端提供了有保证的无法访问的内存区域?

时间:2014-03-20 17:36:31

标签: c linux memory-management memory-layout

Linux是否在低堆栈端提供了一个具有保证最小大小的无法访问的内存区域?如果存在这样一个保证的最小尺寸,它是什么?

或者换句话说,什么时候我应该开始担心alloca()左右如何给我指向有效的非堆栈内存?

2 个答案:

答案 0 :(得分:4)

正如alloca man page所说:

  

如果无法扩展堆栈帧,则没有错误指示。          (但是,在分配失败后,该程序可能会收到          如果它试图访问未分配的空间,则为SIGSEGV信号。)

所以根本没有迹象,它也说:

  

如果分配导致堆栈溢出,则程序行为未定义。

堆栈溢出问题是递归的一般问题,而不是alloca或者说可变长度数组。通常,您需要找到一种方法来限制递归的深度,重构到迭代解决方案或使用您自己的动态堆栈(可能不适用于此案例)。

更新

当OP通过生成SIGBUS信号发现Linux does provide an after the fact indication using a guard page after the stack堆栈溢出时,该信号解决了问题的第一部分。

答案 1 :(得分:1)

感谢@ElliottFrisch让我用正确的名字谷歌这个...哎呀。

看起来答案是"在较新的内核中:一个页面,在较旧的内核中:没有这样的保护"。

https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=320b2b8de12698082609ebbc1a17165727f4c893