C++26 标准库硬化:告别未定义行为

C++26: Standard Library Hardening Experiments

C++26 标准库硬化:告别未定义行为

2026 年,C++ 标准库迎来重大变革,引入“硬化”(Hardening)机制。过去,像 std::vector 的越界访问会导致未定义行为(UB),程序可能崩溃或产生难以复现的诡异错误。现在,在硬化模式下,这些错误将触发明确的合约违规并终止程序,而非陷入未定义状态。文章深入探讨了 P3471 等核心提案,展示了 GCC、Clang 和 MSVC 如何通过不同宏和编译选项(如 _GLIBCXX_ASSERTIONS、_LIBCPP_HARDENING_MODE)启用这一功能。虽然硬化不能替代静态分析或 Sanitizers,但它为将常见的内存安全问题转化为可检测的失败提供了标准化的基线,让 C++ 开发更加安全可控。

C++26 硬化并不能让 C++ 突然变得内存安全,也无法替代 Sanitizers、静态分析、良好的 API 设计或仔细的验证。
  1. steveklabnik

    关于这一切,我有个好奇的地方:我以为这些东西都已经纳入 C++26 了,可为什么我们还在看到像 https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p43... 这样的提案?

    > C++26 草案尚未完成最终投票

    这篇论文是 Bjarne 共同撰写的,所以我敢肯定它并非无稽之谈,但也许是我漏掉了什么细节。我知道 Bjarne 曾威胁要否决 C++26 标准,但我以为他最后并没有这么做?

    有没有比我对流程更了解的朋友能提供一些背景信息?

  2. Cieric

    结尾处稍微提了一句,但我真心希望编译期契约断言能变得更普及。我知道像 Spark、Dafny 等少数语言已经实现了这一点,并能自动生成诸如“除以零”这类情况的隐式契约。我自己也在实验一种能实现这些功能的自定义语言,结果每天回公司用 C++ 干活时,反而觉得有点落差。

  3. pama

    虽然晚了 30 年,但我愿意接受。契约机制看起来很有用,而且比异常处理更清爽。

同日更多故事

2026-08-31