在 C++ 的早期,内存安全问题——缓冲区溢出、悬空指针、释放后使用——广为人知,但并未被视为需要在语言层面修复的紧迫缺陷。为什么?
1.性能为王
C++ 在 20 世纪 80 年代作为对 C 的强大升级而出现。它赋予开发者:
- 对内存的直接控制
- 面向对象编程
- 零成本抽象
这种控制意味着快如闪电的应用。内存 bug?那被认为是开发者的责任。当时的心态是:“能力越大,责任越大——写出更好的代码就行。”确实,C++ 赋予开发者:
- C++ 赋予开发者对内存的直接访问、手动资源管理、底层控制和精细的性能优化。
- 但这也意味着这门语言不会手把手地帮你。它不会阻止你犯下危险的错误——比如缓冲区溢出、重复释放或悬空指针。
- 因此,责任落在开发者身上,要写出正确、安全、高效的代码。
2.开发者离硬件更近
那时,大多数 C++ 开发者都是系统程序员,或从事接近硬件的工作。他们深刻理解内存——malloc、指针、栈与堆。安全防护网既不被期待,甚至不被需要。
3.安全当时不是核心关切
在八九十年代,安全威胁没有今天这样深远的影响。内存泄漏或溢出大多被视为bug 或稳定性问题,而不是远程代码执行的载体或数据窃取的手段。
4.工具还不存在
静态分析器、模糊测试器、ASan 或 Valgrind 之类的工具?要么不存在,要么极其有限。及早发现细微的内存问题并不容易。因此,大多数团队只能靠经验和评审。
快进到今天:为什么我们现在在乎
今天,软件驱动一切——汽车、飞机、心脏起搏器、金融系统。内存漏洞不再只是崩溃——它可能是网络攻击或灾难性故障。
随着意识的提高,以及一系列举措的出现:
- 微软推动内存安全语言
- Rust 的崛起
- GCC/Clang 的安全加固编译选项
- Google 在 Carbon 和内存安全 C++ 子集上的努力
……显然,行业终于开始正视这个潜伏了数十年的风险。
下一步是什么?
早期 C++ 的哲学优先考虑能力、性能和灵活性——而非安全。这在当时是合理的。但世界已经改变。现在,我们重新思考“现代 C++”应该意味着什么——不只是更快,还要在设计上更安全。
最近,C++ 之父 Bjarne Stroustrup 向 C++ 社区发出行动呼吁,以回应政府机构和行业领袖对内存安全日益严格的审查。
现在的问题是:C++ 能否很快在设计上解决其安全问题,还是 Rust 这样的语言将继续在 C++ 传统主导的领域中攻城略地。
