| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1616 人关注过本帖, 1 人收藏
标题:Linux GCC 对数组到底是怎么处理的?
取消只看楼主 加入收藏
q332010372
Rank: 2
等 级:论坛游民
帖 子:52
专家分:61
注 册:2010-7-27
结帖率:44.44%
收藏(1)
已结贴  问题点数:20 回复次数:7 
Linux GCC 对数组到底是怎么处理的?
int main(void)
{
   int arr[5], i;
   for(i = 0; i < 9; i++)
   {
      arr[i] = i;
      printf("i = %d, arr[%d] = %d\n", i, i, arr[i]);
   }
   return 0;
}

当 i < 9 时,运行后并不会出错,但 >=9 时,就会出错。从安全性来说 ,应该要在 i 超过 4 的时候就应该出错了 ,但它并不出错。GCC 到底是怎么处理数组越界这问题的?

搜索更多相关主题的帖子: void 问题 return 安全性 Linux 
2012-04-15 22:49
q332010372
Rank: 2
等 级:论坛游民
帖 子:52
专家分:61
注 册:2010-7-27
收藏
得分:0 
你这文章,我也在网上看过,但是我觉得这是错误的,下面是运行结果:
/*在 ubuntu gcc 上的结果*/
tancen@Tancen:~/mydoc/work/c/try$ ./try
i = 0, arr[0] = 0
i = 1, arr[1] = 1
i = 2, arr[2] = 2
i = 3, arr[3] = 3
i = 4, arr[4] = 4
i = 5, arr[5] = 5
i = 6, arr[6] = 6
i = 7, arr[7] = 7
i = 8, arr[8] = 8
tancen@Tancen:~/mydoc/work/c/try$
如果你看到的文章是正确的,那么 arr[4] 以后的空间是访问不到的,因为已经越界了。另外,还有一件很奇怪的事情,当程序访问 arr[9] 这个位置的时候,终端会提示 “段错误”,根据我的理解,应该是 arr[9] 这个位置,越过了 try 这个程序数据段的边界了。如果我的理解是正确的话,那么,是不是说 linux gcc 根本就不对数组越界进行检测,直到系统强行终止这个异常的程序呢?
2012-04-16 12:45
q332010372
Rank: 2
等 级:论坛游民
帖 子:52
专家分:61
注 册:2010-7-27
收藏
得分:0 
回复 5楼 flyxkj
按照你这样说,那么 GCC 似乎完全不检测数组越界,直到程序出现错误,被系统强行终止。
这是一个噩梦!

int main( void )
{
        int arr[5], i;
        void (*p)(void) = show;
        for( i = 0; i < 6; i++ )
        {
                arr[i] = i * 2;
                printf( "i = %d, arr[%d] = %d\n", i, i, arr[i] );
        }
        p();
        return EXIT_SUCCESS;
}

/* 运行在 ubuntu gcc - 4.6.1 上的结果
i = 0, arr[0] = 0
i = 1, arr[1] = 2
i = 2, arr[2] = 4
i = 3, arr[3] = 6
i = 4, arr[4] = 8
i = 10, arr[10] = 1216787
Hello,World!
*/
2012-04-16 20:15
q332010372
Rank: 2
等 级:论坛游民
帖 子:52
专家分:61
注 册:2010-7-27
收藏
得分:0 
回复 7楼 TonyDeng
编译器是不会在编译期间检查,但是在发生越界的时候,应该要报错才对。这段代码在 windows vs 10.0 里面是会出错的,但在linux gcc 里面并不会出错
2012-04-16 20:49
q332010372
Rank: 2
等 级:论坛游民
帖 子:52
专家分:61
注 册:2010-7-27
收藏
得分:0 
难道因为 vs 是在 debug 之后再生成可执行文件,gcc 本身不存在所谓的 "debug",才需要用到 lint ?
2012-04-16 20:52
q332010372
Rank: 2
等 级:论坛游民
帖 子:52
专家分:61
注 册:2010-7-27
收藏
得分:0 
回复 12楼 TonyDeng
嗯,我只知道,一个C源程序,需要经过 预处理、前端语法和语义分析、后端代码生成、优化、转化为汇编程序、链接载入内存,然后CPU根据CS段,读取指令,执行指令。
windows 用多了,总喜欢用 windows 的习惯来要求 linux, debug 用多了,感觉什么都自带 debug
2012-04-16 21:18
q332010372
Rank: 2
等 级:论坛游民
帖 子:52
专家分:61
注 册:2010-7-27
收藏
得分:0 
回复 14楼 TonyDeng
最近在补汇编,你那有好点的 AT&T 风格的资料吗?初级的
布鲁姆那本特想买,只是已经没得买了,除非去订,不过那价格好贵,网上的PDF太不清晰了,感觉看多了近视又得加深几十度...
2012-04-16 21:33
q332010372
Rank: 2
等 级:论坛游民
帖 子:52
专家分:61
注 册:2010-7-27
收藏
得分:0 
回复 16楼 TonyDeng
当我没问
2012-04-16 21:40
快速回复:Linux GCC 对数组到底是怎么处理的?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013124 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved