编译
|
|
调试
|
|
通过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啦。