C#中有趣的类型系统违规(在安全环境中)为什么在安全的环境中被允许?那么,为什么编译器首先会在安全上下文中允许这样的事情呢?为什么对于具有重叠字段的显式布局的类型不需要不安全的上下文?我希望有人能给出答案——因为它必须很有趣。示例(所有编译都没有不安全的块,甚至没有不安全的开关):[StructLayout(LayoutKind.Explicit)]structValueUnion{[FieldOffset(0)]publicinti;[FieldOffset(0)]publicfloatf;}[StructLayout(LayoutKind.Explicit)]structReferenceUnion{[FieldOffset(0)]publicstringstr;[FieldOffset(0)]publicStream流;}[StructLayout(LayoutKind.Explicit)]structCLRWontLoad{[FieldOffset(0)]publicstringstr;[FieldOffset(0)]publicIntPtrptr;让我回答一些稍微不同的问题。使用显式布局属性是否允许在不使用unsafe关键字的情况下违反类型安全?是的。这就是它的用途。编译器对FieldOffset属性了解多少?编译器validationFieldOffset属性不在静态/常量字段上,它与StructLayout属性一致。它不检查有关属性有效性的任何其他内容。为什么C#编译器不检测属性的潜在不安全使用并要求使用unsafe关键字?这是一个功能。必须考虑、设计、指定、实施、测试、记录并发送给客户才能使用功能。考虑了这个功能。它没有被设计、指定、实施、测试、记录或运送,因此没有这样的能力。这是一个不能令人满意的答案。我的建议是不要在StackOverflow上问“为什么”这类问题。“为什么”的问题含糊不清,所以你经常会得到不尽如人意的答案。“为什么不”的问题更难得到令人满意的回答,因为他们假设世界不应该是一个很好的理由。好的,让我改变一下。如果该功能是为编译器设计团队设计的,他们在决定是否继续使用该功能时可能会考虑哪些利弊?在我看来,与专业人士相比,这里有一些优势。对于适度的成本,该功能将是一个非常小的好处。请记住,实施的每个功能都意味着列表中的另一个功能未实施,因为预算有限。我不想做这个薄弱的功能,必须砍掉一个真正有利于开发者的功能。团队是否考虑过此功能并基于此拒绝了它?是的。请参阅http://connect.microsoft.com/VisualStudio/feedback/details/357828/using-explicit-struct-layout-causes-compiler-to-produce-unverifiable-code这在某种程度上不可避免地最终成为循环解释。它允许您使用联合来违反类型安全,因为这就是您使用联合的原因。它不能省略该功能,因为没有它就无法编写像样的pinvoke。特别是winapi充满了工会。pinvoke并非不安全,它只是无法通过身份验证。C#是一门实用性很强的语言,想拍腿就够了。这不是安全漏洞。CLR真正关心的是可验证代码。C#unsafe关键字只是重叠,没有关键字的C#代码也无法自动验证。使用pinvoke是最明显的例子。CLR源代码在注释中对其进行了很好的解释。来自clr/src/vm/class.cpp,MethodTableBuilder::HandleExplicitLayout()函数://遍历每个字段并查找无效布局//(请注意,我们比Ecma允许的更宽松。我们只不允许最小集有必要//关闭安全漏洞。)////这就是我们要实现的:////1.验证每个OREF都在有效对齐上//2.验证OREF仅与其他OREF重叠。//3。如果一个OREF确实与另一个OREF重叠,则该类被标记为不可验证。//4.如果发生任何类型的重叠,该类将被标记为NotTightlyPacked(影响ValueType.Equals())。//“OREF”表示“对象引用”。规则3将kibosh写成真正不安全的代码,不可靠的代码只能完全信任。规则2拒绝你的第三个例子。这具有使对象保持活动状态的基本功能,因为GC无法猜测对象引用是否有效。还有更多处理显式布局的代码,例如,它还根据参与字段类型的信任度计算最小信任度。您可以在SSCLI20发行版中查看它。哦,现在你已经添加了一些例子。编译器允许它,因为这段代码是安全的。几乎所有你能用不安全代码做的事情都可以用安全代码完成。这就是为什么几乎没有人使用不安全代码的原因。C#还允许您序列化一种类型并将其反序列化为另一种类型。安全并不意味着没有错误。以上就是C#学习教程:InterestingtypesystemviolationsinC#(inasafeenvironment)的全部内容。收藏不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
