Linux 是否在堆栈下端以下提供了一个具有保证最小大小的不可访问的内存区域?如果存在这样的保证最小尺寸,它是什么呢?
或者换句话说,我什么时候应该开始担心alloca()
或者给我指向有效的非堆栈内存的指针?
As the alloca 手册页 http://man7.org/linux/man-pages/man3/alloca.3.html says:
如果堆栈帧无法扩展,则不会出现错误指示。
(但是,分配失败后,程序可能会收到
如果尝试访问未分配的空间,则会发出 SIGSEGV 信号。)
所以根本没有任何指示,它还说:
如果分配导致堆栈溢出,则程序行为是不确定的。
堆栈溢出问题是递归的一个普遍问题,并不是特定的问题alloca
或者说可变长度数组。通常,您需要找到一种方法来限制递归的深度,重构迭代解决方案或使用您自己的动态堆栈(可能不适用于这种情况).
Update
正如OP发现的那样Linux 确实使用堆栈后的保护页提供了事后指示 https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=320b2b8de12698082609ebbc1a17165727f4c893通过生成一个来防止堆栈溢出SIGBUS
信号,它解决了问题的第一部分。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)