2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

C++ 会变成像 Rust 一样的安全语言吗?

作者:Sergio De Simone

  • 2024-05-02
    北京
  • 本文字数:1578 字

    阅读完需:约 5 分钟

C++ 会变成像 Rust 一样的安全语言吗?

对于如何使 C++ 成为一种类似 Rust 及其他内存安全语言(MSL)的安全语言,C++ 专家、ISO C++ 委员会主席 Herb Sutter 在最近的一篇文章中表达了他的看法。他的方法包括依赖工具(与其他 MSL 一样)、推广安全语言特性、不安全特性需要显式启用等等。


Sutter 指出,为了使 C++ 变得更加安全,首先要解决 4 种主要的内存安全相关的漏洞。实际上,在总共 12 类与内存安全相关的漏洞中(约占所有 CVE 的 70%),有 4 个源于越界读、越界写、空指针解引用和访问已释放内存。



根据 Sutter 的说法,C++ 已经对编写安全代码提供了广泛的支持,而且 C++ 文献早就确定了用于实现这一目标的关键规则。不过,他认为,作为一种关键的语言特性,C++ 应该严格执行这些规则,只有当程序员明确选择不遵循标准规则时,才可以使用不安全行为。


默认启用安全规则不会限制这门语言的能力,但若要采用非标准实践就需要显式做出选择,从而减少无意的风险。它可以随着时间的推移而进化,这一点很重要,因为 C++ 是一种活的语言,而敌手会不断地改变他们的攻击手法。


Sutter 还描述了一些错误的问题和认识。他指出,大多数高严重性 CVE 都与内存安全无关(尽管越界写是罪魁祸首);MSL 也有 CVE;MSL 也依赖于静态分析程序和杀毒程序等工具。因此,最终目标不可能是让 C++ 程序完全摆脱与内存安全相关的 CVE,也不是在不依赖工具的情况下强制执行内存安全规则或者使 C++ 代码在形式上可证明。


在他的文章中,Sutter 重启了一个关于 C++ 内存安全的讨论,那是由 2023 年美国国家安全局网络安全信息表引发的,它建议人们远离 C/C++ 以及其他内存不安全的语言。


作为对 NSA 报告的回应,Bjarne Stroustrup 表达了他的观点,即 C++ 可以像 Rust 一样安全,而且不用像后者那么复杂:


C++ 核心指南旨在为那些需要静态类型安全和资源安全的 C++ 开发人员提供这方面的保证,而且不会破坏代码库,他们可以在没有这类强力保证或不额外引入工具链的情况下对代码库进行管理。


在这里,Stroustrup 含蓄地指出,ISO 委员会正在开展有关 C++ profilse 的工作,其目的是使逐步采用更安全的行为并在编译时强制执行安全规则成为可能。


“Profile”是一组确定性的(deterministic)、便于强制执行(portably enforceable)的规则子集(即限制),旨在实现特定的保证。“确定性”意味着它们只需要局部分析,并且可以在编译器中实现(尽管它们不必如此)。“便于强制执行”意味着它们就像语言规则一样,程序员可以使用不同的强制执行工具,而且不同的工具对于相同的代码会给出同样的答案。


特别地,C++ profiles 包括类型安全、边界安全和生命周期安全。根据 Stroustrup 的说法,符合 profiles 规则的代码是安全的,因为其中包含安全保障。


Stroustrup 对 NSA 报告的批评引起了有些人的注意,Jimmy Hartzell 就提出了一些有根据的批评,其中包括 C++ 还不是一种内存安全的语言,线程安全等领域的考虑还比较欠缺,而 Rust 已经有很多与之相关的机制。


现在,甚至在系统编程领域,C++ 也受到 Rust(一种强大的内存安全编程语言,而且可以避免 C++ 的许多问题)的威胁。即使是在 C++ 非“遗留”的领域,也有了可行的、内存安全的替代方案,而且没有像 C++ 那么多的技术债务。


回到 Sutter 的观点,和 Stroustrup 一样,他也相信,profiles 是使 C++ 更安全的一个关键特性,可以将 C++ 代码中类型 / 边界 / 初始化 / 生命周期相关的 CVE 减少 98%,而又不限制 C++ 的能力:


我不希望 C++ 限制我的表达能力。我只是希望 C++ 能默认执行我们已经熟知的安全规则和最佳实践,如果我想的话,我也可以明确地选择不遵守。然后,我仍然可以使用完全现代化的 C++……只是更友善一些。


在文章的最后,为了帮助 C++ ISO 委员会达成 98% 的目标,他提出了一些广泛而具体的建议。相关细节,错过可惜。


原文链接:

https://www.infoq.com/news/2024/04/cpp-memory-safety-sutter/

2024-05-02 08:0010388

评论

发布
暂无评论
发现更多内容

Android技术分享| 开源Demo any自习室布局架构

anyRTC开发者

音视频 移动开发 在线自习室 Android技术分享

打爆怪兽 一起来养猪 养蜂人 幸福饭店

游戏开发_软件开发

软件 App 开发 游戏 语音合成

在同一台计算机中运行多个MySQL服务

Java 数据库 后端 msyql

精品!阿里P7爆款《K8s+Jenkins》技术笔记,高质量干货必收藏

Java 程序员 架构 面试 k8s

论亚马逊QLDB与腾讯TDSQL对历史数据的管理和计算

腾讯云数据库

数据库 tdsql

高性能利器:CDN我建议你好好学一下!

九灵

Java 分布式 微服务 CDN

“小巨人”的转型烦恼,百度智能云能否解压?

百度开发者中心

人工智能 企业资讯 中小企业

令我入职阿里的750页微服务架构深度解析文档有何神秘之处?

Java 编程 架构 面试 架构师

狂刷《Java权威面试指南(阿里版)》,冲击“金九银十”有望了

Java 编程 架构 面试 程序人生

「技术点串烧」☕【Java 技术指南】「难点-核心-遗漏」Java线程状态流转及生命周期的技术指南!

码界西柚

Java 线程 Thread 9月日更

安卓工控主板双网口有什么用途?

双赞工控

安卓主板 工控主板

为什么UI自动化难做?—— 关于Selenium UI自动化的思考

LigaAI

测试 UI自动化

揭秘TDSQL-A:兼容Oracle的同时支持海量数据交互

腾讯云数据库

数据库 tdsql

架构训练营 模块一

Leach Sun

华为云GaussDB首次亮相2021服贸会,为数字人民币提供坚实数据底座

华为云数据库小助手

金融科技 数字经济 GaussDB 华为云数据库

腾讯云 TDSQL 审计原理揭秘

腾讯云数据库

数据库 tdsql

一文读懂数据库最新技术趋势:TDSQL带你深度纵览VLDB 2019

腾讯云数据库

数据库

TDSQL:关于未来,数据库大咖们都聊了什么?

腾讯云数据库

数据库 tdsql

如何在MacOS上无缝切换Win11和MacOS?

Zhendong

MacBook m1 Parallels

低代码的5个误区,你踩雷了吗?

禅道项目管理

低代码 开发

微信或推出聊天记录云备份付费服务,你的微信记录值多少钱?

郑州埃文科技

云服务 微信聊天 数据风险管理

你的 SQL 还在回表查询吗?快给它安排上覆盖索引

Java MySQL 数据库 后端

EMQ 映云科技与 RT-Thread 达成战略合作,共建产业物联网平台

EMQ映云科技

人工智能 云计算 大数据 物联网 emq

腾讯云数据库TDSQL两篇论文入选数据库顶会SIGMOD,产学研结合助力国产数据库生态建设

腾讯云数据库

数据库 tdsql

浅析 DDD 领域驱动设计

牧小农

DDD 领域驱动

把工作讲给家人听

FunTester

读书笔记 FunTester 奈非文化手册 办公效率 居家工作

TDSQL:从自主可控金融级数据库看腾讯“智能+”技术中台之路

腾讯云数据库

数据库 tdsql

springboot项目集成docker

try catch

Docker Dockerfile springboot

TDSQL:深度剖析数据库国产化迁移之路

腾讯云数据库

数据库 tdsql

为数据赋能:腾讯TDSQL分布式金融级数据库前沿技术 - 云+社区 - 腾讯云

腾讯云数据库

数据库 tdsql

2021云计算白皮书发布,腾讯云原生数据库TDSQL-C助力共建云上技术生态

腾讯云数据库

数据库 tdsql

C++ 会变成像 Rust 一样的安全语言吗?_编程语言_InfoQ精选文章