基于以下假设:
%rsp
或push
操作之前检查堆栈指针(sub
)>是否有一种编程语言可以在100%的堆栈溢出情况下防止未定义的行为?
例如,许多语言使用MMU来捕获堆栈溢出。但是在我看来,如果语言使用动态堆,则MMU无法保护所有内存,因此,从理论上讲,如果程序输入一个非常大的函数,该函数会增加受MMU保护的区域的堆栈大小,[+]进入不受保护的内存,并导致未定义的行为而不会触发MMU。
我的推理有缺陷吗?编程语言是否有一种万无一失的方法来防止堆栈溢出时发生未定义的行为?给出以下假设:我们无法在每次单个push或sub操作之前检查堆栈指针(%rsp)我们无法在编译时计算最大堆栈大小(例如,编程...
-fstack-check
相当便宜地做到了这一点,结合了在堆栈映射下方具有未映射页面的“保护区域”的OS。 (或更具体地说,低于堆栈的最大增长限制,因此堆栈仍可以增长,但不能超出该保护区域。)1MiB保护区域(当前为Linux默认值)通常就足够了,您甚至不需要堆栈探针来防止堆栈重叠且堆栈下方的动态分配出现的stack clash错误。但是,使用未经检查的用户输入作为alloca或C99 VLA大小的错误/易受攻击的程序可能会完全跳过保护区域。