前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >微软喜提Rust拟替代C/C++?凭什么!

微软喜提Rust拟替代C/C++?凭什么!

作者头像
博文视点Broadview
发布于 2020-06-10 08:02:23
发布于 2020-06-10 08:02:23
1.5K0
举报

今日 @开源中国 一则消息引发热议:微软计划将 Rust 作为 C 和 C++ 的安全替代品

根据微软安全响应中心提供的数据,所有微软年度补丁中约有 70% 是针对内存安全漏洞的修复程序。这样高的百分比是因为 Windows 和大多数其他微软产品主要使用 C 和 C++ 编写,这两种“内存不安全”(memory-unsafe)的编程语言允许开发人员对内存地址进行细粒度控制,并且可以执行代码。管理内存执行的开发人员代码中的一个漏洞可能导致一系列内存安全错误,攻击者可以利用这些错误带来危险和侵入性后果,例如远程代码执行或特权提升漏洞。 于是,探索使用诸如 Rust 之类的内存安全(memory-safe)语言被提上日程,这或将成为创建更安全的微软应用程序的替代方法。 xplanet,公众号:开源中国微软拥抱Rust,以作为C和C++的安全替代方案

其实,自操作系统诞生以来,系统级主流编程语言,从汇编语言到C++,已经发展了近50 个年头,但依然存在两个难题:

  • 很难编写内存安全的代码。
  • 很难编写线程安全的代码。

这两个难题存在的本质原因是C/C++属于类型不安全的语言,它们薄弱的内存管理机制导致了很多常见的漏洞。

可Rust 能解决这个问题多亏了Rust 语言所遵循的设计哲学之一:内存安全

现代编程语言早已发展到了“程序即类型证明”的阶段,类型系统基本已经成为了各大编程语言的标配,尤其是近几年新出现的编程语言。类型系统提供了以下好处:

  • 允许编译器侦测无意义甚至无效的代码,暴露程序中隐含的错误。
  • 可以为编译器提供有意义的类型信息,帮助优化代码。
  • 可以增强代码的可读性,更直白地阐述开发者的意图。
  • 提供了一定程度的高级抽象,提升开发效率。

一般来说,一门语言只要保证类型安全,就可以说它是一门安全的语言。简单来说,类型安全是指类型系统可以保证程序的行为是意义明确、不出错的。像C/C++语言的类型系统就不是类型安全的,因为它们并没有对无意义的行为进行约束。一个最简单的例子就是数组越界,在C/C++语言中并不对其做任何检查,导致发生了语言规范规定之外的行为,也就是未定义行为(Undefined Behavior)。而这些未定义行为恰恰是漏洞的温床。所以,像C/C++这种语言就是类型不安全的语言。

Rust 语言如果想保证内存安全,首先要做的就是保证类型安全。

在诸多编程语言中,OCaml 和Haskell 是公认的类型安全的典范,它们的类型系统不仅仅有强大的类型论理论“背书”,而且在实践生产环境中也久经考验。所以,Rust 语言借鉴了它们的类型系统来保证类型安全,尤其是Haskell,你能在Rust 语言中看到更多Haskell 类型系统的影子。

然而,直接使用Haskell 的类型系统也无法解决内存安全问题。类型系统的作用是定义编程语言中值和表达式的类型,将它们归类,赋予它们不同的行为,指导它们如何相互作用。

Haskell 是一门纯函数式编程语言,它的类型系统主要用于承载其“纯函数式”的思想,是范畴论的体现。而对于Rust 来说,它的类型系统要承载其“内存安全”的思想。所以,还需要有一个安全内存管理模型,并通过类型系统表达出来,才能保证内存安全。

简单来说,就是不会出现内存访问错误。只有当程序访问未定义内存的时候才会产生内存错误。一般来说,发生以下几种情况就会产生内存错误:

  • 引用空指针。
  • 使用未初始化内存。
  • 释放后使用,也就是使用悬垂指针。
  • 缓冲区溢出,比如数组越界。
  • 非法释放已经释放过的指针或未分配的指针,也就是重复释放。

这些情况之所以会产生内存错误,是因为它们都访问了未定义内存。为了保证内存安全,Rust 语言建立了严格的安全内存管理模型:

  • 所有权系统。每个被分配的内存都有一个独占其所有权的指针。只有当该指针被销毁时,其对应的内存才能随之被释放。
  • 借用和生命周期。每个变量都有其生命周期,一旦超出生命周期,变量就会被自动释放。如果是借用,则可以通过标记生命周期参数供编译器检查的方式,防止出现悬垂指针,也就是释放后使用的情况。

其中所有权系统还包括了从现代C++那里借鉴的RAII 机制,这是Rust 无GC 但是可以安全管理内存的基石。

建立了安全内存管理模型之后,再用类型系统表达出来即可。Rust 从Haskell 的类型系统那里借鉴了以下特性:

  • 没有空指针
  • 默认不可变
  • 表达式
  • 高阶函数
  • 代数数据类型
  • 模式匹配
  • 泛型
  • trait 和关联类型
  • 本地类型推导

为了实现内存安全,Rust 还具备以下独有的特性:

  • 仿射类型(Affine Type),该类型用来表达Rust 所有权中的Move 语义。
  • 借用、生命周期。

借助类型系统的强大,Rust 编译器可以在编译期对类型进行检查,看其是否满足安全内存模型,在编译期就能发现内存不安全问题,有效地阻止未定义行为的发生。

内存安全的Bug 和并发安全的Bug 产生的内在原因是相同的,都是因为内存的不正当访问而造成的。同样,利用装载了所有权的强大类型系统,Rust 还解决了并发安全的问题。Rust编译器会通过静态检查分析,在编译期就检查出多线程并发代码中所有的数据竞争问题。

微软拥抱Rust 并非偶然,其实早先微软已在Azure IoT 网络上部分使用了Rust。目前在商业领域,Rust 的重磅商业用户还包括:

  • Amazon,使用Rust 作为构建工具。
  • Atlassian,在后端使用Rust。
  • Dropbox,在前后端均使用了Rust。
  • Facebook,使用Rust 重写了源码管理工具。
  • Google,在Fuchsia 项目中部分使用了Rust。
  • npm,在其核心服务上使用了Rust。
  • RedHat,使用Rust 创建了新的存储系统。
  • Reddit,使用Rust 处理评论。
  • Twitter,在构建团队中使用Rust。

……

Rust 的前景越来越明朗,未来Rust 将大有可为。

本书并非对语法内容进行简单罗列讲解,而是从四个维度深入全面且通透地介绍了Rust 语言。从设计哲学出发,探索Rust 语言的内在一致性;从源码分析入手,探索Rust 地道的编程风格;从工程角度着手,探索Rust 对健壮性的支持;从底层原理开始,探索Rust 内存安全的本质。

本书涵盖了Rust 2018 的特性,适合有一定编程经验且想要学习Rust 的初学者,以及对Rust 有一定的了解,想要继续深入学习的进阶者。

专家力荐

  • Steve Klabnik,Rust 官方核心团队成员及文档团队负责人
  • Patrick Shaughnessy,《Ruby 原理剖析》原著作者
  • 唐刘,PingCAP 首席架构师,TiKV 负责人
  • 陈天,ArcBlock(区块基石)技术VP 终于看见由国内资
  • 杨梓杰(KiChjang@美国),Rust开发者,Servo资深贡献者
  • 孙晓光,知乎搜索技术架构Leader
  • 赵雪松(wayslog),BiliBili高级工程师
  • 唐刚,Rust Web框架Sapper作者
  • LeetCode(领扣网络)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 博文视点Broadview 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
先别急着“用Rust重写”,可能没有说的那么安全
如果各位朋友还没试过 Rust,这里建议您——赶紧去试!还没用过 Rust cat、grep 和 find?不开玩笑,“一试倾心”说的就是 Rust。 太忙了,没时间?不行,这事特别重要,一定要用 Rust 把原有代码资产重写一遍! 一次重写,终身受益。你的系统将更快、更安全!
深度学习与Python
2023/08/08
5910
先别急着“用Rust重写”,可能没有说的那么安全
「转自 InfoQ」Rust:一个不再有 C/C++ 的,实现安全实时软件的未来
Rust 作为新兴编程语言深受 Haskell 和 OCaml 等函数式编程语言的影响,使得它在语法上与 C++ 类似,但在语义上则完全不同。Rust 是静态类型语言,同时具有完整类型推断,而不是 C++ 的部分类型推断,它在速度上可与 C++ 媲美的同时,也保证了内存安全。
MikeLoveRust
2019/10/15
1.3K0
「转自 InfoQ」Rust:一个不再有 C/C++ 的,实现安全实时软件的未来
Rust避坑现代C++悬垂指针
C++是一门应用广泛的编程语言。在2023年JetBrains全球开发者生态问卷调查中,C++在受访程序员过去一年中的使用率,占25%,紧跟JavaScript、Python和Java之后。在本书撰写时,根据JetBrains的统计,程序员使用最多的是C++17。
程序员吾真本
2024/09/18
7352
Rust避坑现代C++悬垂指针
🌱 Rust内存管理黑魔法:从入门到"放弃"再到真香
内存管理是程序世界的"隐形战场",而 Rust 用一套所有权系统直接重构规则——没有 GC、没有手动 malloc/free,却能在编译期拦截 90% 的内存错误!
Jimaks
2025/04/27
1910
Rust 提升安全性的方式
Rust 1 是 Mozilla 公司开发的编程语言,它在 2010 才开始发布第一个版本,可以说是一个非常年轻的语言了。在提出一个新的编程语言的时候,设计者必须要回答的一个问题是「为什么要设计这样一个编程语言?」。对于 Rust 来说,他的目的就是要在保证安全的基础上不失对底层的控制力。
zhiruili
2021/08/10
1K0
【Rust 基础篇】Rust FFI:连接Rust与其他编程语言的桥梁
Rust是一种以安全性和高效性著称的系统级编程语言,具有出色的性能和内存安全特性。然而,在现实世界中,我们很少有项目是完全用一种编程语言编写的。通常,我们需要在项目中使用多种编程语言,特别是在与现有代码库或底层系统交互时。为了实现跨语言的互操作性,Rust提供了"FFI(Foreign Function Interface)",允许Rust代码与其他编程语言进行交互。本篇博客将深入探讨Rust FFI,包括FFI的定义、使用场景、使用方法以及注意事项,以便读者了解如何在Rust中使用FFI与其他编程语言进行无缝集成。
繁依Fanyi
2023/10/12
1.3K0
深入浅出Rust内存安全:构建更安全、高效的系统应用
在过去几年中,Rust编程语言以其独特的安全保障特性和高效的性能,成为了众多开发者和大型科技公司的新宠。尤其是其内存安全特性,成为了广泛讨论和赞扬的焦点。本文旨在深入探讨内存安全的概念、Rust在内存安全方面的独到之处,以及这些特性对系统开发的深远影响。
运维开发王义杰
2024/02/05
6630
深入浅出Rust内存安全:构建更安全、高效的系统应用
安全设计白皮书 | 谷歌对内存安全的洞察
2024 年 3 月 4 号,Google 官方博客[1]发文,宣布《安全设计 - Google 对内存安全的洞察》白皮书[2]。
张汉东
2024/03/12
6870
安全设计白皮书 | 谷歌对内存安全的洞察
一起长锈:4 默认不可变的变量绑定与引用(从Java与C++转Rust之旅)
上次我们聊到,我们那三个程序员小伙伴一起钻研了Rust的prelude和宏。他们还在继续深入研究代码。
程序员吾真本
2024/05/07
3140
一起长锈:4 默认不可变的变量绑定与引用(从Java与C++转Rust之旅)
编程语言中的变革者 | 敢于打造理想世界的 Rust
在历史的早期,程序员们写代码,都是直接机器码编程,就是纸带机,大家都在那戳一个个小孔来编程。
张汉东
2020/04/21
2.3K4
66个让你对Rust又爱又恨的场景之一:变量与值
属于手动内存管理流派的C++,虽然提供了手动管理内存的灵活性,但容易因程序员的失误导致内存泄漏、悬垂指针、双重释放和野指针等问题。
程序员吾真本
2024/07/18
6630
66个让你对Rust又爱又恨的场景之一:变量与值
拜登:“一切非 Rust 项目均为非法”
“程序员编写代码并非没有后果,他们的⼯作⽅式于国家利益而言至关重要。”白宫国家网络总监办公室(ONCD,以下简称网总办)在本周一发布的报告中说道。在该报告中,拜登政府希望软件开发人员尽量使用 Rust 这样的内存安全编程语言,并放弃 C 和 C++ 等安全性薄弱的语言。另外,参议院还强调会努力为内存安全立法。
深度学习与Python
2024/02/29
5380
拜登:“一切非 Rust 项目均为非法”
「我读」PL 观点 | 未定义行为有利的一面
Rust 官方团队 Ralf Jung 在 PL 观点 (PL Perspectives) 博客[1] 上发表了一篇文章 《Undefined Behavior deserves a better reputation》[2] ,文中对UB(未定义行为)有利的一面进行了详细的阐述。通过这篇文章,我们可以对UB 有更深入的理解。
张汉东
2021/11/25
1.8K0
透过 Rust 探索系统的本原:内存管理
对于开发者来说,内存无非是两种管理模式:手动管理或者自动管理。C 语言是手动管理内存的大哥大,而 Java 则是自动管理的扛把子。很多人认为 Java 是使用垃圾回收做内存管理的鼻祖,其实不然,lisp 早于 Java 大概二三十年就武装上了简单的 GC。不过公认的高效率的 GC 是 Java 带给我们的。
tyrchen
2021/05/11
1.3K0
透过 Rust 探索系统的本原:内存管理
第4章 | 所有权
但上述情景似乎难以兼顾:只要指向值的指针仍然存在,释放这个值就必然会让这些指针悬空。几乎所有主流编程语言都只能在两个阵营中“二选一”,这取决于它们从中放弃了哪一项。
草帽lufei
2024/05/08
1800
第4章 | 所有权
C++ 会变成像 Rust 一样的安全语言吗?
对于如何使 C++ 成为一种类似 Rust 及其他内存安全语言(MSL)的安全语言,C++ 专家、ISO C++ 委员会主席 Herb Sutter 在最近的一篇文章中表达了他的看法。他的方法包括依赖工具(与其他 MSL 一样)、推广安全语言特性、不安全特性需要显式启用等等。
深度学习与Python
2024/04/12
1690
C++ 会变成像 Rust 一样的安全语言吗?
C++ 与 Go、Rust、C#:基于实践场景的语言特性对比
C++ 作为老牌编程语言,变量声明方式多样,既可以使用传统的 int num; 方式,也支持 auto 类型推导,例如 auto it = vec.begin(); 。C++ 拥有丰富的数据类型,包括基本数据类型、结构体、类,还支持复杂的自定义类型,并且存在隐式类型转换,但这也可能导致一些潜在的类型错误。
羑悻的小杀马特.
2025/05/13
2070
C++ 与 Go、Rust、C#:基于实践场景的语言特性对比
【C++指南】C++内存管理 深度解析
在 C++ 中,内存管理是程序开发中至关重要的一环。由于 C++ 允许程序员直接操作内存,这既赋予了极大的灵活性,也带来了一定的复杂性和风险。高效且正确的内存管理对于编写高性能、稳定可靠的 C++ 程序起着关键作用。
倔强的石头_
2024/12/06
2210
【C++指南】C++内存管理 深度解析
一个Rust小白发布生产级Rust应用的进阶之路 | 得物技术
在流量日益增长的今天,随着用户需求的不断增加和性能要求的提升,一个能够更好地处理高并发、低延迟和资源有效利用的计算层是十分重要的。尽管在过去我们平台使用Java开发的计算层提供了稳定的服务支撑,但面对日益增长的流量和低延迟的需求,Java不可避免地开始显现局限性:
得物技术
2025/02/27
1240
一个Rust小白发布生产级Rust应用的进阶之路 | 得物技术
论文导读 | Rudra : 查找 Rust 生态系统中的内存安全 Bug
美国佐治亚理工学院的系统软件安全实验室[1]开源了`Rudra`[2] ,用于分析和报告 Unsafe Rust 代码中潜在的内存安全和漏洞,为此他们也将在 2021 年第 28 届 ACM 操作系统原则研讨会论文集上发表相关论文,该论文目前在 Rudra 源码仓库中提供下载[3]。
张汉东
2021/09/02
1K0
论文导读 | Rudra : 查找 Rust 生态系统中的内存安全 Bug
推荐阅读
相关推荐
先别急着“用Rust重写”,可能没有说的那么安全
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档