目的: 檢驗學員對 C 程式設計的認知
1
考慮到 memcmp 一種實作如下: (行為和 ISO C90 有出入)
我們可能因此承受 information leakage 的風險,於是著手避免使用 conditional branching 一類的指令,從而避免 side-channel attack。
為了避免 conditional branch 指令的出現,我們可將 (res > 0) - (res < 0)
替換為 ((res - 1) >> 8) + (res >> 8) + 1
。隨後我們實作下方功能等價但避免 branch 的 memcmp
:
注意: 在 Linux 核心內部的實作方式可見:
請補完程式碼。
作答區
X = ?
(a)
diff(b)
(diff + 1)(c)
(diff - 1)(d)
1(e)
0Y = ?
(a)
diff(b)
(diff + 1)(c)
(diff - 1)(d)
1(e)
0延伸問題:
2
考慮以下計算平方根的程式:
該函式利用 (x + a)2 = x2 + 2ax + a2 漸進找出平方根。不過上面的程式僅能處理整數,我們引入 fixed point 來表達浮點數,改寫程式碼如下:
請補完程式。
作答區
Q = ?
(a)
b >>= 2(b)
r >>= 1(c)
r <<= 1(d)
b >>= 1(e)
b <<= 1(f)
r >>= 1, b <<= 1(g)
r <<= 1, b >>= 1延伸問題:
sqrt_I2F
函式存在 overflow 風險,請提出修正方案並驗證;3
考慮以下 linked list 程式:
可透過以下 pointer to pointer 改寫 insert
函式,功能等價但更簡潔,如下:
請補完程式碼。
作答區
A = ?
(a)
*link->data < newt->data(b)
(*link)->data < newt->data(c)
**link->data < newt->data(d)
(link)->data < newt->dataB = ?
(a)
*link = *link->next(b)
(*link) = (*link)->next(c)
link = (*link)->next;(d)
link = &(*link)->next;延伸問題:
在 Linux 核心找出運用類似的手法的程式碼並解說