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