发现一个EVC编译器对自增算符处理时的隐患
2007-04-03 17:41
211 查看
发现点问题,EVC编译器造成的:
EVC4 SP4下,X86的编译器对于那个int*指针表达式从右到左计算,char型的表达式从左到右,晕
ARM下都是一个样,从右向左!
具体参看汇编码:
int* 型表达式,ARM汇编
233: int a[] = {1, 2, 3, 4};
26013FB0 mov r0, #1
26013FB4 str r0, [sp, #8]
26013FB8 mov r1, #2
26013FBC str r1, [sp, #0xC]
26013FC0 mov r0, #3
26013FC4 str r0, [sp, #0x10]
26013FC8 mov r1, #4
26013FCC str r1, [sp, #0x14]
234: int* p = a;
26013FD0 add r0, sp, #8
26013FD4 str r0, [sp]
235: int b = *p + *++p;
26013FD8 ldr r1, [sp]
26013FDC add r0, r1, #4 ; 先给指针加4
26013FE0 str r0, [sp]
26013FE4 ldr r1, [sp]
26013FE8 ldr r0, [r1] ;把加之后的值放入r0
26013FEC ldr r2, [sp]
26013FF0 ldr r1, [r2] ;取加之后的p值
26013FF4 add r3, r0, r1 ;求和
26013FF8 str r3, [sp, #0x18]
int* 型表达式,X86汇编
233: int a[] = {1, 2, 3, 4};
240137D6 mov dword ptr [a],1
240137DD mov dword ptr [ebp-10h],2
240137E4 mov dword ptr [ebp-0Ch],3
240137EB mov dword ptr [ebp-8],4
234: int* p = a;
240137F2 lea eax,[a]
240137F5 mov dword ptr [p],eax
235: int b = *p + *++p;
240137F8 mov ecx,dword ptr [p]
240137FB add ecx,4 ; 先给P增加4
240137FE mov dword ptr [p],ecx
24013801 mov edx,dword ptr [p]
24013804 mov eax,dword ptr [edx] ;把加之后的值放入eax
24013806 mov ecx,dword ptr [p] ;同样是加之后的P值放入ecx
24013809 add eax,dword ptr [ecx] ;求和
2401380B mov dword ptr [b],eax
236:
char* 型表达式,X86汇编
233: char a[] = {1, 2, 3, 4};
240137D6 mov byte ptr [a],1
240137DA mov byte ptr [ebp-7],2
240137DE mov byte ptr [ebp-6],3
240137E2 mov byte ptr [ebp-5],4
234: char* p = a;
240137E6 lea eax,[a]
240137E9 mov dword ptr [p],eax
235: char b = *p + *++p;
240137EC mov ecx,dword ptr [p]
240137EF movsx edx,byte ptr [ecx] ; 先把P值取出
240137F2 mov eax,dword ptr [p]
240137F5 add eax,1 ;再增加1
240137F8 mov dword ptr [p],eax
240137FB mov ecx,dword ptr [p]
240137FE movsx eax,byte ptr [ecx]
24013801 add edx,eax ;把最早保存的值和加1后的加起来
24013803 mov byte ptr [b],dl
236:
char* 型表达式,ARM汇编
233: char a[] = {1, 2, 3, 4};
26013FB0 mov r0, #1
26013FB4 strb r0, [sp, #4]
26013FB8 mov r1, #2
26013FBC strb r1, [sp, #5]
26013FC0 mov r0, #3
26013FC4 strb r0, [sp, #6]
26013FC8 mov r1, #4
26013FCC strb r1, [sp, #7]
234: char* p = a;
26013FD0 add r0, sp, #4
26013FD4 str r0, [sp]
235: char b = *p + *++p;
26013FD8 ldr r1, [sp]
26013FDC add r0, r1, #1 ; 先P地址加1
26013FE0 str r0, [sp]
26013FE4 ldr r1, [sp]
26013FE8 ldrsb r0, [r1]
26013FEC ldr r1, [sp]
26013FF0 ldrsb r2, [r1]
26013FF4 add r1, r2, r0
26013FF8 mov r3, r1, lsl #24
26013FFC mov r0, r3, asr #24
26014000 strb r0, [sp, #8]
不知道是不是微软EVC编译器的问题,从开始编程至今我一直倾向于从右向左 :)
好久没有写BLOG了,一直忙于项目,今天来冒个泡泡
EVC4 SP4下,X86的编译器对于那个int*指针表达式从右到左计算,char型的表达式从左到右,晕
ARM下都是一个样,从右向左!
具体参看汇编码:
int* 型表达式,ARM汇编
233: int a[] = {1, 2, 3, 4};
26013FB0 mov r0, #1
26013FB4 str r0, [sp, #8]
26013FB8 mov r1, #2
26013FBC str r1, [sp, #0xC]
26013FC0 mov r0, #3
26013FC4 str r0, [sp, #0x10]
26013FC8 mov r1, #4
26013FCC str r1, [sp, #0x14]
234: int* p = a;
26013FD0 add r0, sp, #8
26013FD4 str r0, [sp]
235: int b = *p + *++p;
26013FD8 ldr r1, [sp]
26013FDC add r0, r1, #4 ; 先给指针加4
26013FE0 str r0, [sp]
26013FE4 ldr r1, [sp]
26013FE8 ldr r0, [r1] ;把加之后的值放入r0
26013FEC ldr r2, [sp]
26013FF0 ldr r1, [r2] ;取加之后的p值
26013FF4 add r3, r0, r1 ;求和
26013FF8 str r3, [sp, #0x18]
int* 型表达式,X86汇编
233: int a[] = {1, 2, 3, 4};
240137D6 mov dword ptr [a],1
240137DD mov dword ptr [ebp-10h],2
240137E4 mov dword ptr [ebp-0Ch],3
240137EB mov dword ptr [ebp-8],4
234: int* p = a;
240137F2 lea eax,[a]
240137F5 mov dword ptr [p],eax
235: int b = *p + *++p;
240137F8 mov ecx,dword ptr [p]
240137FB add ecx,4 ; 先给P增加4
240137FE mov dword ptr [p],ecx
24013801 mov edx,dword ptr [p]
24013804 mov eax,dword ptr [edx] ;把加之后的值放入eax
24013806 mov ecx,dword ptr [p] ;同样是加之后的P值放入ecx
24013809 add eax,dword ptr [ecx] ;求和
2401380B mov dword ptr [b],eax
236:
char* 型表达式,X86汇编
233: char a[] = {1, 2, 3, 4};
240137D6 mov byte ptr [a],1
240137DA mov byte ptr [ebp-7],2
240137DE mov byte ptr [ebp-6],3
240137E2 mov byte ptr [ebp-5],4
234: char* p = a;
240137E6 lea eax,[a]
240137E9 mov dword ptr [p],eax
235: char b = *p + *++p;
240137EC mov ecx,dword ptr [p]
240137EF movsx edx,byte ptr [ecx] ; 先把P值取出
240137F2 mov eax,dword ptr [p]
240137F5 add eax,1 ;再增加1
240137F8 mov dword ptr [p],eax
240137FB mov ecx,dword ptr [p]
240137FE movsx eax,byte ptr [ecx]
24013801 add edx,eax ;把最早保存的值和加1后的加起来
24013803 mov byte ptr [b],dl
236:
char* 型表达式,ARM汇编
233: char a[] = {1, 2, 3, 4};
26013FB0 mov r0, #1
26013FB4 strb r0, [sp, #4]
26013FB8 mov r1, #2
26013FBC strb r1, [sp, #5]
26013FC0 mov r0, #3
26013FC4 strb r0, [sp, #6]
26013FC8 mov r1, #4
26013FCC strb r1, [sp, #7]
234: char* p = a;
26013FD0 add r0, sp, #4
26013FD4 str r0, [sp]
235: char b = *p + *++p;
26013FD8 ldr r1, [sp]
26013FDC add r0, r1, #1 ; 先P地址加1
26013FE0 str r0, [sp]
26013FE4 ldr r1, [sp]
26013FE8 ldrsb r0, [r1]
26013FEC ldr r1, [sp]
26013FF0 ldrsb r2, [r1]
26013FF4 add r1, r2, r0
26013FF8 mov r3, r1, lsl #24
26013FFC mov r0, r3, asr #24
26014000 strb r0, [sp, #8]
不知道是不是微软EVC编译器的问题,从开始编程至今我一直倾向于从右向左 :)
好久没有写BLOG了,一直忙于项目,今天来冒个泡泡
相关文章推荐
- 今天发现一个Java的关于java.io.File在处理com1到com9为文件名的Bug.
- 一个关于不同编译器对operator++和operator+=的处理方式的问题
- 编程中经常发现使用未初始化变量,编译器原来可以处理进行默认初始化
- 偶然发现一个不错的处理二手计算机技术书籍的网站
- 发现一个OpenGL下NVidia和ATI驱动的纹理处理差异
- 发现一个比较全的处理date格式js类库
- C#编译器优化那点事 c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错 webAPI 控制器(Controller)太多怎么办? .NET MVC项目设置包含Areas中的页面为默认启动页 (五)Net Core使用静态文件 学习ASP.NET Core Razor 编程系列八——并发处理
- 提高linux并发处理能力 91ri.org团队的成员前几天比赛一个比赛时遇到了个题目。题目要求是:对Centos进行优化,以提高它的并发处理能力。当时没搞懂理解清楚是什么意思,回家查了下资料发现原来
- 处理字符串的时候遇到的一个小bug,但是一整天都没发现的bug
- C++对象模型之编译器如何处理函数返回一个对象
- C++对象模型之编译器如何处理函数返回一个对象
- 发现一个很全的java处理时间日期类型的类
- KEIL的ARM编译器对RW和ZI段的一个处理
- A、B两伙马贼意外地在一片沙漠中发现了一处金矿,双方都想独占金矿,但各自的实力都不足以吞下对方,经过谈判后,双方同意用一个公平的方式来处理这片金矿。处理的规则如下:他们把整个金矿分成n段,由A、B开始轮流从最左端或最右端占据一段,直到分完为止。 马贼A想提前知道他们能分到多少金子,因此请你帮忙计算他们最后各自拥有多少金子?(两伙马贼均会采取对己方有利的策略)
- 居然发现了一个VS2012 C编译器 float的一个BUG!!!
- VC7.1 编译器的一个不大不小的bug
- iOS 关于在提交了APP等待审核之后,发现小Bug需要再提一个版本的说明
- 使用vs编译器编译一个简单的dll项目
- 处理了一个以前写的java小程序的异常
- 分享一个 今天发现一个 ckplayer 播放rtmp 问题 问题。