討論區快速選單
知識庫快速選單
網路投保旅行平安險 軟體開發過程中有哪些資安漏洞? 政府補助!學嵌入式+物聯網
[ 回上頁 ] [ 討論區發言規則 ]
[bug] 32位元整數移位時要注意
更改我的閱讀文章字型大小
作者 : chiuinan2(青衫)討論區板主 Visual C++ .NET卓越專家VC++一代宗師Visual Basic優秀好手資訊類作業求救卓越專家一般曠世奇才程式設計甘苦談優秀好手C++ Builder優秀好手上班族的哈拉園地優秀好手C++頂尖高手Assembly優秀好手貼文超過3000則人氣指數超過150000點
[ 貼文 3732 | 人氣 170106 | 評價 34520 | 評價/貼文 9.25 | 送出評價 125 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/3/18 下午 05:19:34
最近發現Intel 32位元移位指令限制, 會導致VC++的相關寫法出問題. 以兩個整數相接位移的寫法為例:

假設a:b是邏輯上的64位元整數, 要往左移c個位元, 一般寫法是:

unsigned int a, b;

a = (a << c) | (b >> (sizeof(unsigned int)*8-c)); // statement 1 //
b <<= c;

這樣的寫法, 若是char或short皆沒問題, 但若為32位元的long或int時, 就有潛在的問題. 以邏輯上而言, 當c=0時, statement 1應該得到a, 當c=32時, 則應為b, 但實際上的結果, 都是 a | b, 主要因為Intel的shl, shr, sar等指令對於移位數只取最低的5位元進行移位, 於是移位32位元等於沒移位. 以組語為例:

mov cl, 32
shr eax, cl

結果eax值並沒有改變, 因為相當於shr eax,0 (32 & 0x1F = 0), 與還輯中eax應為0並不同.

解決方法只能在移位前檢驗c的值域進行特別處理. 這個問題VC 6.0到VS 2008皆然.
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/5/20 上午 02:58:57
>這樣的寫法, 若是char或short皆沒問題, 但若為32位元的long或int時, 就有潛在的問題. 以邏輯上而言, 當c=0時, statement 1應該得到a, 當c=32時, 則應為b, 但實際上的結果, 都是 a | b, 主要因為Intel的shl, shr, sar等指令對於移位數只取最低的5位元進行移位, 於是移位32位元等於沒移位. 以組語為例:
>
>mov cl, 32
>shr eax, cl

幾乎所有 IA32 的 instruction, x << c 等同於 x << (c & 31). 只有 8086 是例外. 〔資料來源:IA-32 Intel Architecture Software Developer's Manual Volume 2: Instruction Set Reference (http://developer.intel.com/design/pentium/manuals/24319101.PDF)〕

從 C 及 C++ 語言的角度來看, 只要移位超出左邊運算元的大小, 就會導致 undefined behavior. 在原本的式子, 當 'c' 等於 0 或 32 時, | 的左邊或右邊都會有一個造成 undefined behavior.

VC++ 的這個行為嚴格說起來不能算是 compiler bug.

作者 : cheg(cheg)
[ 貼文 99 | 人氣 125 | 評價 410 | 評價/貼文 4.14 | 送出評價 24 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/5/20 上午 06:49:50
上次用 BCB5 發現這回事, 立刻用 CodeBlock 測試也是如此, 嚇了好幾跳 @_@
真是很恐怖的東西 ....
 板主 : 青衫 , Raymond
 > Visual C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - Visual C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
Visual C++
1 青衫 11070 
2 Raymond 10090 
3 Clier 7630 
4 小約翰 2500 
5 Cog 2030 
6 coco 1870 
7 aming 1410 
8 牧童哥 1400 
9 r2109 1380 
10 Akira 1350 
Visual C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.140625