Стандарт C++ содержит потрясающее количество определений неясного1 поведения, которые означают более или менее то же самое с небольшими различиями. Читая этот ответ, я заметил формулировку "программа неправильно сформирована; диагностика не требуется".
Определенное реализацией отличается от поведения неуказанного тем, что в первом случае реализация должна четко документировать, что она делает (во втором случае это не обязательно), оба правильно сформированы. Неопределенное поведение отличается от неопределённого тем, что программа является ошибочной (1.3.13).
В остальном их всех объединяет то, что стандарт не делает никаких предположений или требований относительно того, что будет делать реализация.
За исключением 1.4/8, в котором говорится, что реализации могут иметь расширения, которые не изменяют поведение правильно построенных программ, но являются неправильно сформированными в соответствии со стандартом. и реализация должна диагностировать их использование, но впоследствии может продолжить компиляцию и выполнение неправильно сформированной программы.
В противном случае плохо сформированная программа определяется только как неправильно сформированная (отлично!). С другой стороны, правильно построенная программа определяется как программа, которая придерживается синтаксиса и диагностируемых семантических правил. Следовательно, это будет означать, что плохо сформированная программа — это программа, которая нарушает либо синтаксические, либо семантические правила (или и то, и другое). Другими словами, плохо сформированная программа на самом деле вообще не должна компилироваться (как можно перевести, например, программу с неправильным синтаксисом каким-либо осмысленным образом?).
Я был бы склонен думать, что слово ошибочный также подразумевает, что компилятор должен прервать сборку с сообщением об ошибке (в конце концов, ошибочный предполагает есть ошибка), но раздел «Примечание» в 1.3.13 явно допускает что-то другое, включая молчаливое игнорирование проблемы (и компиляторы явно не нарушают сборку из-за UB, большинство из них даже не предупреждают по умолчанию).
Можно также подумать, что ошибочные и неправильно сформированные - это одно и то же, но стандарт не вдается в детали, если это так. регистр или то, что это слово должно означать.
Кроме того, в пункте 1.4 говорится, что
соответствующая реализация должна [...] принимать и правильно выполнять правильно сформированную программу
и
Если программа содержит нарушение правила, для которого не требуется диагностика, [...] никаких требований к реализациям в отношении этой программы.
Другими словами, соответствующая реализация должна принимать правильно сформированную программу, но с таким же успехом она может принимать и неправильно сформированную программу, и даже без предупреждение. За исключением случаев, когда программа неправильно сформирована, потому что она использует расширение.
Второй абзац предполагает, что все, что связано с «диагностика не требуется», означает отсутствие требований спецификации, что означает, что это в основном эквивалентно «неопределенному поведению», за исключением того, что нет упоминания о ошибочном.
Каково, следовательно, намерение использования такой формулировки, как "неправильно сформировано; нет требуется диагностика»?
Наличие «нет диагностики» предполагает, что оно идентично (или в основном идентично?) неопределенному поведению. Кроме того, поскольку определенное реализацией и неопределенное поведение определяется как правильно сформированное, оно должно быть чем-то другим.
С другой стороны, поскольку плохо сформированная программа нарушает синтаксические/семантические правила, она фактически не должна компилироваться. Что, однако, в сочетании с фразой «диагностика не требуется» будет означать, что компилятору будет разрешено завершить работу без предупреждения, и вы не сможете впоследствии найти исполняемый файл.
Есть ли разница между «неверно сформированным; диагностика не требуется» и «неопределенным поведением» или это просто сложный синоним одного и того же понятия?
1Из-за отсутствия лучшего определения коллективного поведения
Подробнее здесь: https://stackoverflow.com/questions/221 ... ssage-requ
Разница между «Неопределенным поведением» и «Плохо сформированным», диагностическое сообщение не требуется ⇐ C++
Программы на C++. Форум разработчиков
1761401258
Anonymous
Стандарт C++ содержит потрясающее количество определений неясного1 поведения, которые означают более или менее то же самое с небольшими различиями. Читая этот ответ, я заметил формулировку "программа неправильно сформирована; диагностика не требуется".
[b]Определенное реализацией[/b] отличается от поведения [b]неуказанного[/b] тем, что в первом случае реализация должна четко документировать, что она делает (во втором случае это не обязательно), оба правильно сформированы. [b]Неопределенное[/b] поведение отличается от неопределённого тем, что программа является ошибочной (1.3.13).
В остальном их всех объединяет то, что стандарт не делает никаких предположений или требований относительно того, что будет делать реализация.
За исключением 1.4/8, в котором говорится, что реализации могут иметь расширения, которые не изменяют поведение правильно построенных программ, но являются неправильно сформированными в соответствии со стандартом. и реализация [b]должна[/b] диагностировать их использование, но впоследствии может продолжить компиляцию и выполнение неправильно сформированной программы.
В противном случае [b]плохо сформированная[/b] программа определяется только как неправильно сформированная (отлично!). С другой стороны, [b]правильно построенная[/b] программа определяется как программа, которая придерживается синтаксиса и диагностируемых семантических правил. Следовательно, это будет означать, что плохо сформированная программа — это программа, которая нарушает либо синтаксические, либо семантические правила (или и то, и другое). Другими словами, плохо сформированная программа на самом деле вообще не должна компилироваться (как можно перевести, например, программу с неправильным синтаксисом каким-либо осмысленным образом?).
Я был бы склонен думать, что слово ошибочный также подразумевает, что компилятор должен прервать сборку с сообщением об ошибке (в конце концов, ошибочный предполагает есть ошибка), но раздел «Примечание» в 1.3.13 явно допускает что-то другое, включая молчаливое игнорирование проблемы (и компиляторы явно не нарушают сборку из-за UB, большинство из них даже не предупреждают по умолчанию).
Можно также подумать, что ошибочные и неправильно сформированные - это одно и то же, но стандарт не вдается в детали, если это так. регистр или то, что это слово должно означать.
Кроме того, в пункте 1.4 говорится, что
соответствующая реализация должна [...] принимать и правильно выполнять правильно сформированную программу
и
Если программа содержит нарушение правила, для которого не требуется диагностика, [...] никаких требований к реализациям в отношении этой программы.
Другими словами, соответствующая реализация [b]должна[/b] принимать правильно сформированную программу, но с таким же успехом она может принимать и неправильно сформированную программу, и даже без предупреждение. За исключением случаев, когда программа неправильно сформирована, потому что она использует расширение.
Второй абзац предполагает, что все, что связано с «диагностика не требуется», означает отсутствие требований спецификации, что означает, что это в основном эквивалентно «неопределенному поведению», за исключением того, что нет упоминания о ошибочном.
Каково, следовательно, намерение использования такой формулировки, как "неправильно сформировано; нет требуется диагностика»?
Наличие «нет диагностики» предполагает, что оно идентично (или в основном идентично?) неопределенному поведению. Кроме того, поскольку определенное реализацией и неопределенное поведение определяется как правильно сформированное, оно должно быть чем-то другим.
С другой стороны, поскольку плохо сформированная программа нарушает синтаксические/семантические правила, она фактически не должна компилироваться. Что, однако, в сочетании с фразой «диагностика не требуется» будет означать, что компилятору будет разрешено завершить работу без предупреждения, и вы не сможете впоследствии найти исполняемый файл.
Есть ли разница между «неверно сформированным; диагностика не требуется» и «неопределенным поведением» или это просто сложный синоним одного и того же понятия?
1Из-за отсутствия лучшего определения коллективного поведения
Подробнее здесь: [url]https://stackoverflow.com/questions/22180312/difference-between-undefined-behavior-and-ill-formed-no-diagnostic-message-requ[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия