gpt4 book ai didi

c - 桌面操作系统上的 C 编译器使用多少内存页来检测堆栈溢出?

转载 作者:太空狗 更新时间:2023-10-29 17:07:27 25 4
gpt4 key购买 nike

这个问题与this one相关但不同。关于 C99 中的可变长度数组。

答案指出,在堆栈中分配可变长度数组(或只是固定大小的大数组)的一个危险是分配可能会悄无声息地失败,而不是调用 malloc,它明确地告诉调用者分配是否成功。

现代非嵌入式编译平台使用无效内存区来检测一些堆栈溢出,无需额外成本(检查只是 MMU 已经免费进行的检查)。这并不能 100% 避免上述问题,因为非常大的本地数组可能会导致堆栈指针跳过无效区域。

有谁知道通常为这种检测分配多少页?我猜它至少是 4KiB,但可能更多。这是编译器还是操作系统做出的选择,无论哪种情况,有没有办法改变它?

最佳答案

我很确定最常见的做法是只使用一页,通常是 4k。然而,一个好的编译器会按顺序尝试访问大于函数入口(或 VLA/alloca 分配)页面大小的堆栈帧的每个页面,以确保命中保护页面。 GCC 可以选择这样做;参见:http://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html#Code-Gen-Options-fstack-check 选项。

关于c - 桌面操作系统上的 C 编译器使用多少内存页来检测堆栈溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5543330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com