[C 的那些眉角]型別轉換的隱式陷阱 — 你沒有要轉,但它轉了

有一次我在 review 同事的 code,看到一行:

if (len - sizeof(header) > 0) {

我當下沒說什麼,因為看起來很正常。結果那週 QA 回報說某個封包長度剛好等於 header size 的時候,系統會亂跑。

追進去才發現:lenintsizeof(header)size_t,也就是 unsigned。當 len == sizeof(header) 的時候,相減結果是 0,但如果 len < sizeof(header),你以為是負數,其實是一個很大的正整數。然後 > 0 就是 true。

然後就囧了。

閱讀全文