[英]Does unsafe code go out of bounds when incrementing a pointer to an array while iterating through the array?
我正在处理图像和视频,在某些情况下确实需要不安全的代码来提高速度。 有时我使用如下代码:
var data = new byte[n];
fixed (byte* fixData = data)
{
byte* ptrData = &fixData[0];
for (int i = 0; i < n; i++)
{
*(ptrData++) = 42;
}
}
我的问题是,由于ptrData
增加了n
次,它最终指向数组之外,但这是一个问题吗? 当然,它永远不会被赋值,因为增量发生在最后一次赋值之后,但是这段代码是否仍然会破坏某些东西,如果是这样,那么严重吗? 我已经运行了 1_000 次这样的代码,但从未遇到过问题,但仍然如此?
该代码并非不安全。 唯一的问题是data
分配失败。 由于n
始终是data
的长度,因此有人无法将i
移出写入范围 - 您的循环仅取决于n
的值。
在循环结束时i >= n
如果您要写入数据,它将产生越界写入。 因此,您必须问自己:您的程序是否有可能在最后写入一个额外的值? 如果是,则您的数据不安全。 如果没有,你很好。
导致缓冲区溢出的问题不是索引超过长度; 问题是一旦发生这种情况,代码就会继续编写。 您进入i >= n
的状态,但这只是循环结束后的状态。 i
可以是任何可能的值,您没有理由在意,因为您不再使用该值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.