Разница между «Неопределенным поведением» и «Плохо сформированным», диагностическое сообщение не требуетсяC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Разница между «Неопределенным поведением» и «Плохо сформированным», диагностическое сообщение не требуется

Сообщение Anonymous »

Стандарт C++ содержит потрясающее количество определений неясного1 поведения, которые означают более или менее то же самое с небольшими различиями. Читая этот ответ, я заметил формулировку "программа неправильно сформирована; диагностика не требуется".

Определенное реализацией отличается от поведения неуказанного тем, что в первом случае реализация должна четко документировать, что она делает (во втором случае это не обязательно), оба правильно сформированы. Неопределенное поведение отличается от неопределённого тем, что программа является ошибочной (1.3.13).

В остальном их всех объединяет то, что стандарт не делает никаких предположений или требований относительно того, что будет делать реализация.
За исключением 1.4/8, в котором говорится, что реализации могут иметь расширения, которые не изменяют поведение правильно построенных программ, но являются неправильно сформированными в соответствии со стандартом. и реализация должна диагностировать их использование, но впоследствии может продолжить компиляцию и выполнение неправильно сформированной программы.

В противном случае плохо сформированная программа определяется только как неправильно сформированная (отлично!). С другой стороны, правильно построенная программа определяется как программа, которая придерживается синтаксиса и диагностируемых семантических правил. Следовательно, это будет означать, что плохо сформированная программа — это программа, которая нарушает либо синтаксические, либо семантические правила (или и то, и другое). Другими словами, плохо сформированная программа на самом деле вообще не должна компилироваться (как можно перевести, например, программу с неправильным синтаксисом каким-либо осмысленным образом?).

Я был бы склонен думать, что слово ошибочный также подразумевает, что компилятор должен прервать сборку с сообщением об ошибке (в конце концов, ошибочный предполагает есть ошибка), но раздел «Примечание» в 1.3.13 явно допускает что-то другое, включая молчаливое игнорирование проблемы (и компиляторы явно не нарушают сборку из-за UB, большинство из них даже не предупреждают по умолчанию).

Можно также подумать, что ошибочные и неправильно сформированные - это одно и то же, но стандарт не вдается в детали, если это так. регистр или то, что это слово должно означать.

Кроме того, в пункте 1.4 говорится, что


соответствующая реализация должна [...] принимать и правильно выполнять правильно сформированную программу


и


Если программа содержит нарушение правила, для которого не требуется диагностика, [...] никаких требований к реализациям в отношении этой программы.


Другими словами, соответствующая реализация должна принимать правильно сформированную программу, но с таким же успехом она может принимать и неправильно сформированную программу, и даже без предупреждение. За исключением случаев, когда программа неправильно сформирована, потому что она использует расширение.

Второй абзац предполагает, что все, что связано с «диагностика не требуется», означает отсутствие требований спецификации, что означает, что это в основном эквивалентно «неопределенному поведению», за исключением того, что нет упоминания о ошибочном.

Каково, следовательно, намерение использования такой формулировки, как "неправильно сформировано; нет требуется диагностика»?

Наличие «нет диагностики» предполагает, что оно идентично (или в основном идентично?) неопределенному поведению. Кроме того, поскольку определенное реализацией и неопределенное поведение определяется как правильно сформированное, оно должно быть чем-то другим.

С другой стороны, поскольку плохо сформированная программа нарушает синтаксические/семантические правила, она фактически не должна компилироваться. Что, однако, в сочетании с фразой «диагностика не требуется» будет означать, что компилятору будет разрешено завершить работу без предупреждения, и вы не сможете впоследствии найти исполняемый файл.

Есть ли разница между «неверно сформированным; диагностика не требуется» и «неопределенным поведением» или это просто сложный синоним одного и того же понятия?


1Из-за отсутствия лучшего определения коллективного поведения

Подробнее здесь: https://stackoverflow.com/questions/221 ... ssage-requ
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»