【问题标题】:Is a conformant C11 implementation allowed to compile every function into an infinite loop?是否允许符合 C11 的实现将每个函数编译成无限循环?
【发布时间】:2019-08-08 04:15:13
【问题描述】:

虽然 C++ 有前进的保证,但我在 C11 规范中看不到任何类似的规则。

为每个函数发出无限循环的 C11 编译器是否符合 C11 规范?假设它像往常一样进行所有预处理/等;它只是有一个相当过分热心的优化器。

诚然,这将是一个相当糟糕的编译器。尽管如此。

【问题讨论】:

    标签: language-lawyer c11


    【解决方案1】:

    标准的单一程序规则允许实现强加设计人员认为合适的任意“翻译限制”,并且如果违反它们,则以任意方式行事,前提是对于标准中给出的每个翻译限制,至少存在一个程序实施过程正确。当给定任何其他程序时,实现可以做任何它喜欢的事情。

    此外,该标准只关注程序行为,而不关注生成的代码,因此在陷入无限循环的程序和运行数万亿年而没有副作用的程序之间没有实际区别在产生结果之前。

    一般来说,“C 标准是否允许编译器以某种愚蠢和无用的方式 X 运行”问题的正确答案是“可能。所以?”标准没有努力禁止编译器做愚蠢的事情,而且标准允许符合标准的实现做某事这一事实意味着没有判断这种行为是否会使实现对某些(甚至全部)目的无用。

    【讨论】:

    • 我在问一个将 every 函数转换为 while 1; 的编译器。您可以假设这包括不超过翻译限制的函数。请注意,C11 提高了上述翻译限制。
    • 假设您的第二段是正确的,这是 C 和 C++ 之间的一个有趣且显着的区别,因为 C++ 在许多情况下保证了进步。
    • @TLW:C11 中的翻译限制只对“一个程序”有意义。只要一个实现正确处理至少一个行使每个翻译限制的程序,它就可以对任何其他程序做任何它喜欢的事情。该标准的作者认识到,可以设计一个同时符合标准但无用的实现,但期望编译器编写者会选择生成高质量的实现。顺便说一句,增加的对象大小和对 PTRDIFF_MAX 的更改是愚蠢的。大型机器的实现...
    • ...应该能够处理远大于 64K 的对象,但是在 total 存储小于 32K 的独立实现上,没有理由需要 ptrdiff_t大于 16 位。
    猜你喜欢
    • 2022-01-07
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多