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