博客 阅读时间 3 分钟

C++ 之父回应白宫警告,但无风不起浪 :)

分享本文
C++ creator responds to White House warning, but there's no smoke without fire :)

在 3 月 15 日对InfoWorld问询的回应中,Stroustrup 指出了 C++ 的优势。"那些政府文件的撰写者似乎对当代 C++ 的优势以及为提供强大安全保证所做的努力视而不见,我对此感到惊讶。"Stroustrup 说。

Stroustrup 指出了问题根源的一个关键事实:

"存在两个与安全相关的问题。在数十亿行的 C++ 代码中,完全遵循现代准则的寥寥无几,而且人们对于安全的哪些方面重要的看法也各不相同。"

这凸显了 C++ 的一个重大问题。当任何编程语言允许执行潜在有害的操作时,相当一部分开发者可能会滥用它,这不足为奇。

而当被质问写了糟糕代码时,开发者可能会提出各种理由为自己的行为辩解,尽管这些往往是借口而非正当理由:

  1. deadline 紧张:"因为 deadline 紧张,我不得不赶工。没有足够的时间写出干净的代码。"
  2. 遗留代码:"现有代码库乱七八糟、结构糟糕。我的改动只是融入了现有的混乱之中。"
  3. 需求蔓延:"需求在整个项目中不断变化,使得保持代码整洁变得困难。"
  4. 技术限制:"我们使用的技术栈不适合编写干净的代码。我们受限于现有的条件。"

所以,是的,开发者有责任确保他们正确地编写 C++ 代码。然而,这种思路对 C++ 的未来可能有风险。几年前,我们目睹了诺基亚的衰落。事实上,诺基亚从世界领先的手机制造商沦落到在市场中苦苦挣扎,是一个由多种因素和战略失误写成的故事。诺基亚的关键错误之一是决定过长时间地坚持其塞班(Symbian)操作系统。虽然塞班曾经是一个占主导地位的平台,但它难以与 iOS 和 Android 提供的用户体验竞争。

在 C++ 中,我们依赖当前的内存管理机制已经太久了,没有人提出过彻底的解决方案,只有一些需要开发者自行应用的改进。

C++ 与 .NET 的策略对比:

C# 于 2000 年开发,主要面向 Windows 机器。Miguel de Icaza 创建了 Mono,使其能够在 Linux 和 macOS 上使用。然而,在十多年主要于 Windows 上使用标准 .NET 框架之后,该语言的可移植性出现了一个重大问题。为解决这个问题,微软与 Miguel 合作创建了 .NET Core——一个旨在在其他操作系统上运行的 .NET 子集。

这不是对可移植性问题的渐进式解决方案,而是一个彻底的解决方案,尽管一些遗留代码不兼容。当时,Miguel de Icaza 将 .NET Core 描述为基于精简版类库的 .NET 重新设计版本",而微软的 Immo Landwerth 解释说,.NET Core 将成为"所有未来 .NET 平台的基础"。

最终,这个解决方案非常成功:.NET Core 得到了广泛使用,可移植性这一重大问题得以解决。

为什么不对 C++ 采取类似的方法,更果断地解决安全问题?为什么不开发一个安全的 C++ 子集,并通过编译器提供使用该子集的选项?

clang --safe

结论:

如果 C++ 继续允许开发者进行不安全的内存操作,这个重大的安全关切将持续存在,并可能导致 Rust 或 Go 等其他语言在新项目中更受青睐。也许是时候考虑一个更彻底的解决方案,而不是仅仅依赖渐进式改进了。诚然,经验已经表明:尽管 C++ 十多年来一直提供旨在解决安全问题的现代特性,但由于该语言继续允许不安全的遗留做法,问题依然存在。

分享本文