C++下标越界后
2017-05-18 10:06:44| 分类:
program
| 标签:
|举报
|字号大中小 订阅
最近遇到一个很奇怪的问题,在arm-linux下发现一个bug,用windows版验证也有这个问题,后来查到原因是下标错了,多加了1,后来修复了这个bug。可是测试人员在验证新版本时告诉我,原版本没有这个问题。后来了解到,该测试人员测试的额x86-linux版本。确实没有出现这个bug。这就奇怪了,肯定是用错了,肯定是下标加了个1。怎么会没问题呢。
遇到的bug抽象出来的示例代码如下:
#include <stdio.h>
bool aa[5]={false,false,true,false,true};
bool bb[5]={true,true,true,true,true};
int main()
{
if(aa[5])
printf("true\n");
else
printf("false\n");
getchar();
return 0;
}
这段代码运行后结果是什么呢?
这里的错误在于aa变量下标越界了,运行后的结果却有点出人意料。
在windows下编译后运行,结果为false
在arm-linux下编译运行,结果为false
这两个就是我的程序出现bug的现象,本来想用aa[4],结果用成了aa[5],所以结果不是true。
但是,在x86-linux下编译运行,结果是true。这也就是测试人员为什么告诉我原版本没有问题的原因。结果是true啊。
冷静下来分析了一下。用了下面的测试代码运行后就一目了然了。
#include <stdio.h>
bool aa[5]={false,false,true,false,true};
bool bb[5]={true,true,true,true,true};
int main()
{
for(int i=0;i<20;i++)
printf("aa[%d]=%d\n",i,aa[i]);
getchar();
return 0;
}
下面是windows下和arm-linux下运行的结果
aa[0]=0
aa[1]=0
aa[2]=1
aa[3]=0
aa[4]=1
aa[5]=0
aa[6]=0
aa[7]=0
aa[8]=1
aa[9]=1
aa[10]=1
aa[11]=1
aa[12]=1
aa[13]=0
aa[14]=0
aa[15]=0
aa[16]=0
aa[17]=0
aa[18]=0
aa[19]=0
而在x86-linux下的运行结果如下:
aa[0]=0
aa[1]=0
aa[2]=1
aa[3]=0
aa[4]=1
aa[5]=1
aa[6]=1
aa[7]=1
aa[8]=1
aa[9]=1
aa[10]=0
aa[11]=0
aa[12]=0
aa[13]=0
aa[14]=0
aa[15]=0
aa[16]=0
aa[17]=0
aa[18]=0
aa[19]=0
不同的编译器对于全局变量的存储方式是不同的,windows各个数组是字节对齐的,而x86-linux却是紧密排列的,所以第一个数组越界的指针指向了第二个数组。
ps,各个平台下编译器版本:
windows下vs2010
编译arm-linux的编译器版本arm-linux-gnueabi-g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
编译x86-linux的编译器版本g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-17)
评论这张
转发至微博
转发至微博
评论