首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么现代编译器不能捕捉到对数组进行越界访问的尝试呢?

为什么现代编译器不能捕捉到对数组进行越界访问的尝试呢?
EN

Stack Overflow用户
提问于 2020-04-18 06:58:44
回答 1查看 271关注 0票数 1

如果初始化了int arr5,但存储了5个以上的元素,则额外的元素将在单独的空间中分配内存。像turbo这样的旧编译器在被覆盖时报告崩溃,但现代编译器没有发生这种情况,那么他们如何处理这个问题呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-18 11:23:38

嗯,我搬到重开,所以我想我应该写一些答案:

在一些非常常见的情况下,编译器(或者编译时不可能)检查是否存在越界访问是不可能的。例如,如果数组索引表达式是从输入文件中读取的,或者是使用仅在执行过程中建立的值进行计算的结果,那么在编译器完成其工作后很长时间内就会发生超出范围的访问。

对于运行时系统来说,检查越界访问是一件很麻烦的事情。也就是说,每一次这样的检查都需要计算要访问什么索引,然后检查该索引是否在范围内;所有这些都是在“正常”操作之上的。

要了解这种情况的影响,请使用一个数组操作密集型程序,并在没有运行时边界检查和运行时边界检查的情况下编译它,并比较执行速度。

看来,被广泛使用的语言(如C,C++,Fortran)都决定默认不生成数组边界检查。但是他们的编译器提供了通过数组边界检查来生成代码的选项。

(历史转移:我有一个隐秘的怀疑,在早期的日子里,C会很难在运行时实现数组边界检查,因为它几乎没有区分数组和指针,而且我不确定当代码执行时它总是知道数组边界是什么。另一方面,Fortran使用一个包含数组大小的dope向量。也许是一个比我更有见识的人在这方面纠正我。)

至于为什么一种语言默认在运行时不检查数组边界,而另一种语言默认为检查,这是语言设计人员的问题。

(歇斯底里的转移:我认为默认情况下不检查数组边界可能有两个原因;第一,性能原因;第二,这些语言是由程序员从石头上剪出来的,他们是真正的程序员,他们不需要机器的帮助就可以编写代码。)

你可以选择使用这样一种语言,也可以不使用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61285343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档