C 是否有超出翻译限制的未定义行为,是否有检查工具可以找到? 原始问题:
我正在搜索C90标准,寻找编写高可移植代码时需要注意的事项,同时对编译器供应商的善意不太信任,并假设如果我做错了,我的软件有时可能会杀人。假设我有点偏执 目前我正在考虑“翻译限制”(5.2.4.1 ANSI/ISO 9899:1990)。正如标准和中所指出的,这些是符合标准实施的最低要求。另一方面,这意味着,任何实现都不需要做更多的工作——如果我想确保我的代码适用于任何confrom实现,这些限制对我来说代表绝对限制 到目前为止还很烦人 因此,编译器供应商选择的限制等于或高于所需的最小转换限制 如果超过了特定实现的这些实现定义的转换限制,现在会发生什么?在我的ANSI/IO 9899:1990(C90)副本中,我没有发现任何东西,因此我认为这是未定义的“3.kind”(通过省略)行为。另一方面,这不是第一次,我误解了标准或者没有找到正确的段落 下面是我的问题: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中特定实现未定义行为的转换限制
- C90行为是否适用于C95/C96之前的修正版本以及新迭代C99和C11
- 有没有人见过一个检查工具,可以检查最小的或(工具)用户定义的限制
注释者尚未(尚未)发现检查代码中事务限制的工具。如果任何具有(甚至部分)此功能的人使用了某个工具,请留下答案或评论。这不是未定义的行为,而是实现定义的行为。这意味着这一切都取决于编译器 是的,最低实施指导原则保持不变,或者针对较新的标准版本进行了扩展 您可能可以使用clangapi来实现这一点,但是您需要自己使用clangapi来编写工具,我不知道有什么现成的实现
在任何情况下:限制不是由标准设定的,“它们更像是指南”(实际上只是指南)。您需要检查用于构建代码的编译器,看看您是否达到了任何限制,而不是仅仅在某人的鼻子里挥动标准文档。由于MSVC的实现特别糟糕,我甚至敢说,如果它编译了您的代码(假设代码本身没有非法构造),那么您是相当安全的。我相信行为是未定义的 本标准要求对任何违反约束或语法规则(5.1.1.3)的翻译单元进行诊断,并且可能无法成功翻译包含
#error
指令的翻译单元,该指令在预处理阶段仍然有效(第4段,第4段)。(N1570是C11标准的草案,但C90、C99和C11的草案相同,只是C99添加了#error
。)
标准中明确规定了所有约束和语法规则。超过实现定义的限制既不违反约束也不违反语法规则。我认为,很明显,成功处理超出翻译限制的正确程序不需要实现,但标准没有说明它应该如何响应