提供违反 "shall" 要求 w/o 生成诊断消息的能力是否是编译器错误/缺陷或功能?

Is providing the ability to violate "shall" requirement w/o generation of a diagnostic message a compiler bug / defect or feature?

上下文:C 标准不将诊断消息分类为“警告”或“错误”。

问题:通过将某些“诊断消息”视为“警告”并提供禁用生成警告的能力,某些编译器实现允许最终用户违反 C 标准的“应”要求w/o 生成一条诊断消息。这个津贴是编译器错误/缺陷吗?如果不是,那么如何正确解释这个案例?作为“允许违反“应”要求w/o 生成诊断消息的编译器功能”?

示例:

#pragma warning( disable : 34 )
typedef int T[];
int main()
{
    return sizeof(T);
}
$ cl t28.c /Za
<no diagnostic messages, the "shall" requirement [1] is silently violated>

[1] ISO/IEC 9899:1990:

The sizeof operator shall not be applied to an expression that has function type or an incomplete type.

UPD.

  1. 如果指定 /Za(禁用语言扩展),则 __STDC__ 定义为定义 1。
  2. 根据 ANSI Conformance 页 (https://docs.microsoft.com/en-us/cpp/c-language/ansi-conformance?view=msvc-160):

Microsoft C conforms to the standard for the C language as set forth in the 9899:1990 edition of the ANSI C standard.

  1. 但是,cl 为最终用户提供了禁用“shall requirement originated”警告的能力。它是编译器错误/缺陷还是功能?需要正确解读这个案例。

C 2018 6.10.6 讨论了 #pragma 指令。第 1 段说:

… causes the implementation to behave in an implementation-defined manner. The behavior might cause translation to fail or cause the translator or the resulting program to behave in a non-conforming manner…

这在很大程度上允许实施做任何它想做的事情,只要它记录下来。如果 #pragma warning( disable : 34 ) 被记录为禁用警告,而这正是它所做的,那么这就是符合的。

请特别注意 #pragma“可能……导致译者……以不合规的方式行事。”所以,做一些不合规的事情,因为 pragma 告诉你这样做是合规的。

(我认为原文应该说 #pragma 可能会导致翻译器或程序以 otherwise 不符合规范的方式运行。因为,目前书面的,以这种记录的不合格方式表现是合格的,而不是不合格的。)

标准中的“应”(和“不应”)要求有两种截然不同的类型:对程序的限制和对实施.

实施 的限制是实施必须(或不得)做的事情——这些可能具有与之相关的强制诊断。

程序的限制实际上是自由实施——它们是——如果程序这样做—— - 导致未定义的行为,因此实现可以对它们做任何事情并且仍然符合要求。

上面的示例“sizeof 运算符不应应用于表达式”...是对 程序 的限制。因此,执行此操作的程序不符合要求,并且实现可以做任何它想做的事情(包括将其视为扩展而不需要任何标志或编译指示)并且仍然符合要求。