Armazenar um ponteiro inválido é automaticamente um comportamento indefinido?

Obviamente, desreferenciar um ponteiro inválido causa comportamento indefinido. Mas e simplesmentearmazenando um endereço de memória inválido em uma variável de ponteiro?

Considere o seguinte código:

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

A expressãobegin - 1 avalia para um endereço de memória inválido. Observe que, na verdade, não desferimos esse endereço - simplesmente o usamos na aritmética de ponteiros para testar se ele é válido. No entanto, ainda precisamos carregar um endereço de memória inválido em um registro.

Então, esse comportamento é indefinido? Eu nunca pensei que fosse, já que muita aritmética de ponteiros parece depender desse tipo de coisa, e um ponteiro não é nada além de um número inteiro. Mas, recentemente, ouvi dizer que mesmo o ato de carregar um ponteiro inválido em um registro é um comportamento indefinido, pois certas arquiteturas lançam automaticamente um erro de barramento ou algo assim, se você fizer isso. Alguém pode me apontar para a parte relevante do padrão C ou C ++ que resolve isso de qualquer maneira?

questionAnswers(7)

yourAnswerToTheQuestion