[问题] C的strict aliasing rule

楼主: zzss2003 (brotherD)   2019-01-23 13:37:04
嗨,大家今天过的好吗?
网址: https://reurl.cc/nZnAe
里面的一小段程式码:
float funky_float_abs (float a)
{
unsigned int temp = *(unsigned int *)&a;
temp &= 0x7fffffff;
return *(float *)&temp;
}
取浮点数的绝对值
网址里面说这样写会出问题,因为用char*与void*以外的型别(以这例子: unsigned int)
拿位址(&a)会让pointer指到别的address上。
但我用TDM-GCC 4.9.2与ideone(gcc6.3)编译并没有出现问题
结果: https://ideone.com/HJ6qX0
因为stackoverflow的这篇文章是10年前,我在想这部分是不是后来在C standard有被修正
过,但是网络上找找不到相关资讯,故上来请教一下板友~
感恩感恩
作者: samuelcdf (温泉龟)   2019-01-23 14:48:00
#1CUzwZv7 请看本板讨论串, 以前我被电过 +_+我找了一下午, 也没有找到什么资讯, 不过我想这只是因为undefined behavior出来结果刚好跟我们想的一样而已
作者: lovejomi (JOMI)   2019-01-23 19:05:00
我比较想知道 乍看想法我都不会觉得有问题,该怎么知道这写法是很可能undefined behavior呢?https://ideone.com/YKpnuL 请问这写法会有问题吗?假设是在little endian的机器上 我查了一下 转成uchar*没有违反 strict alias, 那这样可以吗?还是一样有问题
作者: samuelcdf (温泉龟)   2019-01-24 09:37:00
用union, char*, unsigned char*都可以
作者: descent (“雄辩是银,沉默是金”)   2019-01-24 16:21:00
可能你的 int, float 大小一样
作者: Sanvean   2019-01-25 22:27:00
手上有一个相反的例子 https://pastebin.com/Tf8Z4n2p
作者: LPH66 (-6.2598534e+18f)   2019-01-26 14:31:00
strict aliasing rule 不是表示它真的指到别处了而是编译器会假设不同型态指标指的一定是不同物件利用这个假设来进行许多的最佳化这个是 C 语言标准给的自由空间那编译器在不同的最佳化层级下会不会用这条规则进行最佳化就要看各自编译器的设计了
作者: IhateOGC (我讨厌)   2019-01-31 11:24:00
这让我想到C++当C写的天兵

Links booklink

Contact Us: admin [ a t ] ucptt.com