es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Qué sucederá si convierto una matriz de bytes a una estructura __attribute__((packed, aligned(2))) en C?

Tengo un código en C++ que define una estructura:

struct IcmpHdr
{
    uint8_t m_type;
    uint8_t m_code;
    uint16_t m_chksum;
    uint16_t m_id;
    uint16_t m_seq;
} __attribute__((packed, aligned(2)));

Entiendo que esta estructura siempre se alineará en una dirección divisible por 2 al ser asignada, ya que se agregará un byte de relleno si es necesario.

Esta estructura se convierte en una matriz de bytes antes de ser enviada por la red para desempaquetarla en el extremo receptor. ¿Qué sucede en el extremo receptor si almaceno los bytes en una matriz char byte_array[8]; y luego la convierto en un puntero a mi tipo?

IcmpHdr* header = (IcmpHdr*)byte_array;

¿Tendrá la estructura un 50/50 de posibilidades de no estar alineada? ¿Podría esto causar un comportamiento indefinido al desreferenciar los miembros? ¿Existen otros problemas?

Sé que podría simplemente alinear la matriz en un límite de 2 bytes para evitar tener que pensar en esto. La curiosidad es mi principal motivo para preguntar.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Si los bytes en byte_array no están alineados en un límite de 2 bytes, entonces convertirlo a IcmpHdr* resultará en un acceso desalineado, lo cual es un comportamiento no definido. Esto significa que no hay un comportamiento garantizado al intentar desreferenciar los miembros de la estructura. En algunas arquitecturas, dicho acceso simplemente resultará en una penalización de rendimiento debido a los ciclos de CPU adicionales requeridos para obtener los datos de la memoria. Sin embargo, en otras arquitecturas, dicho acceso resultará en un fallo de segmentación, lo cual hará que el programa se cierre.

    Por lo tanto, siempre es recomendable alinear correctamente la memoria para evitar tales situaciones. En este caso particular, ya que la estructura está definida con el atributo aligned(2), se asegura que siempre esté alineada en 2 bytes cuando se asigna. Sin embargo, si el arreglo de bytes que contiene datos serializados no está alineado en un límite de 2 bytes, entonces es responsabilidad del programador alinearlo adecuadamente antes de convertirlo a un puntero del tipo de la estructura.

Comments are closed.