Если ограничение на количество генерируемых диагностических сообщений не определено, то нет ли ограничения?
Контекст: 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
) и msvc имеют 100 ошибок (не могут быть изменены, потому что они жестко запрограммированы ).
Дополнительно: Должен
clang -std=c11
неявно использовать
-ferror-limit=0
?
2 ответа
Стандарт C требует только одной диагностики независимо от того, сколько ошибок имеет единица перевода (если есть хотя бы одна). C 2018 5.1.1.3 1 говорит:
Соответствующая реализация должна генерировать по крайней мере одно диагностическое сообщение (идентифицируемое способом, определяемым реализацией), если единица трансляции предварительной обработки или единица трансляции содержит нарушение какого-либо синтаксического правила или ограничения, даже если поведение также явно указано как неопределенное или реализация- определенный…
Это не говорит о том, что реализация должна выдавать одно диагностическое сообщение при каждом нарушении, просто она должна выдавать по крайней мере одно диагностическое сообщение в случае нарушения.
Реализация может завершиться после выявления одного нарушения.
Этот текст идентичен проекту N2731 для некоторых будущих версий стандарта.
Основная причина ограничения диагностики заключается в том, что очень часто одна крошечная ошибка приводит к множеству диагностик. В какой-то момент имеет смысл просто сдаться, а не продолжать извергать бессмысленную чепуху.
Тот факт, что он преднамеренно не определен, означает, что реализация сама выбирает, когда эта точка будет достигнута, и есть ли вообще какой-либо предел. Также обратите внимание, что очень часто некоторые более ранние ошибки означают, что сообщения о более поздних ошибках на самом деле не помогают отследить эти ошибки.