• 为什么说C#是世界上最安全的编程语言
  • 发布于 2个月前
  • 332 热度
    0 评论
.NET 编程安全一直是过去十年的热门话题之一。它是 .NET 等托管环境的固有组件。

安全形式:
Type safety 类型安全 — 不能使用任意类型代替另一个类型,避免未定义的行为。
Memory safety 内存安全 — 不能使用任意类型代替另一个类型,避免未定义的行为。

Concurrency or thread safety 并发或线程安全 — 不能使用任意类型代替另一个类型,避免未定义的行为。


.NET 从最初的设计开始就被设计成一个保证安全的平台。特别需要指出的是,它旨在启用新一代 Web 服务器,这些服务器一直需要在世界上复杂的计算环境(Internet)中接受不受信任的输入的考验。现在普遍认为网络程序应该用安全的语言编写。


类型安全由语言和运行时模块同时强制执行。编译器验证静态不变量,例如分配不同的类型——例如,分配 string 给 Stream——这将导致编译器中产生错误。运行时验证动态不变量,例如不同类型之间的转换,就将产生 InvalidCastException。


内存安全主要由代码生成器(如 JIT)和垃圾收集器合作实现。变量引用值要么是活动对象,要么是 null,要么超出范围。默认情况下内存是自动初始化的,这样新对象就不会使用未初始化的内存。边界检查禁止访问数组中无效索引的元素读取未定义的内存——通常由一个单位的错误偏移引起——这会导致 IndexOutOfRangeException。


Cnull 处理是保证内存安全的一种特殊形式。可空引用类型 Nullable reference types 是一种 C# 语言和编译器功能,可静态标识未安全处理的代码 null。特别是,如果您取消引用可能为 null 的变量,编译器会发出警告。您还可以禁止 null 赋值,这样编译器会在您可能给变量赋空值时发出警告。运行时具有匹配的动态验证功能,可通过抛出 NullReferenceException 来防止引用被访问。


C# 功能依赖于库中可为空的属性 nullable attributes 。它还依赖于它们在库和应用程序堆栈(我们已经完成)中的详尽应用,以便为您的代码提供来自静态分析工具的准确结果。


.NET 中没有内置的并发安全。相反,开发人员需要遵循模式和约定来避免未定义的行为。.NET 生态系统中还有分析器和其他工具,可以深入了解并发问题。核心库包括多种可以安全并发使用的类型和方法,例如支持任意数量的并发读取器和写入器而不会冒数据结构损坏风险的 concurrent collections 并发集合。


运行时公开安全和 unsafe code 不安全的代码模型。安全代码的安全性得到保证,这是默认设置,而开发人员必须选择使用不安全代码。不安全代码通常用于与底层平台互操作、与硬件交互或对性能关键路径实施手动优化。


沙箱 sandbox 是一种特殊的安全形式,它提供隔离并限制组件之间的访问。我们依赖标准的隔离技术,如进程(和 CGroups)、虚拟机和 WebAssembly(具有不同的特性)。
用户评论