当您访问超出界限的数组时,例如:
int numbers[2];
numbers[2] = 12345; // here we are accessing the array out of bounds
以上是被认为是违反类型安全还是违反内存安全?
还是两者都违反? 我之所以认为它可能是对两者的违反,是因为本文可能是在说内存安全是类型安全的子集:
C和C++:类型不安全。 C的标准类型系统不排除标准(和一般实践)认为没有意义的程序,例如注销缓冲区末尾的程序。 1所以,对于C语言来说,类型好的程序可能出错。 C++(从道德上讲)是C的超集,因此它继承了C缺乏类型安全性的缺点。
该条还对上述第1条作了以下说明:
C也不是内存安全的; 实际上,内存安全排除的未定义行为是类型安全排除的未定义行为的子集。
就C++而言,两者都不是。 类型安全或内存安全不是C++标准中定义的术语。
有一节是关于安全派生指针的,它可能与“内存安全”有关,但它与上面的示例有很大的不同。
类型安全意味着编译器将在编译时验证类型,如果您试图将错误的类型分配给变量,则会抛出错误。 例如:
int x = "foo";
不能将字符串文字(常量char[4]
)分配给类型int
,因为它们不兼容。
内存安全是在处理内存访问时免受各种软件bug和安全漏洞的保护的状态,如缓冲区溢出和悬空指针。
~内存安全-维基百科
您的例子是违反内存安全,因为您试图分配一个您无法访问的内存。
以上是被认为是违反类型安全还是违反内存安全?
这些都不是正式术语。 “类型安全”在标准的范围内是兼容类型和兼容类型转换--与数组出界没有真正的关联。
然而,在C17,L.2.1的规范性附件L中对“界外商店”一词有正式定义:
Out-Of-Bound存储
一个(尝试的)访问(3.1),在运行时,对于给定的计算状态,该访问将修改(或者,对于声明为volatile的对象,提取)一个或多个位于本标准允许的边界之外的字节。