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

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

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

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

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

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

18
задан Channel72 1 October 2010 в 12:13
поделиться