就ISO C标准(语言的官方定义)而言,访问超出其界限的数组有“未定义行为“.这句话的字面意思是:
使用不可移植或错误的程序结构或错误数据的行为,而本国际标准对此没有任何要求
一份非规范性说明对此作了进一步阐述:
可能的未定义行为包括:完全忽略具有不可预知结果的情况;在翻译或程序执行过程中以具有环境特征的记录方式(有或不发布诊断消息);终止翻译或执行(通过发布诊断消息)。
这就是理论。现实是什么?
在“最好”的情况下,您将访问一些内存,这些内存要么是当前运行的程序拥有的(这可能导致程序不正常),要么是不属于当前运行的程序(这可能会导致程序崩溃,比如分段错误)。或者,您可能尝试将程序所拥有的内存写入内存,但这是标记为只读的;这可能还会导致程序崩溃。
这是假设您的程序运行在一个试图保护并发运行的进程来自彼此的操作系统下。如果您的代码运行在“裸金属”上,比如如果它是OS内核或嵌入式系统的一部分,那么就没有这样的保护;您的行为不当的代码应该提供这种保护。在这种情况下,造成损害的可能性要大得多,在某些情况下,包括对硬件(或附近的物品或人员)的物理损坏。
即使在受保护的操作系统环境中,保护也并不总是100%。例如,存在允许非特权程序获得根(管理)访问的操作系统错误。即使具有普通用户权限,故障程序也会消耗过多的资源(CPU、内存、磁盘),可能会导致整个系统瘫痪。许多恶意软件(病毒等)利用缓冲区溢出获取对系统的未经授权的访问。
(一个历史上的例子:我听说在一些旧系统中核心存储器,重复访问紧循环中的单个内存位置实际上会导致内存块融化。其他可能性包括破坏CRT显示器,以及移动磁盘驱动器的读/写头与驱动器柜的谐波频率,导致它走过一张桌子并跌倒在地板上。)
总有一天天网担心。
底线是:如果你能写一个程序来做一些不好的事情。故意,至少从理论上讲,一个bug程序可以做同样的事情。不慎.
实际上,这是非常在MacOSX系统上运行的bug程序不太可能做比崩溃更严重的事情。但不可能完全地防止错误代码做非常糟糕的事情。