当前位置:首页 > 科技资讯 > 正文

C++的未来:面对挑战,迎接变革

“如果我们必须在底层掌控与极致性能间做出选择,C++依然是无可替代的王者。”

在Rust崛起、AI编程重塑开发范式的今天,历经四十载风雨的C++似乎正面临前所未有的挑战。

内存安全漏洞是否无解?

AI生成的代码究竟是编程的福音还是隐患?

当“未定义行为”从优化的基石变为安全的梦魇,C++标准委员会又将如何应对?

带着这些深刻而尖锐的问题,在2025全球C++及系统软件技术大会的采访间,奇点智能研究院首席技术咨询师吴咏炜与Adobe首席科学家、C++标准委员会资深委员David Sankel展开了一场直击痛点的深度对话。

C++的未来:面对挑战,迎接变革 C++ Rust 内存安全 未定义行为 第1张

左:吴咏炜,右:David Sankel

David Sankel没有回避任何一个敏感话题。从揭示“新代码比旧代码更脆弱”的反直觉真相,到坦陈C++在工具链生态上被Rust“降级打击”的无奈,再到对AI编程助手“既依赖又怀疑”的矛盾心态,Sankel以一位顶尖语言设计者的视野,为我们抽丝剥茧,还原了一个真实、复杂且充满生命力的C++世界。

这不仅是一场关于技术的探讨,更是一次关于如何在不确定的技术浪潮中寻找确定性的思想碰撞。

以下为对话全文:

吴咏炜:嗨David,欢迎来全球C++及系统软件技术大会的采访间。请你先向大家打个招呼。

David Sankel:大家好。真的很高兴能来到这里,感觉特别棒。

吴咏炜:首先,我们来探讨一下现代代码与遗留系统的安全性问题。你在本次大会演讲中提到了一个耐人寻味的趋势:大多数内存安全漏洞源于新编写的代码,而不是遗留系统。你认为这是什么原因造成的?是因为语言固有的复杂性、对现代特性的误用、开发者经验不足,还是工程流程和工具链存在缺口?

David Sankel:这个现象的核心在于“代码硬化”(Code Hardening)的过程,它通常只发生在那些长期承受巨大安全审查压力的旧代码上。

以Zlib这个古老的C语言库为例,多年来,无数人都在积极地试图攻破它。在这个过程中,绝大多数潜在的漏洞都已经被挖掘并修复了。只要这种对抗性的压力持续存在,代码就会随着时间的推移变得越来越坚固。

漏洞出现在新代码中的原因,实际上仅仅是因为这些代码还没有时间在那种对抗性压力下经过“历练”。这完全是关于漏洞生存周期的问题。如果你看看旧的Zlib代码刚出来的时候,它也有成吨的漏洞。这似乎是公共领域软件的一种现象,因为人们总是在试图攻击它。

因此,这主要是一个成熟度的问题:代码越成熟,Bug自然越少。

这种现象积极的一面是,我们不需要回头去处理所有的代码库。如果你拿Adobe Photoshop来说,它有6800万行代码,我们无法回头去修复所有那些旧代码。但好消息是,我们其实不必像防范新代码那样去焦虑旧代码。我们将防御重点集中在新引入的代码上,这让内存安全问题从一个“不可能完成的任务”变成了一个“可控的工程问题”。

吴咏炜:我们知道,在C语言中,由于开发者通常需要直接管理定长数组和原始内存,缓冲区溢出这类问题非常普遍。理论上,C++引入了许多现代特性,本应大幅降低此类风险。但现实数据却表明,我们依然面临着大量的内存相关漏洞。为什么在机制更完善的C++中,这类问题依然无法根除?

David Sankel:C++确实通过引入高级抽象降低了内存安全漏洞的发生频率,但这并不意味着它从根本上消除了隐患。

现实情况是,工程师仍然很容易写出导致越界访问的代码。过去是对C风格数组的越界,而现在的“现代版本”则是对std::vector的越界访问——其本质依然是相同的内存安全问题。再比如使用未初始化的变量,这种风险在C++中也并未消失。

归根结底,C++继承了C语言的底层内存模型和许多“不安全”的基因。只要这些从C语言遗留下来的底层机制仍然被允许使用,或者现代容器的使用方式缺乏强制性的安全约束,内存安全漏洞的温床就依然存在。

吴咏炜:相比十年前,我们现在拥有了强大得多的动态分析工具。比如Memory Sanitizer (MSan)、Address Sanitizer (ASan)、Thread Sanitizer (TSan)以及Undefined Behavior Sanitizer (UBSan)等等

David Sankel:你说得完全正确。问题是:这些工具是否在C++生态系统中被普遍使用了?遗憾的是,我认为答案是否定的。

阻碍工具普及的原因可以分为两类。一类是主观因素——比如开发者缺乏认知,或者根本不在乎;但更关键的,是一类非常现实的客观门槛:这些工具的配置成本极高。

要想让这套Sanitizer组合在构建系统中完美运行,需要付出巨大的工程代价。这往往要求你在项目启动之初就具备极高的前瞻性,并投入资源去配置基础设施。但在项目早期,你甚至不知道它能不能存活下去,往往无暇顾及这些。

这就导致了一个典型的“成功悖论”:等到你的开源库大获成功、被广泛采用时,它可能一直是在没有Sanitizer保护的“裸奔”状态下开发的。突然之间,潜伏的漏洞随着你的库扩散到了整个生态链。

更糟糕的是,即便你现在亡羊补牢加上了防护,下游用户依然可能在使用你的旧版本代码。为什么?因为在C++生态中,依赖管理和版本升级是一项昂贵的工程活动。用户往往因为升级成本过高而停留在有漏洞的旧版本上,导致问题持续存在。

吴咏炜:但我认为你的论点可能是我们不想用C++写新代码。但其实我们完全可以在新代码中使用这些工具而不是在旧代码中因为旧代码可能有更多的兼容性问题。在新代码中我们绝对可以使用新工具。

David Sankel:你的论点建立在一个关键假设之上:即只要使用了这些新工具就能解决所有或者至少绝大部分的内存安全漏洞。诚然它们能大幅缓解问题但现实数据却给我们泼了一盆冷水。

让我们看看Google的数据。在Android系统开发中他们拥有世界顶级的工程师团队并且在C++开发流程中强制启用了所有的Sanitizer和最佳实践。即便武装到了这种程度他们依然持续发现C++代码中的内存漏洞。

更令人震惊的对比来自于他们引入Rust之后的数据:在同样的严苛标准下C++代码产生的内存安全漏洞数量几乎是Rust代码的1000倍。

这是一个非常“硬”的数据它揭示了一个残酷的现实:工具只能缓解症状却无法根治病灶。

吴咏炜:好的让我们转向下一个关于C++价值主张的问题。如今Rust凭借“内存安全”特性迅速崛起Python在AI时代更是占据主导也确实吸走了一部分原本依赖C++的用户。但在游戏引擎、系统底层、高性能计算等核心场景C++依旧稳固。在你看来C++最核心、最不可替代的优势是什么?为什么这些优势至今仍难被其他语言取代?

David Sankel:我认为C++拥有一个任何人都夺不走的“利基市场”(Niche),其核心价值主张在于:它允许开发者通过承担“未定义行为”(Undefined Behavior)的风险来换取绝对极致的性能。

...(中间内容保持不变)...