C++ 的安全问题(一):为什么「它能跑」远远不够
来源:www.modernescpp.com — 2026-10-18
📋 概述
这是 Rainer Grimm 去世后,Klaus Iglberger 接手其博客的第一篇文章,先交代了背景:Rainer 于 2025 年 10 月 6 日因渐冻症离世,几位 C++ 专家决定共同延续他的博客。正文从一个不争的事实开始:C++ 不是内存安全的。2022 年 NSA 就建议安全相关软件不要再使用 C/C++,欧盟《网络弹性法案》的建议方向相同,其背后是到 2021 年全球网络犯罪年损失约 5.5 万亿欧元的估算。作者不打算参与「这些数据被夸大」的社媒争论,而是转向真问题:我们社区里到底错在哪。他拿 LinkedIn 上一段「回文判断」代码当靶子:滥用 using namespace std、把演示逻辑塞进 main、输入没 const、两个变量挤一条语句、名叫 Pointer 却是 int、size-1 只因选了 int 才没炸、用下标访问不做边界检查、后缀自增却不用旧值——几乎把核心准则违反了个遍。但他真正的杀招在后面:即使改写成用 string_view 和迭代器的 is_palindrome,你也没有把握说它 100% 没有安全问题。无法确信本身,就是「差代码」的定义。
🔑 核心要点
- 接棒的背景:Rainer Grimm 于 2025 年 10 月 6 日因渐冻症去世,Klaus 与几位 C++ 专家共同延续他的博客
- 外部压力是真实的:NSA 2022 年建议安全相关软件不再用 C/C++,欧盟《网络弹性法案》方向相同
- 他拒绝陷入数据之争,转向内部:「当然这些说法有道理,所以更值得探究它们从何而来、我们能做什么」
- 反面教材的问题清单很密:using namespace std、输入未 const、两名挤一条语句、名叫 Pointer 却是 int、下标访问不做边界检查
- 其中一个细节最能说明「侥幸」:lastPointer = size-1 只是因为选了 int 才没出事,换成通用函数就得处理 size_t 的边界
- 真正的判据不是能跑而是能确信:即使改写成 string_view 版本,你也无法逐行确信没有 UB——无法确信本身就是差代码
💡 金句
问题不是「它跑得好不好」,而是「你是否确信」。你是否 100% 确信,这段代码不含任何安全或安保相关的问题?
👍 0
👎 0
← 返回 Lobsters 首页