From 3f089117c78e7c4cc7aca081a3896b1c18df10a6 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Wed, 15 Aug 2012 03:03:05 +0200 Subject: [PATCH] Apply lekensteyn's workarounds from the DMS repository to prevent compiler warnings. --- lib/amf.cpp | 14 ++++++++++---- lib/dtsc.cpp | 4 +++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/lib/amf.cpp b/lib/amf.cpp index a11788fb..1bd81168 100644 --- a/lib/amf.cpp +++ b/lib/amf.cpp @@ -267,6 +267,7 @@ AMF::Object AMF::parseOne(const unsigned char *& data, unsigned int &len, unsign std::string tmpstr; unsigned int tmpi = 0; unsigned char tmpdbl[8]; + double *d;// hack to work around strict aliasing #if DEBUG >= 10 fprintf(stderr, "Note: AMF type %hhx found. %i bytes left\n", data[i], len-i); #endif @@ -281,7 +282,8 @@ AMF::Object AMF::parseOne(const unsigned char *& data, unsigned int &len, unsign tmpdbl[1] = data[i+7]; tmpdbl[0] = data[i+8]; i+=9;//skip 8(a double)+1 forwards - return AMF::Object(name, *(double*)tmpdbl, AMF::AMF0_NUMBER); + d = (double*)tmpdbl; + return AMF::Object(name, *d, AMF::AMF0_NUMBER); break; case AMF::AMF0_DATE: tmpdbl[7] = data[i+1]; @@ -293,7 +295,8 @@ AMF::Object AMF::parseOne(const unsigned char *& data, unsigned int &len, unsign tmpdbl[1] = data[i+7]; tmpdbl[0] = data[i+8]; i+=11;//skip 8(a double)+1+timezone(2) forwards - return AMF::Object(name, *(double*)tmpdbl, AMF::AMF0_DATE); + d = (double*)tmpdbl; + return AMF::Object(name, *d, AMF::AMF0_DATE); break; case AMF::AMF0_BOOL: i+=2;//skip bool+1 forwards @@ -609,6 +612,7 @@ AMF::Object3 AMF::parseOne3(const unsigned char *& data, unsigned int &len, unsi unsigned int tmpi = 0; unsigned int arrsize = 0; unsigned char tmpdbl[8]; + double *d;// hack to work around strict aliasing #if DEBUG >= 10 fprintf(stderr, "Note: AMF3 type %hhx found. %i bytes left\n", data[i], len-i); #endif @@ -654,7 +658,8 @@ AMF::Object3 AMF::parseOne3(const unsigned char *& data, unsigned int &len, unsi tmpdbl[1] = data[i+7]; tmpdbl[0] = data[i+8]; i+=9;//skip 8(a double)+1 forwards - return AMF::Object3(name, *(double*)tmpdbl, AMF::AMF3_DOUBLE); + d = (double*)tmpdbl; + return AMF::Object3(name, *d, AMF::AMF3_DOUBLE); break; case AMF::AMF3_STRING: if (data[i+1] < 0x80){ @@ -809,8 +814,9 @@ AMF::Object3 AMF::parseOne3(const unsigned char *& data, unsigned int &len, unsi tmpdbl[2] = data[i+5]; tmpdbl[1] = data[i+6]; tmpdbl[0] = data[i+7]; + d = (double*)tmpdbl; i += 8;//skip a double forwards - return AMF::Object3(name, *(double*)tmpdbl, AMF::AMF3_DATE); + return AMF::Object3(name, *d, AMF::AMF3_DATE); break; case AMF::AMF3_ARRAY:{ if (data[i+1] < 0x80){ diff --git a/lib/dtsc.cpp b/lib/dtsc.cpp index f73f73c3..31018e18 100644 --- a/lib/dtsc.cpp +++ b/lib/dtsc.cpp @@ -406,6 +406,7 @@ std::string DTSC::DTMI::Pack(bool netpack){ DTSC::DTMI DTSC::parseOneDTMI(const unsigned char *& data, unsigned int &len, unsigned int &i, std::string name){ unsigned int tmpi = 0; unsigned char tmpdbl[8]; + uint64_t * d;// hack to work around strict aliasing #if DEBUG >= 10 fprintf(stderr, "Note: AMF type %hhx found. %i bytes left\n", data[i], len-i); #endif @@ -420,7 +421,8 @@ DTSC::DTMI DTSC::parseOneDTMI(const unsigned char *& data, unsigned int &len, un tmpdbl[1] = data[i+7]; tmpdbl[0] = data[i+8]; i+=9;//skip 8(an uint64_t)+1 forwards - return DTSC::DTMI(name, *(uint64_t*)tmpdbl, DTMI_INT); + d = (uint64_t*)tmpdbl; + return DTSC::DTMI(name, *d, DTMI_INT); break; case DTMI_STRING:{ tmpi = data[i+1]*256*256*256+data[i+2]*256*256+data[i+3]*256+data[i+4];//set tmpi to UTF-8-long length