为什么固定大小的缓冲区(数组)一定是不安全的?假设我想要一个7字节(或3或777)的值类型。我可以这样定义它:publicstructBuffer71{publicbyteb0;公共字节b1;公共字节b2;公共字节b3;公共字节b4;公共字节b5;公共字节b6;}一个更简单的定义方法是使用一个固定的BufferpublicstructBuffer72{publicunsafefixedbytebs[7];}当然第二个定义更简单。问题是必须为固定缓冲区提供unsafe关键字。我知道这是使用指针实现的,因此不安全。我的问题是为什么它必须是不安全的?为什么C#不能提供任意定长数组并将它们保存为值类型,而不是使它们成为C#引用类型数组或不安全缓冲区?因为“固定缓冲区”不是真正的数组。它是一种自定义值类型,是我所知道的用C#语言生成的唯一方法。CLR无法验证数组索引是否以安全方式完成。该代码也不可验证。最具代表性的demo:usingSystem;类程序{staticunsafevoidMain(string[]args){varbuf=newBuffer72();Console.WriteLine(buf.bs[8]);控制台.ReadLine();}}publicstructBuffer72{publicunsafe固定字节bs[7];在此示例中,您可以任意访问堆栈帧。恶意代码可以使用标准缓冲区溢出注入技术来修补函数返回地址并强制您的代码跳转到任意位置。是的,这是非常不安全的。以上是C#学习教程:为什么固定大小的缓冲区(数组)一定是不安全的?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
