如果未定义生成诊断消息的数量限制,那么没有限制?

If the limit on the number of diagnostic messages produced is undefined, then there is no limit?

上下文:C2x(以及之前的版本)似乎没有定义对生成的诊断消息数量的限制。

意思是没有限制吗?

如果是这样,那么为什么某些 C 编译器(clang、msvc)确实有限制(分别为 20 个错误和 100 个错误)?

演示:

# clang
$ for i in {1..100}; do echo int $i\x\; ; done > x.c && clang x.c -std=c11 2>&1 | grep 'error:' | wc -l
20

# msvc
$ for i in {1..100}; do echo int $i\x\; ; done > x.c && cl x.c /std:c11 /Za 2>&1 | grep -P 'x\.c\(\d+\): error' | wc -l
101

# gcc
$ for i in {1..100}; do echo int $i\x\; ; done > x.c && gcc x.c -std=c11 2>&1 | grep 'error:' | wc -l
200

提问原因:一些C编译器诊断测试在同一个源文件中有很多测试用例。因此,他们期望 C 编译器可以生成与(至少)测试用例数量一样多的诊断消息。令人惊讶的是,默认情况下 clang 有 20 个错误(可以通过 -ferror-limit) and msvc have 100 errors (cannot be changed, because it is hardcoded 更改)。

额外:clang -std=c11 是否应该隐式使用 -ferror-limit=0

限制诊断的主要原因是一个微小的错误通常会级联成许多诊断。在某些时候,简单地放弃而不是继续喷出毫无意义的胡言乱语是有意义的。

它是故意未定义的,这意味着实现可以选择何时达到该点,或者是否有任何限制。还要注意,通常一些较早的错误意味着有关后来的错误的消息实际上并不能帮助追踪这些错误。

无论翻译单元有多少错误(如果至少有一个),C 标准只需要一个诊断。 C 2018 5.1.1.3 1 说:

A conforming implementation shall produce at least one diagnostic message (identified in an implementation-defined manner) if a preprocessing translation unit or translation unit contains a violation of any syntax rule or constraint, even if the behavior is also explicitly specified as undefined or implementation-defined…

这并不是说实现应针对每次违规生成一条诊断消息,只是说如果存在违规,它应至少生成一条诊断消息。

在发现一次违规后,实施可以自由终止。

此文本与标准的某些未来版本的 N2731 草案相同。