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、总结
想要保证程序的类型安全,尽量避免使用空类型指针,尽量不对不同类型的指针做强制转换。