分析数组越界时:' 烫'的由来
来源:互联网 发布:单恋东野圭吾知乎 编辑:程序博客网 时间:2024/04/28 08:39
一.问题:以前c语言学习时候,当数组下标越界的时候,总是会出现‘烫烫烫烫烫烫烫’,这个到底是为什么呢?
二.上c语言代码
#include<stdio.h>void main(){char str[30]="apxar";printf("%c%c",str[30],str[31]);}
结果是'烫'
三.汇编代码分析
00401010 >|> \55 push ebp00401011 |. 8BEC mov ebp,esp
00401013 |. 83EC 60 sub esp,0x60 ; 抬高栈顶
00401016 |. 53 push ebx
00401017 |. 56 push esi
00401018 |. 57 push edi
00401019 |. 8D7D A0 lea edi,[local.24]
0040101C |. B9 18000000 mov ecx,0x18
00401021 |. B8 CCCCCCCC mov eax,0xCCCCCCCC
00401026 |. F3:AB rep stos dword ptr es:[edi] ; 以上3步,Debug情况下,会将栈变量初始化为0xcc,当产生异常,则会中断,这里指ebp-60开始的地址
00401028 |. A1 20204200 mov eax,dword ptr ds:[0x422020] ; eax=0x61787061("apxa")
0040102D |. 8945 E0 mov [local.8],eax ; esp-20="apxa"
00401030 |. 66:8B0D 24204>mov cx,word ptr ds:[0x422024] ; cx='r'
00401037 |. 66:894D E4 mov word ptr ss:[ebp-0x1C],cx ; ebp-0x1c='r',以上3步将我们的数组值'apxar'复制到ebp-20地址
0040103B |. B9 06000000 mov ecx,0x6
00401040 |. 33C0 xor eax,eax
00401042 |. 8D7D E6 lea edi,dword ptr ss:[ebp-0x1A]
00401045 |. F3:AB rep stos dword ptr es:[edi] ; 将栈中数组值apxar后的值,清0,所以当访问数组下标内的值时,当未初始化,则为0
00401047 |. 0FBE55 FF movsx edx,byte ptr ss:[ebp-0x1]
0040104B |. 52 push edx ; /<%c>
0040104C |. 0FBE45 FE movsx eax,byte ptr ss:[ebp-0x2] ; |
00401050 |. 50 push eax ; |<%c>
00401051 |. 68 28204200 push test.00422028 ; |format = "%c%c"
00401056 |. E8 75000000 call test.printf ; \printf
三.
1.我们查看下当执行到
地址00401047 |. 0FBE55 FF movsx edx,byte ptr ss:[ebp-0x1]时,栈的情况:
EBP-60 > CCCCCCCC 烫烫
EBP-5C > CCCCCCCC 烫烫
EBP-58 > CCCCCCCC 烫烫
EBP-54 > CCCCCCCC 烫烫
EBP-50 > CCCCCCCC 烫烫
EBP-4C > CCCCCCCC 烫烫
EBP-48 > CCCCCCCC 烫烫
EBP-44 > CCCCCCCC 烫烫
EBP-40 > CCCCCCCC 烫烫
EBP-3C > CCCCCCCC 烫烫
EBP-38 > CCCCCCCC 烫烫
EBP-34 > CCCCCCCC 烫烫
EBP-30 > CCCCCCCC 烫烫
EBP-2C > CCCCCCCC 烫烫
EBP-28 > CCCCCCCC 烫烫
EBP-24 > CCCCCCCC 烫烫
EBP-20 > 61787061 apxa
EBP-1C > 00000072 r...
EBP-18 > 00000000 ....
EBP-14 > 00000000 ....
EBP-10 > 00000000 ....
EBP-C > 00000000 ....
EBP-8 > 00000000 ....
EBP-4 > CCCC0000 ..烫
EBP ==> >/0018FF88 ?.
可见[ebp-1]即为0xCC,此处即为str[31]
2.当执行到
地址0040104C |. 0FBE45 FE movsx eax,byte ptr ss:[ebp-0x2] 时,[ebp-0x2]即为0xcc,此处 即为str[30]
四.结果.printf("%c%c",0xcc,0xcc);即为烫
五.总结,当在debug模式下,由于栈变量被初始化为0xcc,当数组下标溢出时,访问到0xcc 0xcc,输出时,则为 烫,当然还有可能是其他的值~
- 分析数组越界时:' 烫'的由来
- 两道“诡异”的数组越界问题的分析
- 郁闷的数组越界
- C++字符数组越界问题的一个案例分析
- Debug模式下的数组越界访问结果分析
- 数组越界的深入思考
- 数组越界的一点心得
- 关于数组的越界问题
- 数组越界的内存分配
- 数组变量的越界特征
- 隐蔽的数组越界问题
- 数组越界的另一问题
- 运行时处理数组越界
- 数组越界
- 数组越界
- 数组越界
- 数组越界??
- 数组越界
- 魅族MX2 V4音效失效解决办法
- PL/SQL报错:无法解析指定的连接标识符
- 面向 Android* 设备的英特尔® USB 驱动程序
- Robots协议乃是互联网垄断的潜规则
- Rss订阅对你的网站搜索表现有好处吗?
- 分析数组越界时:' 烫'的由来
- ScribeFire:firefox下完美博客编辑插件
- Java 并发和多线程向导(2)
- Hibernate-二级缓存
- Asp.Net中索引器的介绍
- LeetCode 117 Populating Next Right Pointers in Each Node II
- route命令添加删除默认路由
- ASP.NET页面间传值的几种方式
- Eclipse的SVN插件(Subclipse)历史版本乱码的问题