El código base en el trabajo contiene un código que se ve más o menos así:¿Cómo interpretar datos binarios como un número entero?
#define DATA_LENGTH 64
u_int32 SmartKey::SerialNumber()
{
unsigned char data[DATA_LENGTH];
// ... initialized data buffer
return *(u_int32*)data;
}
Este código funciona correctamente, pero GCC da la siguiente advertencia:
warning: dereferencing pointer ‘serialNumber’ does break strict-aliasing rules
¿Puede alguien explicar esta advertencia? ¿Este código es potencialmente peligroso? ¿Cómo puede ser mejorado?
actualización
Con gracias a la respuesta de James McNellis' me ocurrió la función de utilidad:
template<class T, class Data>
T BinaryCast(const Data & inData)
{
T ret;
std::copy(&inData[0], &inData[0] + sizeof(ret), reinterpret_cast<char*>(&ret));
return ret;
}
u_int32 SmartKey::SerialNumber()
{
unsigned char data[DATA_LENGTH];
// ... initialized data buffer
return BinaryCast<u_int32>(data);
}
Siéntase libre de sugerir mejoras!
Probablemente tiene que ver con el puntero que se lanza desde unsigned char * a u_int32 * pero ha pasado mucho tiempo desde que lo hice C++. Si es así, dado que DATA_LENGTH es un múltiplo exacto de 32, no debería haber un problema. –