免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 39511 | 回复: 76

一个所谓的全局变量地址改变的例子 [复制链接]

论坛徽章:
0
发表于 2010-01-28 21:52 |显示全部楼层

  1. #include <stdio.h>

  2. int gi = 1;

  3. f()
  4. {
  5. int i;

  6.   /×
  7.   这里添加几行代码,不准有输出信息的任何代码,然后打开注释。  
  8.   ×/

  9.   for(i = 0; i < 256; i++) {
  10.     printf("addr = %p value = %d\n", &gi, gi);
  11.   }
  12. }

  13. main()
  14. {
  15.   f();
  16. }

复制代码


要求在注释那里添加几行代码以改变输出,使得输出显示了全局地址和数值都被++这样的:

addr = 0x804a014 value = 1
addr = 0x804a014 value = 1
addr = 0x804a014 value = 1
...
...
...
addr = 0x804a014 value = 1
addr = 0x804a014 value = 1
addr = 0x804a014 value = 1
addr = 0x804a018 value = 2
Segmentation fault


【受另一贴启发,但那个帖子未必和这个一样。因为看不到真实的代码】

[ 本帖最后由 思一克 于 2010-1-28 21:55 编辑 ]

论坛徽章:
0
发表于 2010-01-28 21:55 |显示全部楼层
没发现楼主说的问题

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
发表于 2010-01-28 22:55 |显示全部楼层

回复 #1 思一克 的帖子

能说说环境么? 机器和操作系统还有编译器?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2010-01-28 23:01 |显示全部楼层
lz老兄,你说的 “全局变量” gi 是什么?能精确的给个定义吗?

论坛徽章:
0
发表于 2010-01-28 23:16 |显示全部楼层
全局变量的地址还能变?值能变是肯定的,根据编译器编译后的内存布局,可以在f中找到gi的位置,但是改变地址,该咋做呢?

论坛徽章:
0
发表于 2010-01-28 23:39 |显示全部楼层
明显楼主在出题啊,要求我们补全代码

论坛徽章:
0
发表于 2010-01-29 00:22 |显示全部楼层
原帖由 cugb_cat 于 2010-1-28 23:16 发表
全局变量的地址还能变?值能变是肯定的,根据编译器编译后的内存布局,可以在f中找到gi的位置,但是改变地址,该咋做呢?


我举个极端的例子:

fflush函数部分代码 , gcc编译 , powerpc架构


.text0:8001DB78                 .long 0x34804
.text0:8001DB7C
.text0:8001DB7C fflush:                                                                        
.text0:8001DB7C
.text0:8001DB7C .set var_10, -0x10
.text0:8001DB7C .set var_C, -0xC
.text0:8001DB7C .set var_8, -8
.text0:8001DB7C .set var_4, -4
.text0:8001DB7C .set arg_4,  4
.text0:8001DB7C
.text0:8001DB7C                 stwu    %sp, -0x20(%sp)
.text0:8001DB80                 mflr    %r0
.text0:8001DB84                 stw     %r28, 0x20+var_10(%sp)
.text0:8001DB88                 stw     %r29, 0x20+var_C(%sp)
.text0:8001DB8C                 stw     %r30, 0x20+var_8(%sp)
.text0:8001DB90                 stw     %r31, 0x20+var_4(%sp)
.text0:8001DB94                 stw     %r0, 0x20+arg_4(%sp)
.text0:8001DB98                 bl      loc_8001DB9C
.text0:8001DB9C
.text0:8001DB9C loc_8001DB9C:
.text0:8001DB9C                 mflr    %r30                     
.text0:8001DBA0                 lwz     %r0, -0x24(%r30)         
.text0:8001DBA4                 add     %r30, %r0, %r30           
.text0:8001DBA8                 mr.     %r31, %r3
.text0:8001DBAC                 bne     loc_8001DBC4
.text0:8001DBB0                 lwz     %r9, -0x8000(%r30)   
.text0:8001DBB4                 lwz     %r4, -0x7FFC(%r30)

红色部分为"全局变量" . r30的值 - 0x8000 的结果就是全局变量的"地址".
原本r30的值是不变 , 也就是全局变量的"地址"是不变的 , 它是在代码段中.

但某种情况下 , 如果r30的值被修改了(可以办到) , 那么本来不可能的情况就出现了.

论坛徽章:
0
发表于 2010-01-29 08:32 |显示全部楼层
原帖由 群雄逐鹿中原 于 2010-1-28 23:01 发表
lz老兄,你说的 “全局变量” gi 是什么?能精确的给个定义吗?


全局变量是和栈变量相对而言的。在数据区的就是全局的。
比如所有函数外的变量。
比如函数内的带static前缀的。

论坛徽章:
0
发表于 2010-01-29 08:33 |显示全部楼层
原帖由 OwnWaterloo 于 2010-1-28 22:55 发表
能说说环境么? 机器和操作系统还有编译器?


什么系统都差不多。但添加的程序可能有区别。
我的是在LINUX 32BIT GCC

论坛徽章:
0
发表于 2010-01-29 11:03 |显示全部楼层
期待答案。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP