最近因为算法转码的工作,在转码的过程中多次遇到一个数组越界但在我的pc上运行不报错的bug,但是当把demo给到软件人员时,就碰到了这个问题,以至于在自己pc上调试时没有发现问题,所以记录下这个常见bug,虽然很low的错误,但也值得记录。
bug如下:
但其实很容易发现是由于当i=width-1时,data会取到data[-1]。
不报错的原因在于
-
数组作为更大内存区域的一部分:如果数组是某个较大内存分配的一部分,而该内存区域之前有有效的数据,那么访问
data[-1]
可能会意外地返回那个位置的数据,但这依然是未定义行为。 -
编译器优化:某些编译器在优化模式下可能对代码进行调整,有时候这种调整可能会掩盖了访问越界的问题,但这不改变访问是非法的本质。
-
硬件特性:某些硬件架构可能允许对内存的非合法地址访问而不立即引发错误,但这不是C++语言规范所保证的,且在不同的系统上表现可能不同。