¿El almacenamiento de un puntero no válido comporta automáticamente un comportamiento indefinido?

Obviamente, desreferenciar un puntero no válido provoca un comportamiento indefinido. Pero ¿qué pasa con simplementealmacenamiento una dirección de memoria no válida en una variable de puntero?

Considere el siguiente código:

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

La expresionbegin - 1 evalúa a una dirección de memoria no válida. Tenga en cuenta que en realidad no desreferenciamos esta dirección, simplemente la usamos en la aritmética del puntero para probar si es válida. No obstante, todavía tenemos que cargar una dirección de memoria no válida en un registro.

Entonces, ¿es este comportamiento indefinido? Nunca pensé que lo fuera, ya que mucha aritmética de punteros parece depender de este tipo de cosas, y un puntero no es más que un número entero de todos modos. Pero recientemente escuché que incluso el acto de cargar un puntero no válido en un registro es un comportamiento indefinido, ya que ciertas arquitecturas arrojarán automáticamente un error de bus o algo así si haces eso. ¿Alguien puede señalarme la parte relevante del estándar C o C ++ que se resuelve de esta manera?

Respuestas a la pregunta(7)

Su respuesta a la pregunta