Die Code-Basis bei der Arbeit enthält einigen Code, der in etwa wie folgt aussieht:Wie interpretiere ich binäre Daten als Integer?
#define DATA_LENGTH 64
u_int32 SmartKey::SerialNumber()
{
unsigned char data[DATA_LENGTH];
// ... initialized data buffer
return *(u_int32*)data;
}
Dieser Code funktioniert einwandfrei, aber GCC gibt die folgende Warnung:
warning: dereferencing pointer ‘serialNumber’ does break strict-aliasing rules
Kann jemand diese Warnung erklären? Ist dieser Code potentiell gefährlich? Wie kann es verbessert werden?
aktualisieren
Mit Dank an James McNellis' Antwort kam ich auf die folgende Nutzenfunktion auf:
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);
}
Fühlen Sie sich frei Verbesserungen vorschlagen!
Wahrscheinlich hat mit Zeiger aus unsigned Char * zu u_int32 *, aber eine lange Zeit seit ich C++ getan hatte zu tun. Wenn ja, da DATA_LENGTH ein genaues Vielfaches von 32 ist, sollte kein Problem auftreten. –