开发者社区> 问答> 正文

超出范围访问数组有多危险?

在数组边界之外(在C中)访问数组有多危险?有时可能会发生从数组外部读取的错误(我现在知道我访问了程序其他部分甚至更多的内存),或者试图为数组外部的索引设置值。该程序有时会崩溃,但有时只能运行,只会产生意想不到的结果。

现在我想知道的是,这到底有多危险?如果它破坏了我的程序,那还不错。另一方面,如果它由于我设法以某种方式设法访问了一些完全不相关的内存而破坏了程序外部的某些内容,那么我想这是非常糟糕的。我读到很多“可能发生的事情”,“分割可能是最不严重的问题”,“您的硬盘可能变粉并且独角兽可能正在您的窗户下面唱歌”,这一切都很好,但是真正的危险是什么?

我的问题:

从程序外读取值是否会破坏程序以外的任何内容?我会想象只是看东西并不会改变任何东西,还是会例如改变我碰巧到达的文件的“上次打开时间”属性? 设置值超出数组范围是否会破坏程序以外的任何内容?从这个 堆栈溢出问题可以看出,可以访问任何内存位置,并且没有安全保证。 现在,我从XCode运行我的小程序。这样可以在程序无法到达其自身内存之外的程序周围提供一些额外的保护吗?会伤害XCode吗? 关于如何安全运行我的固有错误代码的任何建议? 我使用OSX 10.7,Xcode 4.6。

展开
收起
保持可爱mmm 2020-01-16 15:55:33 945 0
1 条回答
写回答
取消 提交回答
  • 就ISO C标准(语言的正式定义)而言,访问其边界之外的数组具有“ 未定义的行为 ”。其字面意思是:

    在使用非便携式或错误程序构造或错误数据时的行为,对此国际标准不施加任何要求

    一个非规范性的注释扩展了这一点:

    可能的不确定行为范围从完全忽略具有无法预测结果的情况到在翻译或程序执行过程中以环境特征记录的方式表现(带有或不带有诊断消息)到终止翻译或执行(带有发布)诊断消息)。

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

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

    假设您的程序在一个试图保护彼此并发运行的进程彼此之间的操作系统下运行。如果您的代码在“裸机”上运行,比如说它是OS内核或嵌入式系统的一部分,则没有这种保护;您行为不当的代码就是应该提供这种保护的内容。在这种情况下,损坏的可能性会更大,包括在某些情况下对硬件(或附近的东西或人)的物理损坏。

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

    (一个历史示例:我听说过,在一些带有核心内存的旧系统中,在紧密循环中重复访问单个内存位置可能确实导致该内存块融化。其他可能性包括破坏CRT显示器和移动读取的内容。 /写入磁盘驱动器磁头,使其具有驱动器柜的谐波频率,从而使其滑过桌子并掉落在地板上。)

    而且总是有天网需要担心。

    底线是:如果您可以编写一个程序来故意做一些不好的事情,那么从理论上讲,一个有缺陷的程序至少有可能偶然地做同样的事情。

    在实践中,这是非常不可能的,你与MacOS X系统上运行错误的程序会做什么比暴跌更加严重。但是,不可能完全防止错误的代码做真正的坏事。 问题来源于stack overflow

    2020-01-16 15:55:44
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载