gpt4 book ai didi

c++ - 将 char[] 转换为 unsigned int 得到 : dereferencing type-punned pointer will break strict-aliasing rules

转载 作者:搜寻专家 更新时间:2023-10-31 00:34:44 24 4
gpt4 key购买 nike

我在一些遗留的源代码中有一行:

#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)

最佳答案

你的代码的问题是违反了strict aliasing rules因此它可能不安全。

您可以使用 -Wno-strict-aliasing 隐藏警告(这不会解决您的问题),修改您的数据结构或通过指定二进制文件的位置和长度来完全避免该问题按照 Matt 的建议进行复制(可能是最佳选择):

unsigned int msgLength; 
memcpy(&msgLength, m_recvBuf, sizeof(msgLength));
msgLength = ntohl(msgLength);

注意:我没有在 -O3 中收到 clang 3.4 和 gcc 4.8.2 的错误,这意味着编译器可能已经优化了警告。无论如何,这并不能保证您的代码是安全的。

关于c++ - 将 char[] 转换为 unsigned int 得到 : dereferencing type-punned pointer will break strict-aliasing rules,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25546335/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com