未定义行为 在计算机程序设计中未定义行为英語undefined behavior是指执行某种计算机代码所产生的结果这种代码在当前程序状态下的行为在其所使用的语言标准英语Programminglanguagespecification中没有规定常见于翻译器对源代码存在某些假设而执行时这些假设不成立的情况 一些编程语言中某些情况下存在未定义行为以C和C最为著名在这些语言的标准中规定某些操作的语义是未定义的典型的例子就是程序错误的情况比如越界访问数组元素标准允许语言的具体实现做这样的假设只要是符合标准的程序代码就不会出现任何类似的行为具体到 CC 中编译器可以选择性地给出相应的诊断信息但没有对此的强制要求针对未定义行为语言实现作出任何反应都是正确的类似于数字逻辑中的无关项英语Dontcare term虽然编译器实现可能会针对未定义行为给出诊断信息但保证编写的代码中不引发未定义行为是程序员自己的责任这种假设的成立通常可以让编译器对代码作出更多优化同时也便于做更多的编译期检查和静态程序分析 有时候也可能存在对于未定义行为本身的限制性要求例如在CPU的指令集说明中可能将某些形式的指令定为未定义但如果该CPU支持内存保护说明中很可能会还会包含一条兜底的规则要求任何用户态的指令都不会让操作系统的安全性受损这样一来在执行未定义行为的指令时就允许CPU破坏用户寄存器但不允许发生诸如切换到监控模式的操作 和未指定行为英语unspecified behaviorunspecified behavior不同未定义行为强调基于不可移植或错误的程序构造或使用错误的数据一个符合标准的实现可以在假定未定义行为永远不发生除了显式使用不严格遵守标准的扩展的基础上进行优化可能导致原本存在未定义行为例如有符号数溢出的程序经过优化后显示出更加明显的错误例如死循环因此这种未定义行为一般应被视为bug