编译
|
|
调试
|
|

通过list命令,可以显示出部分源代码,我们选择在源代码的第9行处下断点。
通过print命令,可以查看变量的值,因为数组名已知,可以如下打印出数组的内容。可以发现,在还没有初始化或者赋值前,数组内容是随机化(或者说是垃圾数据)。
此时程序运行到第9行附近,可以再次通过list命令显示其附近的源代码。
这里为了方便,我们在第11,12,15行下下断点,分别对应两个array_fill_with() 函数 和 array_add()函数。
接下来单步调试,命令是
|
|
此时在执行完第11行的array_fill_with(),即已经完成了对数组vector_a的赋值后,我们查看下三个数组的值。

数组vector_a全被赋值为10在意料之中(0xa == 10 ),但注意数组vector_b的第一个元素也被赋值为0xa了。在前面可知,数组vector_b的第一个元素原本是0xff00。所以这边可能产生了一个越界。
下一条语句是对数组vector_b进行赋值,这次我们选择进入函数array_fill_with(),即进行step into,gdb中相应的命令为:

由上图,通过list命令,可知我们已经进入到了array.c中的第七行,正在进行一个循环。其中变量length的值为0x10,即为16。
我们知道,在C语言中,数组下标是从0开始的,这里也就解释了为什么我们再对数组vector_a赋值完后,数组vector_b的第一个元素也被改变了。
接下来我们继续运行程序,命令为:
此时,已经完成了对数组vector_b的赋值,我们可以推测数组vector_c的第一个元素也会被从原先的 0x0 改为 0x37。事实证明,推测是正确的,见下图:

Bug
其实重点就一个,C语言中数组下标从0开始的。
把array.c中的i <= length 改为 i < length就ok啦。