星期一, 9月 27, 2010

bug of storeword loadbyte

#define endian(x) (((x)&0xff000000>>24) || ((x)&0x00ff0000>>8) || ((x)&0x0000ff00<<8) || ((x)&0xff000000<<24))

這會有什麼bug?
只有在(x)還有人在改的時候,
問題不是我發現的,
長經驗長經驗...

4 則留言:

isometry 提到...

你打錯了吧? 那錯誤的公式是下面這樣吧?
#define endian(x) (((x)&0xff000000>>24) || ((x)&0x00ff0000>>8) || ((x)&0x0000ff00<<8) || ((x)&0x000000ff<<24))

但這樣的結果只有0和1吧...XD

明明是bitwise operation, 為何要搭配"||"(logic operator)?

yehmomo 提到...

對,我好像打錯了(下次應該要copy and paste的),應該是

#define endian(x) (((x)&0xff000000>>24) | ((x)&0x00ff0000>>8) | ((x)&0x0000ff00<<8) | ((x)&0x000000ff<<24))

不過這個bug和你有關喔:p

isometry 提到...

真是長知識了, 沒想到會有這種潛在問題(x是兩方共用+uncacheable+volatile, 存取四次的x有可能會不同)...Orz
當初也不知道為何就是不想寫成function, 而硬是要用macro...囧

yehmomo 提到...

每一次的bug都是長經驗的時候,
不過有時候自己寫的code會有盲點,
看不出問題