¿Se pueden evitar los problemas de aliasing con variables constantes?
Mi empresa utiliza un servidor de mensajería que envía un mensaje a unconst char*
y luego lo convierte al tipo de mensaje.
Me he preocupado por esto después de preguntaresta pregunta. No conozco ningún mal comportamiento en el servidor de mensajería. Es posible queconst
las variables no generan problemas de alias?
Por ejemplo, digamos que foo se define enMessageServer
de una de estas maneras:
void MessageServer(const char* foo)
O como variable constante en la parte superior deMessageServer
: const char* foo = PopMessage();
AhoraMessageServer
es una función enorme, pero nunca asigna nada afoo
, sin embargo en 1 punto enMessageServer
la lógicafoo
será ser enviado al tipo de mensaje seleccionado.
auto bar = reinterpret_cast<const MessageJ*>(foo);
bar
solo se leerá posteriormente, pero se usará ampliamente para la configuración de objetos.
¿Es posible aquí un problema de alias o el hecho de quefoo
solo se inicializa y nunca se modifica ¿salvarme?
EDITAR:
La respuesta de Jarod42 no encuentra ningún problema con el envío desde unconst char*
a unMessageJ*
, pero no estoy seguro de que esto tenga sentido.
Sabemos que esto es ilegal:
MessageX* foo = new MessageX;
const auto bar = reinterpret_cast<MessageJ*>(foo);
¿Estamos diciendo que esto de alguna manera lo hace legal?
MessageX* foo = new MessageX;
const auto temp = reinterpret_cast<char*>(foo);
auto bar = reinterpret_cast<const MessageJ*>(temp);
Mi comprensión deLa respuesta de Jarod42 es que el elenco detemp
lo hace legal
EDITAR:
He recibido algunos comentarios en relación con la serialización, la alineación, el paso de la red, etc. De eso no se trata esta pregunta.
Esta es una pregunta sobrealias estricto.
El alias estricto es una suposición, hecha por el compilador de C (o C ++), de que desreferenciar los punteros a objetos de diferentes tipos nunca se referirá a la misma ubicación de memoria (es decir, alias entre sí).
Lo que pregunto es:Será la inicialización de unconst
objeto, emitiendo desde unchar*
, ¿alguna vez se optimizó a continuación donde ese objeto se convierte a otro tipo de objeto, de modo que estoy enviando datos no inicializados?