EDIT: этот вопрос не был предназначен для обсуждения вопроса о (de) достоинствах поведения undefined, но такого рода, каким он стал. В любом случае этот поток о гипотетическом C-компиляторе без поведения undefined может представлять интерес для тех, кто считает, что это важный тема.
Классический апокрифический пример поведения undefined - это, конечно же, "носовые демоны"; физическая невозможность, независимо от того, что позволяют стандарты C и С++.
Поскольку сообщества C и С++ склонны уделять такое внимание непредсказуемости поведения undefined и мысли о том, что компилятору разрешено заставить программу буквально что-либо делать, когда встречается поведение undefined, я предположил что стандарт не налагает никаких ограничений на поведение поведения undefined.
Но релевантная цитата в стандарте С++ выглядит следующим образом:
[C++14: defns.undefined]:
[..] Допустимое поведение undefined варьируется от полного игнорирования ситуации с непредсказуемыми результатами, ведения во время перевода или выполнения программы документированным образом, характерным для среды (с выдачей диагностического сообщения или без него), до прекращения перевода или выполнения (с выдачей диагностического сообщения). [..]
Это фактически задает небольшой набор возможных параметров:
- Игнорирование ситуации. Да, в стандарте говорится, что это будет иметь "непредсказуемые результаты", но это не то же самое, что и код компилятора, который, как я полагаю, является предпосылкой для, вы знаете, носовые демоны).
- Поведение в документированной манере, характерной для окружающей среды - это действительно звучит относительно мягко. (Я, конечно, не слышал о каких-либо документально подтвержденных случаях носовых демонов.)
- Прекращение перевода или выполнения - с диагностикой, не менее. Будет ли все UB вести себя так красиво.
Я предполагаю, что в большинстве случаев компиляторы предпочитают игнорировать поведение undefined; например, при чтении неинициализированной памяти, по-видимому, это будет анти-оптимизация для вставки любого кода для обеспечения согласованного поведения. Я полагаю, что незнакомые типы поведения undefined (например, путешествие во времени ") попадают под вторую категорию, но это требует, чтобы такое поведение должно быть документировано и" характерно для окружающей среды" (так что, как мне кажется, носовые демоны производятся только адскими компьютерами?).
Не понял ли я определение? Являются ли они примерами того, что могло бы представлять собой поведение undefined, а не полный список вариантов? Утверждается, что "что-то может случиться" означает просто неожиданный побочный эффект игнорирования ситуации?
РЕДАКТИРОВАТЬ: Две второстепенные точки уточнения:
- Я думал, что это ясно из первоначального вопроса, и я думаю, что большинство людей это было, но я все равно его заклинаю: я понимаю, что "носовые демоны" - это язык в щеке.
- Пожалуйста, не пишите (другой) ответ, поясняющий, что UB допускает оптимизацию компилятора на платформе, если вы не объясните, как он позволяет оптимизациям, которые поведение, определяемое реализацией, не позволяет.