为了账号安全,请及时绑定邮箱和手机立即绑定

访问超出界限的数组有多危险?

访问超出界限的数组有多危险?

C++ C
守着一只汪 2019-05-30 17:06:47
访问超出界限的数组有多危险?访问超出其界限的数组(在C中)有多危险?有时会发生这样的情况:我从数组外部读取(我现在了解了,然后访问了程序中其他部分使用的内存,甚至超出了内存),或者我试图为数组之外的索引设置一个值。程序有时崩溃,但有时只是运行,只会产生意想不到的结果。现在我想知道的是,这到底有多危险?如果它破坏了我的节目,也不会那么糟糕。另一方面,如果它破坏了我程序之外的东西,因为我设法访问了一些完全无关的内存,我想这是非常糟糕的。我读了很多“任何事情都可能发生”,“分割可能是最不坏的问题”“你的硬盘可能会变成粉红色,独角兽可能会在你的窗户下唱歌”,这一切都很好,但真正的危险是什么呢?我的问题:除了我的程序之外,从数组之外读取值会破坏任何东西吗?我可以想象,仅仅看东西就不会改变什么,或者它会改变我碰巧到达的文件的“上次打开”属性吗?除了我的程序之外,在数组之外设置值可以破坏任何东西吗?从这里堆栈溢出问题据我所知,访问任何内存位置都是可能的,没有安全保障。我现在XCode内部运行我的小程序。这是否为我的程序提供了额外的保护,使其无法超出自己的记忆范围?它会伤害XCode吗?对于如何安全地运行我固有的错误代码,有什么建议吗?我使用OSX10.7,Xcode 4.6。
查看完整描述

4 回答

?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

就ISO C标准(语言的官方定义)而言,访问超出其界限的数组有“未定义行为“.这句话的字面意思是:

使用不可移植或错误的程序结构或错误数据的行为,而本国际标准对此没有任何要求

一份非规范性说明对此作了进一步阐述:

可能的未定义行为包括:完全忽略具有不可预知结果的情况;在翻译或程序执行过程中以具有环境特征的记录方式(有或不发布诊断消息);终止翻译或执行(通过发布诊断消息)。

这就是理论。现实是什么?

在“最好”的情况下,您将访问一些内存,这些内存要么是当前运行的程序拥有的(这可能导致程序不正常),要么是属于当前运行的程序(这可能会导致程序崩溃,比如分段错误)。或者,您可能尝试将程序所拥有的内存写入内存,但这是标记为只读的;这可能还会导致程序崩溃。

这是假设您的程序运行在一个试图保护并发运行的进程来自彼此的操作系统下。如果您的代码运行在“裸金属”上,比如如果它是OS内核或嵌入式系统的一部分,那么就没有这样的保护;您的行为不当的代码应该提供这种保护。在这种情况下,造成损害的可能性要大得多,在某些情况下,包括对硬件(或附近的物品或人员)的物理损坏。

即使在受保护的操作系统环境中,保护也并不总是100%。例如,存在允许非特权程序获得根(管理)访问的操作系统错误。即使具有普通用户权限,故障程序也会消耗过多的资源(CPU、内存、磁盘),可能会导致整个系统瘫痪。许多恶意软件(病毒等)利用缓冲区溢出获取对系统的未经授权的访问。

(一个历史上的例子:我听说在一些旧系统中核心存储器,重复访问紧循环中的单个内存位置实际上会导致内存块融化。其他可能性包括破坏CRT显示器,以及移动磁盘驱动器的读/写头与驱动器柜的谐波频率,导致它走过一张桌子并跌倒在地板上。)

总有一天天网担心。

底线是:如果你能写一个程序来做一些不好的事情。故意,至少从理论上讲,一个bug程序可以做同样的事情。不慎.

实际上,这是非常在MacOSX系统上运行的bug程序不太可能做比崩溃更严重的事情。但不可能完全地防止错误代码做非常糟糕的事情。


查看完整回答
反对 回复 2019-05-30
  • 4 回答
  • 0 关注
  • 758 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信