Sta memorizzando un puntatore non valido automaticamente un comportamento indefinito?

Ovviamente, il dereferenziamento di un puntatore non valido causa un comportamento non definito. Ma per quanto riguarda la semplice memorizzazione di un indirizzo di memoria non valido in una variabile puntatore?

Considera il seguente codice:

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

L’espressione begin - 1 valuta un indirizzo di memoria non valido. Nota che in realtà non dereferenziamo questo indirizzo: lo usiamo semplicemente nell’aritmetica del puntatore per verificare se è valido. Tuttavia, dobbiamo ancora caricare un indirizzo di memoria non valido in un registro.

Quindi, questo comportamento non definito? Non ho mai pensato che fosse, dato che un sacco di aritmetica puntatore sembra fare affidamento su questo genere di cose, e un puntatore non è altro che un intero in ogni caso. Ma recentemente ho sentito che anche l’atto di caricare un puntatore non valido in un registro è un comportamento indefinito, dal momento che alcune architetture generano automaticamente un errore del bus o qualcosa del genere se lo fai. Qualcuno può indicarmi la parte rilevante dello standard C o C ++ che regola questo in entrambi i casi?