gpt4 book ai didi

c++ - 关于 gcc 中类型双关的编译器警告

转载 作者:行者123 更新时间:2023-11-30 04:01:27 26 4
gpt4 key购买 nike

我有一个大型程序,其中包含大量表单片段

float t = amplitudes->read(current_element);
if ( *((uint32_t * ) &t) == 0xsomereservedvalue)
do_something
else
do_something_else

这可以在 gcc 3.4.x 下正常编译,没有警告。使用 -Wtrict-aliasing=2 编译仍然没有警告。我最近尝试使用 gcc4.4 进行编译,并收到大量关于类型双关引用的警告。有人能告诉我这种代码在任何合理的情况下都会失败吗?据我所知,类型双关只是一个潜在的问题,如果优化安排事情使得在另一行代码读取它之后可能从寄存器写回某些东西,因为我们在这里返回一个函数就可以了发生。我在这里遗漏了什么,还是 gcc 有点脑残?

最佳答案

当然会警告。我刚刚检查了 gcc 4.8.2 它也发出警告。想象一下,目标机器的浮点大小是 16 位,而您正试图在数据边界后读取 32 位。是UB。

顺便说一句,我不同意在这种情况下使用 reinterpret_cast。 reinterpret_cast 唯一有用的方法是 *(reinterpret_cast<char *>(&t)) , 甚至 *(reinterpret_cast<unsigned *>(&t))仍然会违反别名规则,并且您会收到相同的警告。这是因为编译器只知道 C++ 中的 char 是最小的,所以每个类型都可以转换为它。

GCC 有一个属性告诉给定的类型可以别名。使用它也不是那么容易。

unsigned * __attribute__ ((__may_alias__)) pu = (unsigned *) &t;
if (*pu == 0xsomereservedvalue)
do_something ();
else
do_something_else ();

但这里的事情至少是有道理的。我们要求可别名指针。成本:代码现在不可移植。

所以综合考虑,我建议只供应-fno-strict-aliasing如果您真的确定自己知道自己在做什么,请选择此选项。

关于c++ - 关于 gcc 中类型双关的编译器警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25746127/

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