类型安全的代码不会视图访问没被授权的内存区域。类型安全的编程语言指的是其提供保障类型安全的机制;类型安全的程序指的是该程序没有隐含类型错误。
1、C语言的类型安全
C语言只在局部上下文中表现类型安全,例如试图将一种类型的指针转换成其他类型的指针时,编译器会报错,除非使用显示类型转换。
例1、printf输出格式
void main(){
printf("%d\n", 10);//程序输出:10
}
void main(){
printf("%f\n", 10);//程序输出:0.000000
}
void main(){
printf("%s\n", 10);//编译通过,执行时报错Access Violation
}
例2、malloc函数的返回值
malloc函数的返回值是void *类型,通常需要相应的显示类型转换。但是如果出现int * p = (int *)malloc(20*sizeof(char))可能会带来一些问题,但是此时C语言没有报错。
2、C++类型安全
与C语言相比,C++提供了一些新的机制保障类型安全:
(1)操作符new返回的指针类型严格与对象匹配,而不是void*;
(2)C中很多以void*为参数的函数可以改写为C++模板函数,而模板是支持类型检查的;
(3)引入const关键字代替#define constants,它是有类型、有作用域的,而#define constants只是简单的文本替换;
(4)一些宏定义可被改写为inline函数,结合函数的重载,可在类型安全的前提下支持多种类型,当然改写为模板
也能保证类型安全;
(5)C++提供了dynamic_cast关键字,使得转换过程更加安全,因为dynamic_cast比static_cast涉及更多具体的类型检查。
但是C++中仍然无法保证绝对的类型安全:
例1、空类型指针void *
int main(){
int x = 1;
void *p = &x;
double d = (*(double *)p);
cout << d << endl;
return 0;
}//程序输出结果并不是1