C++ 构建警告:取消引用类型双关指针将破坏严格别名规则

Posted

技术标签:

【中文标题】C++ 构建警告:取消引用类型双关指针将破坏严格别名规则【英文标题】:C++ build warning : dereferencing type-punned pointer will break strict-aliasing rules 【发布时间】:2014-12-24 09:25:33 【问题描述】:

我的演员阵容代码上有这个警告:

取消引用类型双关指针会破坏严格别名规则 [-Wstrict-aliasing]

unsigned char buffer[64];
...
unsigned int value = *(unsigned int*)buffer;

如何解决这个警告?

感谢您的帮助!

【问题讨论】:

你明白警告告诉你什么吗?您需要先了解问题,然后才能真正解决它。有很多方法可以在解决真正问题的情况下使警告静音,而仅仅让警告静音是完全没有意义的。 重复是一道 C 题,这是一道 C++ 题。这很重要,因为对“重复”的建议修复之一是使用在 C++ 中不起作用的union @MattMcNabb 好点。事实上,没有一个答案可以作为这里的答案。出于这个原因,我重新打开了这个。 啊,是的,类型双关语。不是语言也不是 gcc 最好的时刻。 Here's 一篇出色的文章,涵盖了所有的如果,但可能与您正在尝试做的事情相关联。祝你好运! 不知道代码应该做什么,很难帮助你。代码的行为将是特定于平台的,在不了解您的平台的情况下,我们无法知道它应该做什么。有办法做它正在做的任何事情,但我们不知道那是什么。 【参考方案1】:

此代码的作用取决于平台的字节顺序、对齐规则、整数大小和其他因素。仅仅通过观察是无法知道它在做什么的。但你可能想要这样的东西:

unsigned int value = buffer[0];
value = (value << 8) | buffer[1];
value = (value << 8) | buffer[2];
value = (value << 8) | buffer[3];

【讨论】:

【参考方案2】:

如何解决这个警告?

首先不要使用type-punning。在本例中,您可以改用memcpy()

unsigned char buffer[64];
...
unsigned int value;
memcpy(&value, buffer, sizeof(value));

如果字节序有问题,您可以在之后交换value 的字节。或者,您可以使用位移解决方案,例如 @DavidSchwartz's answer 节目。

【讨论】:

以上是关于C++ 构建警告:取消引用类型双关指针将破坏严格别名规则的主要内容,如果未能解决你的问题,请参考以下文章

调用 free() 包装器:取消引用类型双关指针将破坏严格别名规则

这真的违反了严格的别名规则吗?

这真的违反了严格的别名规则吗?

如何在 C++ 中取消引用指针对象?

gcc、严格混叠和通过联合进行强制转换

Go 指针、引用、取消引用的规则: