外部精选
软件工程
#开发者实时流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 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。