c语言中的未定义行为

定义(未定义的 Undefined Behavior,UB)

未定义行为是指在 C 语言标准中,标准未对某种行为规定具体结果 ,因此编译器可以自由决定如何处理该行为。未定义行为的本质是结果无法预测 ,即任何结果都可能发生

种类

  1. 访问越界内存
  2. 整型溢出(有符号整数)
  3. 未初始化的局部变量
  4. 修改并读取同一对象,且无序列点隔离
  5. 非法类型转换
  6. NULL 指针解引用
  7. 函数 return 时漏掉返回值

如何避免

  1. 开启编译器警告 (如 -Wall-Wextra 等)
  2. 使用代码静态分析工具 (如 clang-analyzercppcheck
  3. 遵守良好的编码规范,避免在同一表达式中对同一变量既读取又修改
  4. 严格初始化变量,尤其是指针和数组

补充

最容易忽视的未定义错误(修改并读取同一对象,且无序列点隔离)

C 标准规定:

在一次求值过程中,对同一对象的两次访问(其中至少一次是修改),且两者之间没有指定的求值顺序,结果是未定义行为。

cpp 复制代码
a[i++] += a[i];

a[i++] += a[i] 中:

  • ia[i++] 中被读取和修改
  • ia[i] 中再次被读取
  • 两次访问 i 的顺序不确定,这正是 UB 的根源
相关推荐
91刘仁德2 小时前
C++ 继承和多态 设计模式
c语言·c++·笔记
码行山野赴时序归途2 小时前
链表家族收官篇:循环链表
c语言·开发语言·数据结构·链表
景熙55233 小时前
单体项目编写思路和落地形式
java·开发语言
库玛西3 小时前
哈夫曼树与前缀编码:数据压缩的贪心核心
c语言·c++·笔记·考研
计算机毕设定制辅导-无忧学长3 小时前
《基于SpringBoot的未成年人健康知识科普平台的设计与实现》
java·开发语言·vue.js·spring boot·未成年人健康知识科普平台
Ivanqhz4 小时前
Ping-Pong 双缓冲
开发语言·人工智能·python·深度学习·mlir
m0_734571764 小时前
深入理解C++ RAII
开发语言·c++
泡海椒4 小时前
jquick-pdf 表格实战:动态数据 PDF 报表生成
java·开发语言·pdf
雷✘4 小时前
C 语言预处理中的宏展开、条件编译与头文件保护
c语言
aramae4 小时前
模拟实现memset()(C语言)
c语言·开发语言·后端