登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

windfly's sky

the sky I can fly like the wind

 
 
 

日志

 
 

C++下标越界后  

2017-05-18 10:06:44|  分类: program |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
最近遇到一个很奇怪的问题,在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)
  评论这张
 
阅读(215)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018