免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 42693 | 回复: 75
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(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 编辑 ]

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
2 [报告]
发表于 2010-01-28 21:55 |只看该作者
没发现楼主说的问题

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
3 [报告]
发表于 2010-01-28 22:55 |只看该作者

回复 #1 思一克 的帖子

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

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2010-01-28 23:01 |只看该作者
lz老兄,你说的 “全局变量” gi 是什么?能精确的给个定义吗?

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

论坛徽章:
0
6 [报告]
发表于 2010-01-28 23:39 |只看该作者
明显楼主在出题啊,要求我们补全代码

论坛徽章:
0
7 [报告]
发表于 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
8 [报告]
发表于 2010-01-29 08:32 |只看该作者
原帖由 群雄逐鹿中原 于 2010-1-28 23:01 发表
lz老兄,你说的 “全局变量” gi 是什么?能精确的给个定义吗?


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

论坛徽章:
0
9 [报告]
发表于 2010-01-29 08:33 |只看该作者
原帖由 OwnWaterloo 于 2010-1-28 22:55 发表
能说说环境么? 机器和操作系统还有编译器?


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

论坛徽章:
0
10 [报告]
发表于 2010-01-29 11:03 |只看该作者
期待答案。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP