Разница между неопределенным поведением и плохо сформированным, диагностическое сообщение не требуется
Стандарт C ++ поставляется с потрясающим количеством определений длянеясно1 поведение, которое означает более или менее то же самое с тонкими различиями. чтениеэтот ответЯ заметил формулировку"программа некорректна; диагностика не требуется".
Реализация определенных отличается отнеопределенные Поведение в том, что реализация в первом случае должна четко документировать, что она делает (во втором случае это не нужно), обахорошо сформированные. Неопределенный поведение отличается от неопределенного в том, что программаошибочный (1.3.13).
В остальном у всех них есть общее, что в стандарте нет никаких предположений или требований относительно того, что будет делать реализация. За исключением 1.4 / 8, в котором говорится, что реализации могут иметь расширения, которые не изменяют поведение правильно сформированных программ, но плохо сформированы в соответствии со стандартом и реализациейдолжен диагностируйте их использование, но впоследствии сможете продолжить компиляцию и выполнение некорректной программы.
плохо формируется В остальном программа определяется только как плохо сформированная (отлично!).хорошо сформированные Программа, с другой стороны, определяется как та, которая придерживается синтаксиса и диагностируемых семантических правил. Следовательно, это означало бы, что плохо сформированная программа нарушает синтаксические или семантические правила (или оба). Другими словами, плохо сформированная программана самом деле не должен компилироваться вообще (как можно переводить, например, программу с неправильным синтаксисом каким-либо значимым образом?).
Я был бы склонен думать, что словоошибочный также подразумевает, что компилятор должен прервать сборку с сообщением об ошибке (в конце концов,ошибочный предполагает наличие ошибки), но раздел «Примечание» в 1.3.13 явно допускает нечто иное, в том числе скрытое игнорирование проблемы (и компиляторы наглядноне делайте нарушать сборку из-за UB, большинство даже не предупреждают по умолчанию).
Можно еще поверить, чтоошибочный и плохо сформированные - то же самое, но стандарт не вдается в детали, если это так или то, что слово должно означать.
Кроме того, 1.4 утверждает, что
соответствующая реализация должна [...] принимать и правильно выполнять правильно сформированную программу
а также
Если программа содержит нарушение правила, для которого не требуется диагностика, [...] нет требований к реализациям в отношении этой программы.
Другими словами, соответствующая реализациядолжен принять правильно сформированную программу, но она также может принять плохо сформированную и даже без предупреждения. За исключением случаев, когда программа плохо сформированапотому что он использует расширение.
Второй абзац предполагает, что что-либо в сочетании с «не требуется никакой диагностики» означает, что в спецификации нет требований, что означает, что это в основном эквивалентно «неопределенному поведению», за исключением того, что не упоминаетсяошибочный.
Какова же причина использования такой формулировки, как"плохо сформирован; диагностика не требуется"?
Наличие «нет диагностики» предполагает, что она идентична (илив основном идентично?) неопределенному поведению. Кроме того, так какот реализации а такженеопределенные поведение определяется какхорошо сформированные, Это должно бытьчто-то другое.
С другой стороны, поскольку плохо сформированная программа нарушает синтаксические / семантические правила, она фактически не должна компилироваться. Что, однако, в сочетании с «не требует диагностики» будет означать, что компилятору будет разрешено тихо завершить работу без предупреждения, и вы не сможете впоследствии найти исполняемый файл.
Есть ли разница между «плохо сформированным, не требующим диагностики» и «неопределенным поведением», или это просто сложный синоним одного и того же?
1В отсутствие лучшей формулировки для коллектива поведения