1、什麼是類型安全
類型安全簡單來說就是訪問可以被授權訪問的內存位置,類型安全的代碼不會試圖訪問自己未被授權的內存區域。一方面,類型安全被用來形容編程語言,主要根據這門編程語言是否提供類型安全的保障機制;另一方面,類型安全也可以用來形容程序,根據這個程序是否隱含類型錯誤。類型安全的語言和程序之前,其實沒有必然的聯繫。類型安全的語言,使用不當,也可能寫出來類型不安全的程序;類型不安全的語言,使用得當,也可以寫出非常安全的程序。
2、C的類型安全
C語言不是類型安全的語言,原因如下:
1)很多情況下,會存在類型隱式轉換,比如bool自動轉成int類型;
2)malloc函數返回的是void *的空類型指針,通常需要這樣的顯示類型轉換char* pStr=(char*)malloc(100*sizeof(char)),類型匹配沒有問題。但如果出現int* pInt=(int*)malloc(100*sizeof(char))這樣的轉換,可能會帶來一些問題,但C並不會提示。
當然,在有些情況下表現還是類型安全的,當從一個結構體指針轉換成另一個結構體指針時,編譯器會報錯,除非顯式轉換。
3、C++的類型安全
C++也不是類型安全的語言,但遠比C更具類型安全。相比於C,提供了一些安全保障機制:
1)用操作符new來申請內存,嚴格與對象類型匹配,而malloc是void *;
2)函數參數爲void *的可以改寫成模板,模板支持運行時檢查參數類型;
3)使用const代替define來定義常量,具有類型、作用域,而不是簡單的文本替換;
4)使用inline代替define來定義函數,結合函數的重載,在類型安全的前提下可以支持多種類型,如果改寫成模板,會更安全;
5)提供dynamic_cast使得轉換過程更安全。
儘管如此,但如果使用空類型指針或者在兩個不同類型指針間做強制轉換,很可能引發類型不安全的問題。
4、總結
想要保證程序的類型安全,儘量避免使用空類型指針,儘量不對不同類型的指針做強制轉換。