在遍历数组时递增指向数组的指针时,不安全代码是否越界?
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_000s 次,但从未遇到过问题,但仍然如此?
该代码并非不安全。唯一的问题是 data
的分配失败。由于 n
始终是 data
的长度,因此有人无法将 i
移出边界进行写入 - 您的循环仅取决于 n
的值。
在循环结束时 i >= n
将产生 out-of-bounds 写入 如果 您要写入数据。因此,您必须问问自己:您的程序是否有可能受到影响,在末尾写入一个额外的值?如果是,则您的数据不安全。如果没有,你很好。
导致缓冲区溢出的问题不是索引超过了长度,而是索引超出了长度。问题是一旦发生这种情况,代码就会继续编写。您进入 i >= n
的状态,但这只是循环结束后的状态。 i
可以是任何可能的值,您没有理由关心,因为您不再使用该值。
我正在处理图像和视频,在某些情况下确实需要不安全的代码来提高速度。有时我使用如下代码:
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_000s 次,但从未遇到过问题,但仍然如此?
该代码并非不安全。唯一的问题是 data
的分配失败。由于 n
始终是 data
的长度,因此有人无法将 i
移出边界进行写入 - 您的循环仅取决于 n
的值。
在循环结束时 i >= n
将产生 out-of-bounds 写入 如果 您要写入数据。因此,您必须问问自己:您的程序是否有可能受到影响,在末尾写入一个额外的值?如果是,则您的数据不安全。如果没有,你很好。
导致缓冲区溢出的问题不是索引超过了长度,而是索引超出了长度。问题是一旦发生这种情况,代码就会继续编写。您进入 i >= n
的状态,但这只是循环结束后的状态。 i
可以是任何可能的值,您没有理由关心,因为您不再使用该值。