Ответ 1
Undefined поведение означает, что что-то может произойти со стандартной соответствующей реализацией. На самом деле ничего. (а ваша точка 2 - UB)
Реализация может
- Взорвать компьютер и нанести вред физически
- сделайте черную дыру, которая проглатывает всю солнечную систему.
- ничего не делать серьезно
- загорится светодиод на клавиатуре.
- сделайте некоторое путешествие во времени и убейте всех своих дедушек и бабушек до рождения своих родителей.
- и т.д.
и соответствовать (в случае UB); читайте также о более знакомой идее носовых демонов.
Итак, что происходит на UB, не предсказуемо и не воспроизводится (вообще).
Серьезно подумайте немного о том, что может означать UB на компьютере, подключенном к тормозам ABS вашего автомобиля, или в каком-то искусственном сердце, или за рулем какой-либо атомной электростанции.
В частности, он может работать иногда. Поскольку большинство ОС имеют ASLR, ваш код имеет крошечный шанс на работу (например, если 0xa31a3442
указывает на какое-то допустимое местоположение, например, в стеке, но вы не будете воспроизводить это при следующем прогоне!)
UB - это способ предоставить свободу исполнителям (например, компиляторам или операционным системам) и компьютерам делать то, что они хотят, другими словами, не заботятся о последствиях. Это позволяет, например, умные оптимизации или хорошие трюки реализации. Но вы должны заботиться (и последствия разные, если вы кодируете встроенную систему управления полетом самолета или просто какие-то взломанные светодиодные светодиодные индикаторы с RasberryPi или простой пример для некоторых курсов С++, работающих на Linux).
Вспомним, что языковые стандарты даже не требуют какого-либо компьютера (или какого-либо оборудования) в реализации: вы можете "запустить" свой код на С++ с командой человеческих рабов, но это было бы крайне неэтично (и дорогостоящим, и ненадежным).
См. также здесь для получения дополнительных ссылок. Вы должны хотя бы прочитать блог Lattner в Undefined Behavior (большинство из того, что он написал для C, относится к С++ и многим другим языкам, имеющим UB).
(добавлено в декабре 2015 и июне 2016 года)
NB. Инструмент valgrind и различные опции -fsanitize=
отладки для недавних GCC или Clang/LLVM весьма полезны, Кроме того, включите все предупреждения и информацию об отладке в своем компиляторе (например, g++ -Wall -Wextra -g
) и используйте соответствующие параметры инструментария, такие как -fsanitize=undefined
. Имейте в виду, что невозможно установить статически и исчерпывающе во время компиляции все случаи UB (что было бы эквивалентно Проблема с остановкой).
PS. Вышеприведенный ответ не относится к С++; он также подходит для C!