定义(未定义的 Undefined Behavior,UB)
未定义行为是指在 C 语言标准中,标准未对某种行为规定具体结果 ,因此编译器可以自由决定如何处理该行为。未定义行为的本质是结果无法预测 ,即任何结果都可能发生。
种类
- 访问越界内存
- 整型溢出(有符号整数)
- 未初始化的局部变量
- 修改并读取同一对象,且无序列点隔离
- 非法类型转换
NULL
指针解引用- 函数
return
时漏掉返回值
如何避免
- 开启编译器警告 (如
-Wall
、-Wextra
等) - 使用代码静态分析工具 (如
clang-analyzer
、cppcheck
) - 遵守良好的编码规范,避免在同一表达式中对同一变量既读取又修改
- 严格初始化变量,尤其是指针和数组
补充
最容易忽视的未定义错误(修改并读取同一对象,且无序列点隔离)
C 标准规定:
在一次求值过程中,对同一对象的两次访问(其中至少一次是修改),且两者之间没有指定的求值顺序,结果是未定义行为。
cpp
a[i++] += a[i];
在 a[i++] += a[i]
中:
i
在a[i++]
中被读取和修改i
在a[i]
中再次被读取- 两次访问
i
的顺序不确定,这正是 UB 的根源