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

越界访问数组有多危险?

上官高畅
2023-03-14

在数组边界之外访问数组(在C语言中)有多危险?有时会发生这样的情况:我从数组外部读取(我现在明白了,我然后访问程序的其他部分甚至其他部分使用的内存),或者我试图将值设置为数组外部的索引。程序有时会崩溃,但有时只是运行,只会给出意想不到的结果。

现在我想知道的是,这到底有多危险?如果它损害了我的程序,也不是那么糟糕。另一方面,如果它破坏了我程序之外的一些东西,因为我不知何故设法访问了一些完全无关的内存,那么这是非常糟糕的,我想。我读了很多“任何事情都有可能发生”,“分割可能是最不糟糕的问题”,“你的硬盘可能会变成粉红色,独角兽可能会在你的窗户下唱歌”,这些都很好,但真正的危险是什么?

    null

我使用OSX10.7,Xcode4.6。

共有1个答案

郎雪风
2023-03-14

就ISO C标准(语言的官方定义)而言,在数组边界之外访问数组具有“未定义的行为”。这句话的字面意思是:

使用本标准没有要求的不可移植或错误的程序结构或错误的数据时的行为

一个非规范性注释对此进行了扩展:

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

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

(一个历史上的例子:我听说在一些带有核心内存的旧系统上,在一个紧密的循环中反复访问单个内存位置可能会导致该内存块融化。其他可能的情况包括破坏CRT显示器,以及随着驱动器柜的谐波频率移动磁盘驱动器的读/写磁头,导致它穿过桌子并掉到地板上。)

实际上,在MacOS X系统上运行的有缺陷的程序不太可能发生比崩溃更严重的事情。但是不可能完全防止有缺陷的代码做真正糟糕的事情。

 类似资料:
  • 此代码在GCC中编译良好并产生正确的结果。但是,我不确定它是否调用未定义的行为。 谢了!

  • 这里是Java/C开发者。试图学习C语言,但我对数组的内存分配感到困惑。 这里发生了什么? 输出 怎么会这样?为什么我不能越界异常或程序崩溃?我能无限地做到这一点吗?在这种情况下,我的数组长度是多少?如果我的数组允许我将值放在界限之外,那么通过分配内存有什么意义?这对我来说毫无意义。

  • 问题内容: 在我的游戏代码中,我尝试添加一张手牌。一旦我做完了,我的数组就超出了范围。一切看起来都不错,但也许我缺少了一些东西。 仅供参考,一个和两个是Player实例。来自Main类的相关代码(对格式感到抱歉。我很想将其传输到Stack Overflow): 卡类: 玩家等级: 问题答案: 问题出在你的循环上 没有其他任何值可设置,因此此循环不断循环,直到所有玩家拥有超过52张牌为止。一旦某人拥

  • 我使用String[3]数组来存储来自4个JTextFields的用户输入,然后将该数组输出到一个txt文件: 有人能告诉我为什么我会得到异常“数组索引越界”吗?谢谢。

  • 本文向大家介绍请问如何防止数组越界?相关面试题,主要包含被问及请问如何防止数组越界?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 由于数组的元素个数默认情况下是不作为实参内容传入调用函数的,因此会带来数组访问越界的相关问题 防止数组越界: 1)检查传入参数的合法性。 2)可以用传递数组元素个数的方法,即:用两个实参,一个是数组名,一个是数组的长度。在处理的时候,可以判断数组的大小,保证自

  • 本文向大家介绍C++中new的越界访问问题,包括了C++中new的越界访问问题的使用技巧和注意事项,需要的朋友参考一下 今天敲代码的时候发现了一个BUG和大家分享一下,希望大家下次不要犯和我一样的错误。 如果犯了和我一样的错,也能知道自己错在哪里! <(^-^)> 函数如下:(斐波那契数列的实现) 上面的程序有BUG,如果传给函数的参数是0,程序就会因为触发一个断点而崩溃。 单步调试,根据内存窗口