C++ 优化后竟给 root 权限?
Spooky C++
万圣节特辑:一段看似无害的 C++ 代码,在开启 -O2 优化后竟会错误地授予 root 权限。这不是灵异事件,而是 std::string_view 引发的未定义行为(UB)陷阱。当输入字符串长度与目标一致且作为内联参数传递时,编译器优化可能导致不可思议的结果。无论是 clang++ 还是 g++,在 C++17 到 C++23 标准下都会复现此现象。虽然这种 bug 在真实场景中极难触发,但它生动地提醒我们:忽视未定义行为,代码可能比鬼故事更可怕。
这不是鬼魂在作祟,也不是电脑闹鬼,而是未定义行为导致的反直觉结果。
HN 评论区
12- MathMonkeyMan
你返回了一个指向临时对象的指针。这很糟糕,但很容易发现。
你会返回 `input.c_str()` 吗?你可能对此犹豫再三,但这本质上是一样的事。我最喜欢的修复方案是将参数改为 `std::string_view`。
string_view remove_leading_spaces(string_view input) {
auto new_start = find_if(input.begin(), input.end(), [](char ch) { return ch != ' '; });
return string_view(new_start, input.end());
}
不过,你程序中未定义行为导致的结果确实令人惊讶。这倒是常态。
- quuxplusone
这就是为什么我把 string_view 称为“仅限参数类型”的原因:作为参数传入没问题,但绝不适合返回或存储为变量。(当然,这里的“适合”与“不适合”有合理的定义。该博文就展示了一种“不适合”的情况。)
https://quuxplusone.github.io/blog/2018/03/27/string-view-is...
- dingaling911
噢,这真够糟糕的。但提出的将 admin_id 改为单例的解决方案有点奇怪。
真正的修复方法是:不要向 sanitize 函数传递临时对象。