返回资讯中心
外部精选
软件工程
#开发者实时流

C++ 代码在 -O2 优化下因 string_view 悬垂引用误授 root 权限

来源标题:Spooky C++

一段 C++ 权限校验代码在 -O2 优化编译后会把普通用户误判为 root。原因是 Sanitize 函数返回指向局部 std::string 的 string_view,-O2 下悬垂引用导致比较结果异常。该函数从输入字符串去掉前导空格后返回视图,而输入参数在函数返回时已销毁。

Hacker News 最新ibobev2026/11/3 · 今天4 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

你想看点……吓人的东西吗?想听一个故事吗?一个阴魂不散、令人毛骨悚然、让你夜不能寐的故事?那咱们来看看这个授予权限的程序:

#include <iostream>
#include <string>
#include <string_view>

std::string_view Sanitize(const std::string& input) {
    std::string_view sanitized = input;
    while (!sanitized.empty() && sanitized.front() == ' ') {
        sanitized.remove_prefix(1);
    }
    return sanitized;
}

int main() {
    std::cout << std::boolalpha;
    std::string_view username = Sanitize("foobarbazboo");
    std::string admin_id = "root_1231231";
    std::cout << "Grant foobarbazboo root permissions = " << (username == admin_id) << "\n";
    return 0;
}

我编译并运行这段代码时(clang++-19 -std=c++17 -O0 -Wall -Wextra -Wpedantic cursed.cpp -o cursed_clang && ./cursed_clang),一切正常,我的用户 foobarbazboo 并没有获得 root 权限:

Grant foobarbazboo root permissions = false

然而,如果我是在森林里编译这段代码,在万圣节午夜,站在一块通灵板上,对着镜子说了五遍“Candyman”,然后把优化选项改成 -O2——这个程序就会诡异地给 foobarbazboo 授予 root 权限……

clang++-19 -std=c++17 -O2 -Wall -Wextra -Wpedantic cursed.cpp -o cursed_clang_optimized && ./cursed_clang_optimized
Grant foobarbazboo root permissions = true

这是鬼——鬼——鬼魂在作祟吗?我的电脑被——被——被诅咒了吗?

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →