首页
社区
课程
招聘
[原创]坑爹的sizeof和编译器
发表于: 2014-1-5 11:00 6943

[原创]坑爹的sizeof和编译器

2014-1-5 11:00
6943

VC6下
一、原始语句
int Len=0x400;
if(Len>(int)0x201000-0x200fff-sizeof(DWORD)-0x10){
        int a=1;//此句能否执行?
}
答:不能执行
二、就增加了一对括号
int Len=0x400;
if(Len>(int)(0x201000-0x200fff-sizeof(DWORD)-0x10)){
        int a=1;//此句能否执行?
}
答:能执行
坑爹,记录一下.希望大家不要重蹈覆辙:)
可参考:http://www.myexception.cn/c/796237.html


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 5
支持
分享
最新回复 (12)
雪    币: 544
活跃值: (264)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
2
sizeof和编译器坑个毛啊!

你没数对括号!
2014-1-5 11:13
0
雪    币: 288
活跃值: (269)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
呵呵,都能编译过去,括号肯定没问题,就是类型转换的问题,sizeof 返回值似乎是unsigned类型
2014-1-5 11:15
0
雪    币: 63
活跃值: (17)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
sizeof返回值是 size_t
vc6好像是unsigned int
你那一串的减法结果是负数,但被提升成unsigned int当然大于Len.
2014-1-5 11:48
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不管哪个编译器sizeof返回值size_t,带unsigned是肯定的的,
长度可能为0,或正数,什么时候长度可能为负数?
楼主,你要研究sizeof的问题,就应该不应该把sizeof放在一堆加减运算中去测试,
就好比你研究1+1等于几,
你用
1+a-a+a-a+a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a++a-a+1
来测试一样
2014-1-5 12:03
0
雪    币: 288
活跃值: (269)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
[QUOTE=nevergone;1252812]sizeof返回值是 size_t
vc6好像是unsigned int
你那一串的减法结果是负数,但被提升成unsigned int当然大于Len.[/QUOTE]

我在代码最前面加上(int)转换了,但是只是针对0x201000转的,后面后面的加减公式中如果再有unsigned类型的话,整个语句就又变成unsigned类型的了么?
2014-1-5 12:07
0
雪    币: 288
活跃值: (269)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
这是我实际中的一段代码,不是针对sizeof函数的,实际应用中很有可能出现很多类似的求和/求减语句,如果不注意类型转换,就会得到错误的结果.
2014-1-5 12:10
0
雪    币: 357
活跃值: (3393)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
8
[QUOTE=nevergone;1252812]sizeof返回值是 size_t
vc6好像是unsigned int
你那一串的减法结果是负数,但被提升成unsigned int当然大于Len.[/QUOTE]

是这个问题
2014-1-5 12:21
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
9
类型强制转换好像只对后面的对象有用,如果把后面的用()括起来,编译器就会把它当成一个对象了

但我感觉编译器一般会把未确定符号的hex当成有符号的来处理啊0.0
2014-1-5 13:20
0
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
DRIVER_OBJECT   drvObject;

sizeof(DRIVER_OBJECT) != sizeof(drvObject)   结果返回值才不一样,能解释清楚吗?
2014-1-5 15:05
0
雪    币: 967
活跃值: (1138)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
11
大家都是搞逆向的
为什么不用事实来回答这个问题呢
00411387  mov         eax,0CCCCCCCCh 
0041138C  rep stos    dword ptr es:[edi] 
int Len=0x400;
0041138E  mov         dword ptr [Len],400h 
if(Len>(int)0x201000-0x200fff-sizeof(DWORD)-0x10){
00411395  cmp         dword ptr [Len],0FFFFFFEDh 
[COLOR="Red"]00411399  jbe         main+32h (4113A2h) [/COLOR]  int a=1;//此句能否执行?
0041139B  mov         dword ptr [a],1 


0041138C  rep stos    dword ptr es:[edi] 
int Len=0x400;
0041138E  mov         dword ptr [Len],400h 
if(Len>(int)(0x201000-0x200fff-sizeof(DWORD)-0x10)){
00411395  cmp         dword ptr [Len],0FFFFFFEDh 
[COLOR="red"]00411399  jle         main+32h (4113A2h) [/COLOR]  int a=1;//此句能否执行?
0041139B  mov         dword ptr [a],1 


现在清楚了吧
2014-1-5 20:31
0
雪    币: 288
活跃值: (269)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
[QUOTE=elianmeng;1252943]大家都是搞逆向的
为什么不用事实来回答这个问题呢

00411387  mov         eax,0CCCCCCCCh
0041138C  rep stos    dword ptr es:[edi]
int Len=0x400;
0041138E  mov         d...[/QUOTE]

这是为什么呢?
2014-1-5 22:35
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
第二个编译器可以确定一定是有符号数的比较,(int)转换的右侧算术运算的结果,jle用于有符号数比较后条件转移指令,jbe无符号数
2014-1-7 17:07
0
游客
登录 | 注册 方可回帖
返回
//