1

假设我只有一个先前堆栈分配内存的指针,我想知道我有多少元素。怎么做?

MSDN说:“stackalloc在公共语言运行时使用自动启用缓冲区溢出检测功能”所以我猜大小​​保持在某个地方。

4

1 回答 1

3

您要查找的信息不存在,您有责任对此进行跟踪。

缓冲区溢出检测不检查“数组”上的越界访问 -没有数组。相反,它使用在堆栈上分配的内存之后添加的随机值。在函数 Epilog 中,它检查值是否仍然存在 - 如果不存在,则终止整个过程。

.Net中stackalloc的缓冲区溢出保护

不用说,这并不能确定您不会遭受缓冲区溢出(或下溢,这是这里的主要关注点)。它只是试图限制其潜在影响。结合将stackallocced locals 保留在尽可能小的函数中,这是一种非常简单但仍然非常有效的恶意代码执行预防。您仍然可以覆盖(或读取)其他本地变量,但不能覆盖例如函数返回指针。

于 2019-04-09T08:00:28.843 回答