C++ 优化后竟给 root 权限?

Spooky C++

万圣节特辑:一段看似无害的 C++ 代码,在开启 -O2 优化后竟会错误地授予 root 权限。这不是灵异事件,而是 std::string_view 引发的未定义行为(UB)陷阱。当输入字符串长度与目标一致且作为内联参数传递时,编译器优化可能导致不可思议的结果。无论是 clang++ 还是 g++,在 C++17 到 C++23 标准下都会复现此现象。虽然这种 bug 在真实场景中极难触发,但它生动地提醒我们:忽视未定义行为,代码可能比鬼故事更可怕。

这不是鬼魂在作祟,也不是电脑闹鬼,而是未定义行为导致的反直觉结果。
  1. 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());

    }

    不过,你程序中未定义行为导致的结果确实令人惊讶。这倒是常态。

  2. quuxplusone

    这就是为什么我把 string_view 称为“仅限参数类型”的原因:作为参数传入没问题,但绝不适合返回或存储为变量。(当然,这里的“适合”与“不适合”有合理的定义。该博文就展示了一种“不适合”的情况。)

    https://quuxplusone.github.io/blog/2018/03/27/string-view-is...

  3. dingaling911

    噢,这真够糟糕的。但提出的将 admin_id 改为单例的解决方案有点奇怪。

    真正的修复方法是:不要向 sanitize 函数传递临时对象。

同日更多故事

2026-10-31