术语和定义(三)
未指定值(unspecified value)
解释:未指定值是相关类型的有效值,但ISO/IEC 9899:2024标准未对选择的值作进一步要求。
例如:宏FLT_EVAL_MATHOD的值。
不确定值(indeterminate value)
解释:不确定值可能是未指定值,也可能是陷阱表示。
注:ISO/IEC 9899:2024标准已弃用此术语,改用不确定表示(indeterminate representation)。
不确定表示(indeterminate representation)
解释:不确定表示是一种对象表示,可能表示未指定值,也可能是非值表示(non-value representation)。
陷阱表示(trap representation)
解释:陷阱表示是不表示对象类型值的对象表示。
bool a; const char b = 'b'; memcpy(&a, &b, 1); printf("%d\n", a); //a的表示形式是陷阱表示,这里将输出98。
bool类型占一个字节,bool类型的对象值只能是0或者1;如果是其它值,则其表示形式是陷阱表示。
注:ISO/IEC 9899:2024标准已弃用此术语,改用非值表示(non-value representation)。
非值表示(non-value representation)
解释:非值表示是不表示对象类型值的对象表示。
bool a; const char b = 'b'; memcpy(&a, &b, 1); printf("%d\n", a); //a的表示形式是非值表示,这里将输出98。
bool类型占一个字节,bool类型的对象值只能是0或者1;如果是其它值,则其表示形式是非值表示。
线程安全(thread-safe)
解释:线程安全函数可以被多个线程同时调用,也可以和其它线程安全函数同时调用。
字符集(character set)
解释:字符集是用于表示、组织或者控制数据的一组不同字符。
编码字符集(coded character set)
解释:编码字符集是一组明确规则,用于建立字符集以及该集的每个字符与其位表示之间的一一对应关系。
信号(signal)
解释:信号是一种机制,通过该机制,进程或者线程可以被通知系统中发生的事情,或者受到系统中发生事件的影响。此类事件包括硬件异常和进程的特定操作。信号也可用于指代事件本身。
地址空间(address space)
解释:地址空间是进程或者线程可以引用的存储单元。
字符串(character string)
解释:字符串是一个连续的字符序列,以第一个空字节结束,并包括第一个空字节。
例如:"China"。
空字符串(empty string或者null string)
解释:空字符串是第一个字节为空字节的字符串。
例如:""。
空宽字符串(empty wide-character string)
解释:空宽字符串是第一个元素是空宽字符的宽字符串。
例如:L""。
宽字符串(wide-character string)
解释:宽字符串是一个连续的宽字符序列,以第一个空宽字符结束,并包括第一个空宽字符。
例如:L"China"。
线程(thread)
解释:线程是进程中的单个控制流。
每个线程都有自己的线程ID、调度优先级和策略、errno值、线程专属的键/值绑定以及支持控制流所需的系统资源。
被阻塞的进程或者线程(blocked process or thread)
解释:被阻塞的进程或者线程是等待某些条件得到满足,然后才能继续执行的进程或者线程。
CPU时间,或者执行时间(CPU time或者execution time)
解释:CPU时间是用于执行进程或者线程的时间,包括用于该进程或者线程执行的系统服务时间。如果支持线程选项,进程的CPU时钟值由实现定义。使用此定义,进程中所有线程的执行时间之和可能不等于进程执行时间,即使在单线程进程中也是如此,因为实现在上下文切换期间或者出于其它原因对时间的计算方式可能不同。
超时(timeout)
解释:超时是一种限制接口阻塞时间的方法。
执行陷阱(perform a trap)
解释:执行陷阱会中断程序执行,使得不再执行任何操作。
根据ISO/IEC 9899:2024标准,获取非值表示允许实现执行陷阱,但不是必需的。
如果实现定义宏__STDC_ANALYZABLE__,允许实现执行陷阱时调用运行时限制处理程序。
条件变量(condition variable)
解释:条件变量是一个同步对象,允许线程重复暂停执行,直至某个相关条件为真。因条件变量执行被挂起的线程称为在该条件变量上被阻塞。
绕回(wraparound)
解释:绕回是值以2N为模进行缩减的过程,其中N是结果类型的宽度。
对于无符号整数类型,该类型最大值加1等于2N。
unsigned u = UINT_MAX + 2; //将绕回,u值为1。
越界存储(out-of-bounds store)
解释:程序运行时,对于给定的计算状态,访问会修改(或者对于volatile对象,会获取)一个或者多个字节,而这些字节超出了ISO/IEC 9899:2024标准允许的范围。
int arr[3]; arr[3] = 5; //越界存储。
有界未定义行为(bounded undefined behavior)
解释:有界未定义行为是不执行越界存储的未定义行为。
有界未定义行为可能执行陷阱;生成的值可能是未指定值,并且写入对象的表示可能变得不确定。
struct s{ int : 0; }; //结构定义不存在命名成员导致有界未定义行为。
临界未定义行为(critical undefined behavior)
解释:临界未定义行为是非有界未定义行为的未定义行为。
临界未定义行为可能执行越界存储或者执行陷阱。
"China"[0] = 'c'; //尝试修改字符串字面量导致临界未定义行为。
主要参考资料: