Linux是否提供低于低端堆栈端的无法访问的内存区域,并具有保证的最小大小? 如果这种保证的最小尺寸存在,那是什么?
或换句话说,我什么时候该开始担心alloca()
或者让我指向有效的非堆栈内存?
正如alloca手册页所述 :
如果堆栈帧不能被扩展,则没有错误指示。 (但是,分配失败之后,如果程序尝试访问未分配的空间,程序可能会收到一个SIGSEGV信号。)
所以没有任何迹象,它也说:
如果分配导致堆栈溢出,程序行为是不确定的。
堆栈溢出问题是递归的一个普遍问题,而不是特别的alloca
或者让我们说变长数组。 通常,您需要找到一种方法来限制递归深度,重构迭代解决方案或使用您自己的动态堆栈( 可能不适用于这种情况 )。
更新
正如OP所发现的那样, Linux在产生一个SIGBUS
信号之后,通过在堆栈溢出之后使用一个保护页来提供一个事实指示 ,该信号解决了问题的第一部分。
感谢@ElliottFrisch让我用正确的名字谷歌这个哎呀。
看起来答案是“在较新的内核中:一个页面,在较旧的内核中:没有这样的保护”。