C 语言 UB:从热巧克力到爆炸
Attention people who think UB is fine
很多人以为 C 语言中的未定义行为(UB)只是会导致程序崩溃或段错误,实际上后果可能更诡异。文章通过 `std::unreachable()` 和空指针解引用的例子,展示了 GCC 和 clang 编译器在遇到 UB 时可能完全改变代码逻辑:未调用的函数被意外执行、写入内存的值被篡改,甚至程序直接崩溃。这些行为并非偶然,而是编译器基于“代码不可能执行”的假设进行的激进优化。UB 的本质是“可以做任何事”,从执行相邻内存指令到随机写入数据,一切皆有可能。
未定义行为可以做任何事,包括执行相邻内存中的代码、写入随机值到地址零,或者干脆按你直觉预期的方式运行。