首页
社区
课程
招聘
看不懂一个宏
发表于: 2013-2-10 16:49 3199

看不懂一个宏

2013-2-10 16:49
3199
看ReactOS代码时,发现了这个宏,但看不太懂 希望各位高手赐教。
#define ProbeForReadGenericType(Ptr, Type, Default)                            \
    (((ULONG_PTR)(Ptr) + sizeof(Type) - 1 < (ULONG_PTR)(Ptr) ||                \
(ULONG_PTR)(Ptr) + sizeof(Type) - 1 >= (ULONG_PTR)MmUserProbeAddress) ?   \
     ExRaiseAccessViolation(), Default :                     \
     *(const volatile Type *)(Ptr))

(((ULONG_PTR)(Ptr) + sizeof(Type) - 1 < (ULONG_PTR)(Ptr)  这里是什么意思?没看明白.

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

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 2120
活跃值: (73)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
(ULONG_PTR)(Ptr) + sizeof(Type) - 1 < (ULONG_PTR)(Ptr) 表示ptr指向的地址+该类型的大小已经超出内存大小了
2013-2-10 17:17
0
雪    币: 50
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
嗯 书上也说的是这个意思 但不太理解为什么是这样?
2013-2-10 18:44
0
雪    币: 2120
活跃值: (73)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
溢出了呀
2013-2-10 19:03
0
雪    币: 115
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
正如楼上所说的,地址溢出的一种检测方式。

不如基地址是0xFFFFFFF0;但是一个数组长度为0x20,如果获取数组的末尾,那么计算方法就是0xFFFFFFF0+0x20=0x00000010<0xFFFFFFF0,很显然是不正确的。

用通俗的话说,加上一个自然数,结果却比原来的数小,这是不可饶恕的错误----溢出。

至于为什么减1,估计是为了检测某些边界情况的原因吧。

这段宏应该是判断指针是否在一个有效范围内,如果不在则抛出错误,否则返回指针。
2013-2-10 19:34
0
游客
登录 | 注册 方可回帖
返回
//