免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ytl
打印 上一主题 下一主题

全局变量的地址为什么会改变? [复制链接]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
81 [报告]
发表于 2010-01-25 15:05 |只看该作者

回复 #80 老手 的帖子

爱学不学,没人学C了,让那些用C开发的公司都tmd倒闭

论坛徽章:
0
82 [报告]
发表于 2010-01-25 17:38 |只看该作者
我遇到过.  是因为其他地方溢出导致的.

论坛徽章:
0
83 [报告]
发表于 2010-01-25 17:45 |只看该作者
唯一能够想到的就是data段的其他地方溢出,而且一直溢到text段了。
存放于text段的内容被修改了?!
传说中的缓冲区溢出,一个string就可以让系统执行制定代码的事情可能让楼主遇到了。

在我这里,只有一些刚到手的很不成熟的开发板和OS能出现这种情况。

论坛徽章:
0
84 [报告]
发表于 2010-01-25 19:19 |只看该作者
大致知道其中原理了
看来要搞明白具体细节,还是要研究汇编指令

论坛徽章:
0
85 [报告]
发表于 2010-01-26 02:47 |只看该作者
全局变量的地址当然是不变的。既然楼主能够重复core dump, 那就很容易找到原因了。

你需要确定全局变量的地址是如何传给printf函数的,最简单的就是列出printf前面的十几条指令。找出第二个参数(GR4)是如何传出的。它应当来源于TOC (GR2)的对应条目,调入临时栈内存或寄存器(决定于优化选项)。如果是栈内存,可能被bug冲掉。

printf("addr = %p, value = %d\n", &global_int, global_int);

论坛徽章:
0
86 [报告]
发表于 2010-01-26 10:41 |只看该作者
AIX 4.1系统。程序是单线程的,大致如下

int global_int = 0;        /*如果是全局变量,应该定义在所有函数外边,这里未能体现出是个全局变量*/

for (int i = 0; ; i++)       /*死循环,暂时不知道退出条件。疑惑中。可能导致global_int越界超过int类型在该系统的最大值*/
{
      printf("addr = %p, value = %d\n", &global_int, global_int);
      global_int++;          /*基本不可能出现int_arr[0]的赋值,在死循环中有可能出现global_int超过int的最大值从而越界,产生不确定行为。最终可能导致global_int地址突然加1,导致global_int的值很大。*/
      int_arr[global_int] = global_int;
      /* other codes */
}

每次都是循环到同一个次数时, global_int地址突然加1,导致global_int的值很大,从而int_arr[global_int]发生内存越界

总的来说我认为不是编译器的问题,应该是编码不严谨而导致越界问题。硬把global_int的值从int可能扩展成为long(个人猜测)所以地址会变。

我是C语言的初学者,不对请指正。

[ 本帖最后由 on-fire 于 2010-1-26 10:44 编辑 ]

论坛徽章:
0
87 [报告]
发表于 2010-01-26 10:42 |只看该作者
编译器的问题不可能。就是越界等起到的破坏作用。

论坛徽章:
0
88 [报告]
发表于 2010-01-26 11:10 |只看该作者

回复 #86 on-fire 的帖子

那只是示意代码,已确定发生问题时i和global_int的值都应该在有效的范围

论坛徽章:
0
89 [报告]
发表于 2010-01-26 11:17 |只看该作者
原帖由 ytl 于 2010-1-26 11:10 发表
那只是示意代码,已确定发生问题时i和global_int的值都应该在有效的范围


从您简略的示范代码中只能看出这样的问题,其它只能看真实的代码了。

论坛徽章:
0
90 [报告]
发表于 2010-01-26 11:58 |只看该作者
AIX 4.1系统。程序是单线程的,大致如下

int global_int = 0;      
for (int i = 0; ; i++)      {
      printf("addr = %p, value = %d\n", &global_int, global_int);
      global_int++;         
      int_arr[global_int] = global_int;  ---这个int_arr,是在哪里定义的?局部变量么?初始大小是多少?建议去掉这一句再跑,跑到global_int超过了int最大值为止,应该是不会出现问题的。
      /* other codes */
}



这个代码本身很不严谨。
一个是死循环。
另外就是,int值不断增加,总会超出表示范围了。
超出范围之后,int_arr,global_int都会有问题。
int_arr的赋值,很容易造成野指针,后续行为不太好定义了。
可以贴出来int_arr的定义位置,方便分析。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP