17611538698
info@21cto.com

微软希望 C# 更安全,但又不想把它变成 Rust

动态 0 12 1天前
图片

导读:各位,微软开始向Rust看齐了,最看重的便是安全特性。

.NET 产品经理 Richard Lander 刚写了一篇文章,他描述了团队打算如何通过引入新模型和重新定义现有的 unsafe 关键字来提高 C# 的内存安全性,使该语言更像 Rust,但又不放弃自动的内存管理机制。
图片

Lander 如此表示道:“我们设想,未来 C# 将与一系列其他语言一起,因其类型和内存安全保障而受到青睐。” 

许多 C# 开发者写了好多年程序,但有的从未使用过unsafe 关键字,但其实自 C# 语言最初发布以来就已存在。“编写 unsafe 代码就像在 C# 程序中编写 C 代码一样,”C# 的作者 Anders Hejlsberg 等人撰写的早期著作《C# 程序设计语言》中这样描写道。

需要使用 unsafe 代码的情况包括与底层操作系统进行互操作、访问内存映射设备或实现时间关键型代码。unsafe 代码允许使用指针类型(.NET 垃圾回收器不会跟踪这些类型)和指针运算符。除此之外,现有的 unsafe 修饰符对类型或成员没有其他影响。

这种情况将在 C# 16 中改变,C# 16 比现在晚两个版本,根据 .NET 的年度发布周期,它将于 2027 年底发布,届时还将发布 .NET 12,而 .NET 12 将是一个长期支持 (LTS) 版本。开发者还可以期待在 C# 15 和 .NET 11 中看到预览版。

根据当前的语言提案,在新模型中,将方法标记为不安全也会将其标记为“需要不安全”,这意味着调用者必须处于不安全的上下文中,并且如果基类成员是安全的,则重写的方法不能是不安全的。这意味着不安全标记会一直传递给调用者,直到通过在方法中包含不安全的上下文(但不将该方法标记为不安全)来抑制它为止。

也有人质疑,为什么团队要依靠“unsafe”关键字的缺失来抑制传播,而不是使用“safe”关键字。“我一直在向设计团队建议这样做,”Lander说道

以后将无法再将类型标记为unsafe;不安全范围将下移至各个方法、属性和字段。

C# 的另一个变化是,使用指针类型和某些指针表达式将不再被视为不安全;只有解引用指针并因此访问非托管内存才需要不安全的上下文。

Lander表示,C# 16将采用可选加入的方式,这表示着开发者可以继续使用C# 1.0模型,但.NET运行时库需要选择加入。此外微软正在考虑在.NET包存储库NuGet的包上添加徽章,以显示包是否已选择加入,从而鼓励用户采用新模型。未来版本的C#可能会改为选择退出。“我们的目标是让新的C#安全模型成为新的标准,”Lander说道。

其目的并非降低不安全代码的危险性,而是使其更易于查看和审查。这同样适用于安全文档,例如在不安全成员上添加注释,定义其使用规范,静态代码分析器会鼓励这种做法。

目前开发者的反应大多是积极的。“我既是 C# 开发者也是 Rust 开发者,我非常欢迎这种改变……如果 C# 能更接近托管版的 Rust,我也不会反对,”一位开发者高兴地说道 。 

这项提案的一个奇怪之处在于,从事业务应用程序开发的 C# 开发人员不会注意到任何变化,因为他们从不使用不安全的代码。尽管如此,Lander 表示,“这项功能是我们能够做出的最具影响力的改进之一”,以提升人们对 C# 代码安全性的信心。

作者:场长

参考:

https://devblogs.microsoft.com/dotnet/improving-csharp-memory-safety/

评论

我要赞赏作者

请扫描二维码,使用微信支付哦。

分享到微信