访问"越界"解释与编译语言中的索引

时间:2015-06-27 06:41:12

标签: c matlab interpreted-language

在编译的编程语言(如C)和解释语言(如MATLAB)之间访问越界(否定或其他不可访问)索引有什么区别?

根据本网站的建议,我研究了一些关于访问越界索引的线索。但是,大多数这些线程只关注解决源问题。也就是说,我已经能够从这个网站获取访问一个越界索引,同时使用C导致未定义的行为。通过使用MATLAB进行实验,我猜测解释语言会执行测试以确定索引是否应该不可访问并且" catch"在访问越界索引之前写得不好的代码。一般情况下这是解释性语言的情况吗,或者它们与C(编译)语言类似,会导致出现一定程度的未定义行为吗?访问任何编译语言的程序中的越界索引是否会导致未定义的行为?

1 个答案:

答案 0 :(得分:0)

有些语言将其作为实现“详细信息”,而其他语言则明确指出了预期的行为......但随着时间的推移,这种语言已经发生了变化。

关于C,在数组中使用负索引是完全合法的(也是有用的),即使这可能导致崩溃或代码/数据损坏(有意或无意),因为C试图不将您的能力限制为程序员。如果您知道如何实现C语言,那么对于错误寻址的基于堆栈或基于malloc的内存块将会发生什么,并没有太多的确定性。 C编译器可能在编译期间发出警告以帮助防止错误(无意义的负数组索引)。

其他语言决定程序员并尝试在编译时(PASCAL是一个很好的旧例子)或执行时(JIT,VM等)阻止这些操作。除非语言规范定义了特定的行为,否则没有一般规则。

即使在C中,您也可以使用多种方法来防止意外损坏,例如围绕阵列内存块的guardian memory areas。然后可以通过信号处理程序处理故障。

由于大多数其他语言都依赖于C / C ++实现,因此这也是“更现代”的编程语言如何处理这些问题(负数组索引)作为规范或实现的一部分。也可以使用负数组索引的测试,但性能会受到影响。

C#或Java变量比C中占用更多空间,因为它们分配更多信息(锁,垃圾收集,监护区等),而C变量的浪费空间可能仅在未更改默认行为时由对齐产生通过程序员更复杂的东西。