2017-09-14 1 views
-4

Ich versuche, einige C++ Code mit Adresse Sanitizer zu beheben. Der Code sagt:wie man uint32_t korrekt in unsigned-caste umwandelt

unsigned result = *(uint32_t*)data; 

Und die Sanitizer gibt:

runtime error: load of misaligned address 0x6280033f410a for type 'uint32_t', which requires 4 byte alignment 

Wie muss ich dieses Problem beheben?

+1

Warum verwenden Sie diese Besetzung? –

+2

'memcpy' den Zeiger zu einem echten' uint32_t', bevor es in 'unsigned' umgewandelt wird. –

+4

Welcher Typ ist 'Daten'? – Galik

Antwort

1
load of misaligned address 0x6280033f410a for type 'uint32_t' ... 

Wie kann ich dieses Problem beheben müssen?

Sie benötigen ein ausgerichtetes Objekt (wie eine Variable), und kopieren Sie den Inhalt aus der falsch ausgerichteten Adresse zu erstellen:

std::uint32_t u32; 
std::memcpy(&u32, data, sizeof u32); 

Dies setzt voraus, dass Sie sizeof u32 Bytes von dieser Adresse zu lesen beabsichtigen, und dass Diese Bytes sind in nativer Endianz angeordnet.

, wie man richtig gegossen uint32_t zu unsigned

Implizite Konvertierung Fein gerade sein sollte:

unsigned result = u32; 
+0

vielen Dank, 'std :: uint32_t u32; std :: memcpy (& u32, data, sizeof u32); 'behebt das Problem! – jwijffels