Desreferenciando un puntero inválido, luego tomando la dirección del resultado

Considerar:

int* ptr = (int*)0xDEADBEEF; cout << (void*)&*ptr; 

¿Qué tan ilegal es el * , dado que se usa en conjunción con un inmediato & y dado que no hay sobrecarga de op& / op* en juego?


(Esto tiene ramificaciones particulares para abordar un elemento de matriz de &myArray[n] , una expresión que es explícitamente equivalente a &*(myArray+n) . Esta &*(myArray+n) preguntas y respuestas aborda el caso más amplio, pero no creo que haya realmente satisfecho con la pregunta anterior.)

Suponiendo que la variable `ptr ‘no contiene un puntero a un objeto válido, el comportamiento indefinido ocurre si el progtwig necesita la conversión lvalue-r-value de la expresión` * ptr’, como se especifica en [conv.lval] (ISO / IEC 14882: 2011, página 82, 4.1 [# 1]).

Durante la evaluación de `& * ptr ‘, el progtwig no necesita la conversión lvalue-r-value de la subexpresión` * ptr’, de acuerdo con [expr.unary.op] (ISO / IEC 14882: 2011, página 109, 5.3 .1 [# 3])

Por lo tanto, es legal.

De acuerdo con la especificación, el efecto de desreferenciar un puntero no válido produce un comportamiento indefinido. No importa lo que haga después de quitarle la referencia.

Es legal ¿Por qué no sería? Solo está estableciendo un valor para un puntero y luego accediendo a él. Sin embargo, asignar el valor a mano debe especificarse obviamente como un comportamiento indefinido, pero eso es lo máximo que una especificación general puede decir. Luego, lo usa en algún controlador de software integrado, y le dará el valor corregido de memoria correcto para algún dispositivo …