C99标准给出了未定义行为的以下定义:
使用不可移植或错误的程序结构或错误数据时的行为,本国际标准不对其施加任何要求。
如果您正在开发一个永远不需要移植的项目,也就是说,编译器和微控制器不会改变,您是否可以安全地使用国际标准所说的非便携式构造,如果它们会导致未定义的行为是由你正在使用的编译器或微控制器定义的吗?
答案 0 :(得分:4)
您始终可以从硬件,操作系统和编译器供应商处寻找其他保证。 "未定义的行为"为符合实施的添加保证和规则留出了空间。
答案 1 :(得分:1)
代码添加增加1到MAX_INT,在一个平台上,不能保证会发生什么,不能保证会发生什么。如果代码在平台上执行此类操作以保证结果为MIN_INT,则结果保证为MIN_INT。
请注意,有很多情况(包括整数溢出)平台不做任何保证,但经常会以某种方式运行。未定义的行为在此类平台上仍然是未定义的行为,因为不能保证任何特定的操作将按预期运行。例如,如果SHORT_MAX是32767,则序列short foo=32767; foo++; int bar=foo;
很可能导致bar
等于32768而不是-32768,即使保证两个补码翻转的编译器会有返回后一个结果。
答案 2 :(得分:1)
即使您在同一平台上使用相同的IDE,未定义的行为仍然不安全!
例如,此代码:
char *p = (char*)0x12345678;
char ch = *p;
这是一种未定义的行为,它取决于内存分配。 有时,它会出现分段错误错误,有时则不会。
答案 3 :(得分:1)
实现可以自由定义和记录一些C未定义的行为。
例如C99的基本原理文件说:
未定义的行为使实现者许可证不会捕获难以诊断的某些程序错误。它还确定了可能符合语言扩展的区域:实现者可以通过提供官方未定义行为的定义来扩充语言。
例如,gcc定义了有关按位移位运算符的一些未定义行为:
GCC不使用C99中给出的宽容度来处理签名'<<'的某些方面未定义[...]
http://gcc.gnu.org/onlinedocs/gcc/Integers-implementation.html