桌面操作系统上的C编译器使用多少个内存页来检测堆栈溢出?
这个问题与C99中的可变长度数组有关但不同。
答案指出,在堆栈中分配可变长度数组(或只是固定大小的大数组)的一个危险是分配可能会无声地失败,而不是调用
malloc
,它明确地告诉调用者分配是否成功。
现代非嵌入式编译平台使用无效的内存区域来检测一些堆栈溢出,而无需额外成本(检查只是MMU已经免费进行的检查)。这不能保证100%免受上述问题的影响,因为非常大的本地数组可能导致堆栈指针跳过无效区域。
有没有人知道通常会为此检测分配多少页?我想这至少是4KiB,但它可能会更多。这是由编译器或操作系统做出的选择,在任何一种情况下,有没有办法改变它?
没有找到相关结果
已邀请:
2 个回复
莽缓逢
讼乐
分配)页面大小的堆栈帧的每个页面,以确保命中一个保护页面。 GCC可以选择这样做;请参阅:http://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html#Code-Gen-Options和
选项。