Что такое компилятор С++, который должен выполняться с плохо сформированными программами в соответствии со стандартом?
С++ 03 Стандарт определяет хорошо сформированную программу (1.3.14 [defns.well.formed]) как
программа на С++, построенная в соответствии с правилами синтаксиса, диагностическими семантическими правилами и Правилом одного определения (3.2)
Далее определяется некорректная программа (1.3.4 [defns.ill.formed]) как
для реализации С++, которая не является хорошо сформированной программой (1.3.14)
и стандарт заполнен такими выражениями, как "если X тогда программа плохо сформирована", например (2.13.1/3):
Программа плохо сформирована, если одна из ее единиц перевода содержит целочисленный литерал, который не может быть представлен ни одним из разрешенных типов.
Тем не менее, я не нашел, что реализация С++ требуется для плохо сформированных программ.
Предположим, что у меня плохо сформированная программа. Теперь что?
Требуется ли реализация С++ делать что-то конкретное, когда она встречается с плохо сформированной программой или это поведение реализации С++ просто undefined?
Ответы
Ответ 1
Требуется ли реализация С++ делать что-то конкретное, когда она встречается с плохо сформированной программой или это поведение реализации С++ просто undefined?
Если стандарт не указывает иначе, реализация должна испускать диагностическое сообщение (ошибка или предупреждение). Однако для некоторых нарушений в Стандарте явно указано, что диагностика не требуется. В этом случае программа плохо сформирована, но реализациям не требуется сообщать пользователю - обычно, потому что делать это в общем случае было бы слишком сложно.
Об одном правиле определения, например, см. пункт 3.2/4 стандарта С++ 11:
Каждая программа должна содержать ровно одно определение каждой не-встроенной функции или переменной, используемой odr в этой программе; не требуется диагностика.
В отношении требований к реализации при столкновении с нарушением правила в пункте 1.4/2 указывается:
[...]
- Если программа не содержит нарушений правил в этом Международном стандарте, соответствующая реализация должен в пределах своих ресурсов принимать и правильно выполнять эту программу.
- Если программа содержит нарушение любого диагностируемого правила или появление конструкции, описанной в этот стандарт "условно поддерживается", когда реализация не поддерживает эту конструкцию, соответствующая реализация должна выпустить хотя бы одно диагностическое сообщение.
- Если программа содержит нарушение правила, для которого не требуется диагностика, этот Международный Стандарт не требует никаких требований к реализации в отношении этой программы.
Также имеет значение пункт 1.4/1, в котором объясняется, что подразумевается под "диагностируемыми правилами" в приведенном выше абзаце:
Набор диагностируемых правил состоит из всех синтаксических и семантических правил в этом международном стандарте , кроме для тех правил, содержащих явное обозначение, что "никакой диагностики не требуется" или которые описаны как в результате "поведение undefined".
Итак, подведем итог: если некорректная программа содержит диагностируемое нарушение, для которого в Стандарте явно не указано "нет необходимости диагностики", соответствующие реализации должны испускать диагностику.
Ответ 2
Цитата [intro.compliance] §2:
-
Если программа не содержит нарушений правил в настоящем Международном стандарте, соответствующая реализация должна в пределах ее ограничить ресурсы, принять и правильно выполнить эту программу.
-
Если программа содержит нарушение любого диагностируемого правила или появление конструкции, описанной в этом стандарте, как "условно поддерживается", когда реализация не поддерживает эта конструкция, соответствующая реализация должна выпустить как минимум одну диагностическое сообщение.
-
Если программа содержит нарушение правила, для которого не требуется диагностика, в этом Международном стандарте не требуется реализации в отношении этой программы.
Я не нашел никаких других соответствующих отрывков в стандарте. Если мы объединим это с [defns.undefined]:
undefined поведение
для которого настоящий международный стандарт не предъявляет требований
[Примечание: поведение Undefined можно ожидать, если этот международный Стандарт исключает любое явное определение поведения или когда программа использует ошибочную конструкцию или ошибочные данные. Допустимый undefinedповедение варьируется от полного игнорирования ситуации непредсказуемые результаты, вести себя во время перевода или программы исполнение в документированном виде, характерном для окружающей среды (с выдачей диагностического сообщения или без него), до завершения перевод или исполнение (с выдачей диагностического сообщение). Многие ошибочные программные конструкции не порождают undefinedповедение; они должны быть диагностированы. -end note]
Я бы сказал, что мы приходим к "выдать диагностическое сообщение, а поведение undefined", потому что стандарт ничего не говорит об этом.
Ответ 3
(Прежде всего, извините за мой английский)
В стандарте в п. 1.4.2 говорится:
Если программа содержит нарушение любого диагностируемого правила [...], соответствующая реализация должна выпустить хотя бы одно диагностическое сообщение.
Определение плохо сформированной программы - это "программа, которая недостаточно хорошо сформирована" (п. 1.3.9), а хорошо сформированная программа (§ 1.3.26):
Программа на С++, построенная в соответствии с правилами синтаксиса, диагностируемыми семантическими правилами и Правилом одного определения
Таким образом, некорректная программа неявно нарушает правило "некоторые". Если правило R имеет следующую структуру:
Если у программы есть свойство P, это некорректная программа.
Когда у программы есть такое свойство P, она неявно нарушает правило (по определению плохо сформированной программы), хотя неясно, какое правило является нарушением, поскольку сам R не (со строго логической точки зрения).
Ответ 4
Единственная релевантная цитата, которую я могу найти, говорит, что для диагностики плохо сформированной программы требуется реализация, но она может завершить ее компиляцию:
1.4 Соответствие требованиям [intro.compliance]
8) Соответствующая реализация может иметь расширения (включая дополнительные библиотечные функции) при условии, что они не изменяют поведение каких-либо хорошо сформированная программа. Реализации необходимы для диагностики программ которые используют такие расширения, которые плохо сформированы в соответствии с этим Международный стандарт. Однако, сделав это, они могут компилировать и выполните такие программы.