[問題] 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