Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
假设我只有一个先前堆栈分配内存的指针,我想知道我有多少元素。怎么做?
MSDN说:“stackalloc在公共语言运行时使用自动启用缓冲区溢出检测功能”所以我猜大小保持在某个地方。
stackalloc
您要查找的信息不存在,您有责任对此进行跟踪。
缓冲区溢出检测不检查“数组”上的越界访问 -没有数组。相反,它使用在堆栈上分配的内存之后添加的随机值。在函数 Epilog 中,它检查值是否仍然存在 - 如果不存在,则终止整个过程。
.Net中stackalloc的缓冲区溢出保护
不用说,这并不能确定您不会遭受缓冲区溢出(或下溢,这是这里的主要关注点)。它只是试图限制其潜在影响。结合将stackallocced locals 保留在尽可能小的函数中,这是一种非常简单但仍然非常有效的恶意代码执行预防。您仍然可以覆盖(或读取)其他本地变量,但不能覆盖例如函数返回指针。