类型
安全代码指访问被授权可以访问的
内存位置。例如,类型安全代码不能从其他对象的私有字段读取值。它只从定义完善的允许方式访问类型才能读取。
在即时编译(JIT)期间,可选的验证过程检查要实时编译为本机代码的方法的
元数据和
Microsoft中间语言(
MSIL),以验证它们是否为类型安全,如果代码具有忽略验证的权限,则将跳过此过程。有关验证更多信息。
尽管类型安全验证对于运行
托管代码不是强制的,但类型安全在
程序集隔离和安全性强制中起着至关重要的作用。如果代码是类型安全的,则
公共语言运行库可以将程序集彼此间完全隔离。这种隔离有助于确保程序集之间不会产生负面影响,且提高应用程序的可靠性。即使类型安全组件的信任级别不同,它们也可以在同一过程中安全地执行。如果代码不是类型安全的,则会出现不需要的副作用。例如,
运行库无法阻止
非托管代码调用到本机(
非托管)代码中和执行恶意操作。当代码是类型安全时,运行库的安全性强制机制确保代码不会访问本机代码,除非它有访问本机代码的权限。所有非类型安全的代码都必须通过传递的枚举成员SkipVerification授予SecurityPermission后才能运行。类型安全的代码是代码访问中非常明确,允许的数据类型的方法。微软已经提供了。NET框架称为PEVerify工具。PEVerify可以被用来确保
CLR将只执行代码是可验证的类型安全的。
学术研究用途的编程语言,常会提出类型安全方面的需求。另一方面,许多语言以人工方式所产生的类型安全,证实经常需要上千次的检查。不过,某些语言,如标准ML,其严格定义了语义,且
Java也已提供类型安全。其它语言如
Haskell也被认为是类型安全。暂且不理会语言定义的性质,在执行时期发生的某些错误,应归于实作时的缺陷,或是用了其它语言撰写的
程式库;这种错误可能使给定的实作,在某些情况下的类型不再安全。
要实现完善的类型安全语言,它至少需要
垃圾回收或增加内存配置和解配置的限制(本节主要针对前者)。更明确地说,不允许悬置指标横跨不同结构类型的存在。这有一技术上的原因:假定类型语言(如
Pascal要求分配的内存必须显式释放)。如果存在一个仍旧指向之前的内存位址的悬置指标,新的
数据结构可能会分配到同一空间。例如,如果初始化一个指向整数区域数据结构的指标,但新物件的指标区域却分配在整数的地方,然后指标区域可借由改变整数区域的值简单改变成任可东西(经由间接引用悬置指标)。因为当指标改变时,尚未指定将会发生什么,所以这个语言就不是类型安全的。大部分类型安全的语言满足使用垃圾回收实现内存的管理。
在允许指标算术的语言中,实作垃圾回收器是最好的,所以在类型不安全的语言或类型安全可能失效的语言中,如此实作回收器的程式库是最好的。
C和
C++经常使用。
在各种
强类型的定义中,其往往成为类型安全的同义词;然而,类型安全与动态类型并不互相排斥。也可将动态类型视为非常宽松的静态类型语言,而且所有语法正确的程式皆具备良好类型;只要它的动态
语义学能够保证绝不会有程式“搞错”,它就可以满足上述定义,且可称为类型安全。