**未定义行为(UB)**是程序的行为,其结果在C语言标准中未定义。编译器或系统可以执行任何操作——从无明显错误到完全崩溃或数据损坏。
典型的UB原因:
如何最小化UB:
int arr[5]; arr[10] = 0; // UB — 数组越界 int* p = NULL; *p = 42; // UB — 解引用NULL指针
问题: 如果执行一个整数除以零,程序会表现得如何?
答案: 根据C标准(ISO C99 6.5.5),除以0是未定义行为。可能发生崩溃、产生垃圾或甚至得到"逻辑上正确"的输出,但标准没有保证任何结果。
int a = 10, b = 0; printf("%d", a / b); // 未定义行为
历史
在一个嵌入式系统的项目中,程序员写了一个遍历数组的循环,不小心超出了数组的界限一个元素。应用程序正常工作,但一个月后开始出现内存中其他数据的损坏(短暂的错误,难以重现)。问题只有在仔细审查和使用静态分析工具检查后才被发现。
历史
开发人员认为解引用NULL指针总是会导致崩溃,因此没有添加对NULL的检查。然而在一个罕见的平台上,这导致了不正确(但不致命)的内存修改,破坏了其他结构并导致难以捕捉的bug。
历史
在生成伪随机数时使用了除法,在某些输入参数值下会出现除以0的情况。在大多数平台上,程序会直接崩溃,但在其中一个平台上,结果是一个不正确的数字,导致各个环境之间难以重现bug。