Очевидно, что разыменование недопустимого указателя вызывает поведение undefined. Но как насчет простого хранения недопустимого адреса памяти в переменной указателя?
Рассмотрим следующий код:
const char* str = "abcdef";
const char* begin = str;
if (begin - 1 < str) { /* ... do something ... */ }
Выражение begin - 1
означает недопустимый адрес памяти. Обратите внимание, что мы фактически не разыскиваем этот адрес - мы просто используем его в арифметике указателя, чтобы проверить, действительно ли он. Тем не менее, нам все равно придется загружать недопустимый адрес памяти в регистр.
Итак, это поведение undefined? Я никогда не думал, что это так, поскольку много арифметики указателей, похоже, полагаются на подобные вещи, а указатель - это вообще ничто, кроме целого числа. Но в последнее время я слышал, что даже действие загрузки недопустимого указателя в регистр - это поведение undefined, так как некоторые архитектуры автоматически выдают ошибку шины или что-то в этом случае. Может ли кто-нибудь указать мне на соответствующую часть стандарта C или С++, которая так или иначе решена?