当前位置: 首页 > 知识库问答 >
问题:

访问超出界限的数组是否被视为违反类型安全或违反内存安全?

锺离正祥
2023-03-14

当您访问超出界限的数组时,例如:

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也不是内存安全的; 实际上,内存安全排除的未定义行为是类型安全排除的未定义行为的子集。

共有3个答案

郗福
2023-03-14

以上是被认为是违反类型安全还是违反内存安全?

这些都不是正式术语。 “类型安全”在标准的范围内是兼容类型和兼容类型转换--与数组出界没有真正的关联。

然而,在C17,L.2.1的规范性附件L中对“界外商店”一词有正式定义:

Out-Of-Bound存储
一个(尝试的)访问(3.1),在运行时,对于给定的计算状态,该访问将修改(或者,对于声明为volatile的对象,提取)一个或多个位于本标准允许的边界之外的字节。

隗锐进
2023-03-14

类型安全意味着编译器将在编译时验证类型,如果您试图将错误的类型分配给变量,则会抛出错误。 例如:

int x = "foo";

不能将字符串文字(常量char[4])分配给类型int,因为它们不兼容。

内存安全是在处理内存访问时免受各种软件bug和安全漏洞的保护的状态,如缓冲区溢出和悬空指针

~内存安全-维基百科

您的例子是违反内存安全,因为您试图分配一个您无法访问的内存。

西门靖琪
2023-03-14

就C++而言,两者都不是。 类型安全或内存安全不是C++标准中定义的术语。

有一节是关于安全派生指针的,它可能与“内存安全”有关,但它与上面的示例有很大的不同。

 类似资料:
  • 我正在从chargebee.com加载外部脚本,并在控制台中收到此错误消息: [仅报告]拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“script src'nonce VVZ V0c=''self'https://maps.googleapis.com https://domain.chargebeestatic.com http://dgkxwewtzsnml.cloudfront.ne

  • 来自Liskov替代原理-www.blackwasp。co.uk 不符合LSP的一个常见指示是当客户端类检查其依赖项的类型时。这可以通过读取人为描述其类型的对象的属性或通过使用反射来获得类型。通常,根据依赖项的类型,将使用开关语句执行不同的操作。这种额外的复杂性也违反了打开/关闭原则(OCP),因为随着更多子类的引入,客户端类需要修改。 以下技术(使用反射)是否会导致违反LSP? 依赖注入 注:我

  • 当我将图像上传到我的web应用程序中时,它显示以下错误 拒绝加载图像'

  • 问题内容: 有违反声纳的行为: 违反声纳:安全性-阵列直接存储 解: 但是我想知道为什么吗? 问题答案: 它的抱怨,你存储阵列是由主叫方持有相同的数组。也就是说,如果调用者随后修改了此数组,则存储在对象中的数组(以及对象本身)将发生变化。 解决方案是在传递对象时在对象内进行复制。这称为 防御性复制 。收集的后续修改不会影响存储在所述对象内的阵列。 在返回集合时(例如在相应的调用中)通常也要这样做。

  • 问题内容: Liskov替换原理是SOLID的原理之一。我已经读过几次这个原理,并试图理解它。 这就是我的所作所为, 此原则与类层次结构之间的强行为契约有关。子类型应该能够被超类型替换而不会违反合同。 我也读过其他文章,对这个问题我有些失落。难道方法不违反LSP? 上面链接的文章摘录: 换句话说,当通过对象的基类接口使用对象时,用户仅知道基类的前提条件和后置条件。因此, 派生对象不能期望此类用户遵

  • 这是一个典型的反应问题,但我不知道如何处理它。我只想动态呈现我的表行,但我得到了错误:“未捕获错误:不变冲突:processUpdates():找不到元素的子元素2。这可能意味着DOM发生了意外的变化(例如,通过浏览器),通常是因为在使用表时忘记了, ,或,或在父级中使用非SVG元素。尝试使用React ID检查元素的子节点。" 我知道react没有找到合适的DOM,但如何处理呢?提前谢谢!

  • 在这里输入图像描述所以我是非常新的帕格,但它声称就像超文本标记语言,所以我使用它,当做以下事情: block head:在base.pug中,并在另一个页面中使用它,如:block append head:(并使用以下脚本和链接):block append head script(src=)https://api.mapbox.com/mapbox-gl-js/v0.54.0/mapbox-gl.

  • 根据方法<code>java.util.concurrent的约定。未来#取消: 此方法返回后,对 isDone 的后续调用将始终返回 true。 Netty的Future接口扩展了它: 所以Netty应该遵守合同。但事实上Netty没有。您可以运行以下示例代码: 控制台应打印: 真 但实际上它打印: 假 以下方法也违反了合同: 我已经在github上创建了一个问题:问题 但是我仍然想在stack