前言
最近公司專案導入 static code check tool 並且採用較嚴格的 coding rule 來檢查,團隊內不乏許多資深的工程師,但檢查出相當多型態轉換的問題,促使我想寫下這篇文章釐清 C 語言型態轉換的規則及可能的問題。
可能的安全問題
C語言包含不同的型態,不同型態之間做運算就會適用不同規則,這也是 C 語言型態轉換困難的地方,進行型態轉換,可能會發生以下問題是值得我們留意的
- loss of value: 如果今天我們將 integer 轉換到 char 型態,由於 int 型態大小遠大於 char,就會造成這種狀況
- loss of sign: 如果我們將 unsigned int 與 signed int 進行運算,原本 signed int 被迫轉換成 unsigned int,就會造成這種狀況
- loss of precision: 從 floating 型態轉換到 integer 型態
- loss of layout: 型態轉換發生在從 pointer to struct 到 pointer to char
型態轉換又分為兩種:
- explicit conversion: 就是大家會在教科書上看到的 cast,開發者可以強制轉換任何資料的 data type。
- implicit conversion: 這是大部分開發者都會疏忽的,由 compiler 來幫你轉換型態,以下會描述什麼情況下會發生 implicit conversion,我們並不需要牢記這些規則,但必須要在開發時候隨時留意。