提供违反 "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.
- 如果指定
/Za
(禁用语言扩展),则 __STDC__
定义为定义 1。
- 根据
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.
- 但是,
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 运算符不应应用于表达式”...是对 程序 的限制。因此,执行此操作的程序不符合要求,并且实现可以做任何它想做的事情(包括将其视为扩展而不需要任何标志或编译指示)并且仍然符合要求。
上下文: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.
- 如果指定
/Za
(禁用语言扩展),则__STDC__
定义为定义 1。 - 根据
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.
- 但是,
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 运算符不应应用于表达式”...是对 程序 的限制。因此,执行此操作的程序不符合要求,并且实现可以做任何它想做的事情(包括将其视为扩展而不需要任何标志或编译指示)并且仍然符合要求。