C 是否有超出翻译限制的未定义行为,是否有检查工具可以找到? 原始问题:

C 是否有超出翻译限制的未定义行为,是否有检查工具可以找到? 原始问题:,c,standards,undefined-behavior,standards-compliance,c89,C,Standards,Undefined Behavior,Standards Compliance,C89,我正在搜索C90标准,寻找编写高可移植代码时需要注意的事项,同时对编译器供应商的善意不太信任,并假设如果我做错了,我的软件有时可能会杀人。假设我有点偏执 目前我正在考虑“翻译限制”(5.2.4.1 ANSI/ISO 9899:1990)。正如标准和中所指出的,这些是符合标准实施的最低要求。另一方面,这意味着,任何实现都不需要做更多的工作——如果我想确保我的代码适用于任何confrom实现,这些限制对我来说代表绝对限制 到目前为止还很烦人 因此,编译器供应商选择的限制等于或高于所需的最小转换限制

我正在搜索C90标准,寻找编写高可移植代码时需要注意的事项,同时对编译器供应商的善意不太信任,并假设如果我做错了,我的软件有时可能会杀人。假设我有点偏执

目前我正在考虑“翻译限制”(5.2.4.1 ANSI/ISO 9899:1990)。正如标准和中所指出的,这些是符合标准实施的最低要求。另一方面,这意味着,任何实现都不需要做更多的工作——如果我想确保我的代码适用于任何confrom实现,这些限制对我来说代表绝对限制

到目前为止还很烦人

因此,编译器供应商选择的限制等于或高于所需的最小转换限制

如果超过了特定实现的这些实现定义的转换限制,现在会发生什么?在我的ANSI/IO 9899:1990(C90)副本中,我没有发现任何东西,因此我认为这是未定义的“3.kind”(通过省略)行为。另一方面,这不是第一次,我误解了标准或者没有找到正确的段落

下面是我的问题:

  • 是否超出了C90中特定实现未定义行为的转换限制

  • C90行为是否适用于C95/C96之前的修正版本以及新迭代C99和C11

  • 有没有人见过一个检查工具,可以检查最小的或(工具)用户定义的限制

原问题以外的方面: 回答和评论中有趣的方面: 1) 正如在一份直接报告中指出的,根据C标准(我只检查了C90,没有更正,C99草案,Michael引用),conform C实现只需要接受一个程序,该程序同时包含所有限制,在最严格的解释中,该程序使任何最低限制保证无效

2) 正如和所指出的,某些质量的实现应该为超出其实现定义的限制的情况提供诊断,特别是在不符合最低要求的情况下(rubenvb在a中链接了MSVC的一个示例)

3) 由于超出编译器限制可能是未定义的行为,但肯定会导致某些错误,因此对于我的某段代码,翻译限制所适用的“变量”值表示重用的先决条件

我的个人应对策略 1) 因此,对于最大程度的妄想症,我会出丑,并要求编译器供应商向我保证,实现所选择的限制适用于任何程序,以此来烦扰编译器供应商的支持-(

2) 因此,我将调查编译器文档和编译器支持的承受能力,以获得确认,即: -对于每个转换限制,如果超过,将提出诊断,并且 -因为它是未定义的行为,如果每个超过翻译限制的实例都会引发诊断,或者另一个错误已经阻止了编译

3) 因此,我将尝试使用一种工具(如果我真的必须的话,也可以自己开发),来度量这些值,并将它们作为程序代码重用的先决条件。正如本文所指出的,一些价值观可能需要更深入地了解如何实现。。。执行。我不能完全确定在这种情况下除了2)中的操作之外还有什么可以帮助到我。然而,据我所见,我必须进行测试——但我只需要测试是否存在UB(没有诊断),如果是这种情况,成功的测试不能保证一般情况下的正确性

回答: 是的,这是未定义的行为

基思·汤普森(Keith Thompson)在他的(公认的)C标准文档的术语和引用中表明,这是一种未定义的行为


注释者尚未(尚未)发现检查代码中事务限制的工具。如果任何具有(甚至部分)此功能的人使用了某个工具,请留下答案或评论。

这不是未定义的行为,而是实现定义的行为。这意味着这一切都取决于编译器

是的,最低实施指导原则保持不变,或者针对较新的标准版本进行了扩展

您可能可以使用clangapi来实现这一点,但是您需要自己使用clangapi来编写工具,我不知道有什么现成的实现



在任何情况下:限制不是由标准设定的,“它们更像是指南”(实际上只是指南)。您需要检查用于构建代码的编译器,看看您是否达到了任何限制,而不是仅仅在某人的鼻子里挥动标准文档。由于MSVC的实现特别糟糕,我甚至敢说,如果它编译了您的代码(假设代码本身没有非法构造),那么您是相当安全的。

我相信行为是未定义的

本标准要求对任何违反约束或语法规则(5.1.1.3)的翻译单元进行诊断,并且可能无法成功翻译包含
#error
指令的翻译单元,该指令在预处理阶段仍然有效(第4段,第4段)。(N1570是C11标准的草案,但C90、C99和C11的草案相同,只是C99添加了
#error
。)

标准中明确规定了所有约束和语法规则。超过实现定义的限制既不违反约束也不违反语法规则。我认为,很明显,成功处理超出翻译限制的正确程序不需要实现,但标准没有说明它应该如何响应