The production bug that made me care about undefined behavior
5 months ago
- #Undefined Behavior
- #Initialization
- #C++
- 作者讲述了一个C++代码库中的bug:某HTTP接口同时返回'error'和'succeeded'字段为true,而这两个状态本应互斥。
- 问题根源在于结构体中未初始化的布尔字段——由于C++的默认初始化规则,导致了未定义行为。
- 该'Response'结构体因含有非POD类型(std::string),触发编译器生成不初始化原始类型(bool)的默认构造函数。
- 解决方案包括:实现默认构造函数、在结构体定义中设置默认值,或在声明时使用零值初始化(Response response{})。
- Address Sanitizer(ASan)和clang-tidy等工具能检测此类问题,但需要完备的测试覆盖且存在性能开销。
- 作者对比了C/Go/Rust等语言更简单的初始化方式,凸显C++初始化规则的复杂性与陷阱。
- 文章强调了未定义行为的现实危害:即使代码看似正确,仍可能导致程序出现不可预测的行为。