原问题:
我正在查找C90标准,以了解在编写高度可移植代码时需要注意的事项,同时对编译器供应商的善意持有低信任度,并假设如果我做错了事情,我的软件可能会有时候导致某些人死亡。可以说我有点偏执。
目前,我正在考虑“翻译限制”(5.2.4.1 ANSI / ISO 9899:1990)。正如标准和“ansi C是否对程序中外部变量的数量设置限制?”中指出的那样,这些是标准符合实现的最低要求。另一方面,这意味着任何实现都不必做更多 - 如果我想确保我的代码适用于任何符合实现,这些限制对我来说代表了绝对限制。
到目前为止,非常令人恼火。
因此,编译器供应商选择等于或高于最低所需的翻译限制。
如果超出特定实现的这些实现定义的翻译限制会发生什么?在我拥有的 ANSI/IO 9899:1990 (C90) 副本中,我没有找到任何东西,因此我认为这是“第三种”的未定义行为(通过省略)。另一方面,这不会是我第一次误解标准或找不到正确的段落。所以这里是我的问题:
在 C90 中超出特定实现的翻译限制是否是未定义的行为?
C90 行为适用于经过更正的版本直到 C95/C96 和新的迭代 C99 & C11 吗?
有人看到过检查最小限制或(工具)用户定义限制的检查器工具吗?
原问题之外的方面:
答案和评论中的有趣方面:
1)正如Michael Burr在对该问题的直接评论中指出的那样,根据C标准(我仅检查过未经修订的C90和C99草案,Michael提到的这里),符合C实现只需要接受一个包含所有限制的程序,这在最严格的解释下使任何最小限制保证都失去了作用。
2) 正如rubenvb和Keith Thompson所指出的,一些高质量的实现应该为这种情况提供诊断,即当其定义的限制超过时,特别是如果不符合最低要求(rubenvb在comment中提供了MSVC的示例)。
3) 虽然超出编译器限制可能会导致未定义行为,但肯定会导致某些错误,对于我代码中适用于某个特定片段的“变量”的值,它们受到翻译限制的影响,代表着重复使用的前提条件。
我的个人策略
1) 因此,为了最大程度的谨慎,我将让自己成为傻瓜,并通过请求编译器供应商保证,实现选择的限制适用于任何程序。 :-(
2) 所以我将调查编译器文档和编译器支持的容错能力,以获得确认: - 对于每个翻译限制,如果超过,则会引发诊断,并且 - 因为它是未定义行为,所以如果超出翻译限制的每个实例都会引发诊断-否则另一个错误已经防止了编译。
3) 所以我将尝试获取一个工具(如果必须开发自己),该工具可以测量这些值,并将它们作为重用代码的先决条件。正如Keith Thompson在这个answer中指出的那样,一些值可能需要更深入地了解实现方式。我不确定在这种情况下除了2)中的操作之外还有什么帮助,但据我所见,我必须进行测试-但我只需要测试是否存在未定义行为(没有诊断),如果是这种情况,则成功的测试不能保证正确性在一般情况下成立。
已回答:
是的,这是通过忽略而产生的未定义行为。
Keith Thompson在他的(被接受的)anwser中,使用C标准文档的术语和参考资料表明这是未定义行为。
代码中检查交易限制的工具尚未被评论者发现。如果有任何人拥有(即使是部分)此功能的工具,请留下答案或评论。