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.

¿Es seguro acceder a una estructura mediante un puntero apuntando a una dirección de memoria desalineada en C/C++?

struct CustomData
{
    char flag;
    int count;
    double value;
};

CustomData custom_data{};

char *buf = new char[sizeof(CustomData) + 3];
memcpy(buf + 3, &custom_data, sizeof(CustomData));

CustomData* ptr = (CustomData *)(buf + 3);

ptr->count = 10;
ptr->value = 20.0;

Tengo un búfer de memoria compuesto por algunos bytes de encabezado y una estructura. La estructura se copia a este búfer de memoria mediante memcpy. Tengo que modificar algunos campos en esta estructura incrustada, como se muestra arriba.

Mis preguntas son:

  1. ¿Es un acceso seguro en x86-64? ¿Qué tal en otras plataformas?

  2. Hacer una copia con memcpy de una estructura local, modificarla y copiarla de nuevo seguramente está bien, pero parece ser una pérdida de recursos. ¿Hay alguna forma de verificar si “ptr” está correctamente alineado para un acceso seguro a la estructura?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai
    1. Este es considerado un acceso inseguro en plataformas donde no se garantiza la alineación de la memoria. En x86-64, es posible que este código funcione como se espera, pero en otras plataformas con alineaciones diferentes, puede causar comportamientos inesperados como bloqueos o corrupción de datos.
    2. Una manera de verificar si ptr está correctamente alineado es utilizando la función std::align proporcionada por la biblioteca estándar. La función std::align recibe como argumentos el requisito de alineación y la dirección del búfer, y devuelve un puntero al bloque de memoria correctamente alineado. Aquí hay un ejemplo:

      void* aligned_ptr = nullptr;
      std::align(alignof(CustomData), sizeof(CustomData), aligned_ptr, sizeof(CustomData) + 3);
      
      CustomData* ptr = new (aligned_ptr) CustomData; // uso de new de emplazamiento para construir la estructura en la dirección alineada
      

      Este código asegura que ptr esté correctamente alineado y se pueda acceder de forma segura. También elimina la necesidad de las operaciones memcpy y copia de regreso.

Comments are closed.