在C中实现定义的行为

在C中实现定义的行为,c,misra,implementation-defined-behavior,C,Misra,Implementation Defined Behavior,请,您能报告一些在C中实现定义的行为的例子吗 例如,我从标准中知道“实现定义的行为是高阶位的传播 当有符号整数右移时。“ 你能给我解释一下这个例子的重要性并报告一个例子吗 我理解inti;i>>3。但为什么要定义实现 在C中,实现定义行为的定义是什么时候留给编译器来决定,编译器记录它所做的选择 这种语言中有数百个这样的例子。本标准在附录J.3中包含了其中大部分内容的摘要,约15页长 具体示例inti;i>>3是未定义的行为,因为变量未初始化 具体示例inti=0;i>>3是定义实现的,因为标准如

请,您能报告一些在C中实现定义的行为的例子吗

例如,我从标准中知道“实现定义的行为是高阶位的传播 当有符号整数右移时。“

你能给我解释一下这个例子的重要性并报告一个例子吗


我理解
inti;i>>3
。但为什么要定义实现

在C中,实现定义行为的定义是什么时候留给编译器来决定,编译器记录它所做的选择

这种语言中有数百个这样的例子。本标准在附录J.3中包含了其中大部分内容的摘要,约15页长

具体示例
inti;i>>3
是未定义的行为,因为变量未初始化

具体示例
inti=0;i>>3
是定义实现的,因为标准如此规定。C17 6.5.7/5:

E1>>E2
的结果是E1右移
E2
位位置如果
E1
具有有符号类型和负值,则结果值由实现定义


在这种特殊情况下,它取决于编译器是从CPU指令集中选择算术移位指令还是逻辑移位指令。这意味着该标准并不反对缺少算术转换的体系结构。尽管在实践中,绝大多数CPU都能够进行算术移位,即使是RISC CPU。

C中实现定义行为的定义是,什么事情留给编译器来决定,编译器记录它所做的选择

这种语言中有数百个这样的例子。本标准在附录J.3中包含了其中大部分内容的摘要,约15页长

具体示例
inti;i>>3
是未定义的行为,因为变量未初始化

具体示例
inti=0;i>>3
是定义实现的,因为标准如此规定。C17 6.5.7/5:

E1>>E2
的结果是E1右移
E2
位位置如果
E1
具有有符号类型和负值,则结果值由实现定义


在这种特殊情况下,它取决于编译器是从CPU指令集中选择算术移位指令还是逻辑移位指令。这意味着该标准并不反对缺少算术转换的体系结构。尽管在实践中,绝大多数CPU都能够进行算术移位,甚至RISC也是如此。

它的实现是被定义的,因为C标准委员会拒绝定义应该发生什么。他们这样做的原因是因为不同的CPU在这种情况下做不同的事情,而C的精神(为了快速执行)是不要在C源代码和CPU上运行的操作代码之间进行太多的抽象

他们本可以选择定义一个标准行为,但在某些CPU上,需要编译器生成大量代码,以弥补CPU自身的操作码无法提供标准行为这一事实。虽然这是完全可能的,但它不可避免地不会非常有效


毫无疑问,其他人将能够指出该解释的更权威版本

它的实现被定义,因为C标准委员会拒绝定义应该发生什么。他们这样做的原因是因为不同的CPU在这种情况下做不同的事情,而C的精神(为了快速执行)是不要在C源代码和CPU上运行的操作代码之间进行太多的抽象

他们本可以选择定义一个标准行为,但在某些CPU上,需要编译器生成大量代码,以弥补CPU自身的操作码无法提供标准行为这一事实。虽然这是完全可能的,但它不可避免地不会非常有效


毫无疑问,其他人将能够指出该解释的更权威版本

任何依赖于实现定义行为的代码都只能保证在特定平台和/或编译器下工作。可移植程序应尽量避免此类行为

根据:

这也给出了另一个例子:

int*o=malloc(0*sizeof*o)


可能导致
o
NULL
或唯一指针(如C99标准7.20.3中所规定)。

任何依赖于实现定义行为的代码只能保证在特定平台和/或编译器下工作。可移植程序应尽量避免此类行为

根据:

这也给出了另一个例子:

int*o=malloc(0*sizeof*o)

可能导致
o
NULL
或唯一指针(如C99标准7.20.3所规定)