Считается ли разыменование NULL-указателя неопределенным или неопределенным поведением?
Консенсус вопросов о стеке потока говорит о том, что это неопределенное поведение.
Тем не менее, я недавно видел выступление Чарльза Бэй в 2016 году под названием:
Перестановка инструкций везде: правило "как будто" в C++ и роль последовательности.
В 37:53 он показывает следующее:
Условия C++
Неопределенное поведение: отсутствие ограничений
(порядок инициализации глобалов)Неуказанное поведение: нарушение ограничений
(разыменование нулевого указателя)
Теперь у меня противоречивая информация.
Это была опечатка? Что-нибудь изменилось?
2 ответа
Примеры связаны с неправильными вещами. Независимо от того, какую версию стандарта C++ вы предполагаете (т.е. в этом отношении ничего не изменилось в рамках стандартов).
Разыменование нулевого указателя дает неопределенное поведение. Стандарт не определяет каких-либо ограничений на то, что происходит в результате.
Порядок инициализации глобальных переменных является примером неуказанного поведения (стандарт гарантирует, что все глобальные глобальные переменные будут инициализированы [это ограничение на то, как инициализируются глобальные глобальные переменные), но порядок не указан).
Это неопределенное поведение.
С 8.3.2 Ссылки стандарта C++11 (выделено мое):
5... [ Примечание: в частности, нулевая ссылка не может существовать в четко определенной программе, потому что единственный способ создать такую ссылку - это привязать ее к "объекту", полученному путем разыменования нулевого указателя, что приводит к неопределенное поведение. Как описано в 9.6, ссылка не может быть привязана непосредственно к битовому полю. -конец примечания ]