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使得转换过程更安全。
尽管如此,但如果使用空类型指针或者在两个不同类型指针间做强制转换,很可能引发类型不安全的问题。