Считается ли разыменование NULL-указателя неопределенным или неопределенным поведением?

Консенсус вопросов о стеке потока говорит о том, что это неопределенное поведение.

Тем не менее, я недавно видел выступление Чарльза Бэй в 2016 году под названием:
Перестановка инструкций везде: правило "как будто" в C++ и роль последовательности.

В 37:53 он показывает следующее:

Условия C++

Неопределенное поведение: отсутствие ограничений
(порядок инициализации глобалов)

Неуказанное поведение: нарушение ограничений
(разыменование нулевого указателя)

Теперь у меня противоречивая информация.
Это была опечатка? Что-нибудь изменилось?

2 ответа

Решение

Примеры связаны с неправильными вещами. Независимо от того, какую версию стандарта C++ вы предполагаете (т.е. в этом отношении ничего не изменилось в рамках стандартов).

Разыменование нулевого указателя дает неопределенное поведение. Стандарт не определяет каких-либо ограничений на то, что происходит в результате.

Порядок инициализации глобальных переменных является примером неуказанного поведения (стандарт гарантирует, что все глобальные глобальные переменные будут инициализированы [это ограничение на то, как инициализируются глобальные глобальные переменные), но порядок не указан).

Это неопределенное поведение.

С 8.3.2 Ссылки стандарта C++11 (выделено мое):

5... [ Примечание: в частности, нулевая ссылка не может существовать в четко определенной программе, потому что единственный способ создать такую ​​ссылку - это привязать ее к "объекту", полученному путем разыменования нулевого указателя, что приводит к неопределенное поведение. Как описано в 9.6, ссылка не может быть привязана непосредственно к битовому полю. -конец примечания ]

Другие вопросы по тегам