У меня есть строка в исходном коде некоторого наследия:
#define MAXMSG 1024
...
char m_recvBuf[MAXMSG];
unsigned int msgLength = ntohl(*((unsigned int *)m_recvBuf));
Это дает следующее предупреждение:
x.cpp: In member function ‘bool xx::cccc(std::string&)’:
x.cpp:308: warning: dereferencing type-punned pointer will break strict-aliasing rules
Как я могу избавиться от этого предупреждения?
моя строка компиляции:
g++ -c -g -O2 -Wall -DDEBUG_ON -D_VERSION_=\"1.0.0\" `xml2-config --cflags` -I../src -I./common -I. -I../../test/ -o common/xx.o common/xx.cpp
$ g++ --version
g++ (GCC) 4.4.6 20110731 (Red Hat 4.4.6-3)
-fno-strict-aliasing
. Этот код нарушает стандарт, и в режиме -O3 gcc может полностью оптимизировать его, однако параметр-fno-strict-aliasing
заставляет его вести себя так, как будто вы хотите получить доступ к памяти в буфере char. - person M.M   schedule 28.08.2014unsigned int msgLength; memcpy(&msgLength, m_recvBuf, sizeof msgLength); msgLength = ntohl(msgLength);
, а еще лучше сделать переносную конвертацию - person M.M   schedule 28.08.2014