Хранение неверного указателя автоматически неопределенное поведение?

Очевидно, что разыменование недействительного указателя вызывает неопределенное поведение. Но как насчет простохранения неверный адрес памяти в переменной указателя?

Рассмотрим следующий код:

const char* str = "abcdef";
const char* begin = str;
if (begin - 1 < str) { /* ... do something ... */ }

Выражениеbegin - 1 оценивает неверный адрес памяти. Обратите внимание, что мы на самом деле не разыменовываем этот адрес - мы просто используем его в арифметике указателей, чтобы проверить, действителен ли он. Тем не менее, мы все равно должны загрузить неверный адрес памяти в регистр.

Итак, это неопределенное поведение? Я никогда не думал, что это так, поскольку большая часть арифметики с указателями, похоже, полагается на подобные вещи, а указатель на самом деле является целым числом. Но недавно я услышал, что даже сам процесс загрузки недопустимого указателя в регистр является неопределенным поведением, поскольку некоторые архитектуры автоматически выдают ошибку шины или что-то подобное, если вы это сделаете. Может кто-нибудь указать мне на соответствующую часть стандарта C или C ++, которая решает эту проблему в любом случае?

Ответы на вопрос(7)

Ваш ответ на вопрос