__STDC_IEC_559__ 如何影响 UB 差距?

How __STDC_IEC_559__ affects UB gaps?

的跟进。

When the C standard leaves a gap, other standards and other specifications may fill in that gap.

When the C standard does not define a behavior, the behavior may be defined, partially or completely, by other standards

如果定义了__STDC_IEC_559__,那么是否意味着:

  1. 所有与 FP 相关的 UB 空白都用 IEEE 754 逻辑填充?
  2. FP相关UB不会变成WDB? (即 UB 保持 UB。)
  3. 用户不应依赖 IEEE 754 逻辑的实现(SW/HW),因为“我们已经在 UB 中了”?
  4. IEEE 754 逻辑实现中的任何错误都不能被视为错误,因为“我们已经在 UB 中了”?

请大家说说你的看法。

当 C 语言留下一些未定义的东西时,它所做的就是让实现自由定义或不定义它以他们选择的任何方式。这就是为什么 UB 的目的不仅是以安全为代价允许可疑的优化,而且还相反地选择定义其他未定义的构造来捕获,以便它们帮助查找错误(例如,制作签名溢出陷阱)。我在这里的观点是,未定义的行为并不是对实现留下未定义的东西或以 unpredictable/erratic 方式行事的强制要求,只是一种允许。

不仅是特定的实现,而且构建在基本 C 语言规范之上的整个规范都可以定义基本规范未定义的构造的行为。 POSIX 经常发生这种情况。例如,它定义了 fflush 在可搜索输入流上的行为,以及在其他情况下未定义的文本文件上的各种操作的行为(通过定义文本和二进制文件是同一件事)。

“C including Annex F”是建立在基础 C 语言规范之上的衍生规范。因此,当它定义了基本语言未定义的有关浮点行为的某些内容时,该内容将不再是未定义的。

在您提供的选项中,#1 最接近事实,但很难准确地描述“所有与 FP 相关的 UB 差距”而不将其简化为同义反复。例如,涉及浮点类型的别名违规、涉及浮点类型的可变参数函数的无效使用等都是“FP 相关的”,但当然仍未定义。填补的空白正是附件 F 填补的空白。