Chinaunix首页 | 论坛 | 博客
  • 博客访问: 573890
  • 博文数量: 493
  • 博客积分: 2891
  • 博客等级: 少校
  • 技术积分: 4960
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-17 17:11
文章分类

全部博文(493)

文章存档

2010年(493)

分类:

2010-05-12 18:58:12

1 现象:问题描述
在进行C产品S版本的系统测试时发现,黑名单用户仍然能够正常收发消息。
2 关键过程:根本原因分析
经过单步跟踪代码,分析发现,判断黑名单的函数代码如下:
const unsigned char WHITE_USER_MASK = 0x7F; 
BOOL CSmManager::IsBlackUser(CRegisterUser * pRegiester,
CCdmaRegisterUser * pCdmaRegiester)
{
UC ucUserType;
// 得到用户类型,填到ucUserType变量中。黑名单用户ucUserType最高位为1
if((ucUserType & (~WHITE_USER_MASK)) ==  (~WHITE_USER_MASK) )
{
   return TRUE;
}
return FALSE ;
}
经过分析和单步跟踪发现,if语句判断失效。问题在那里呢?
原来,WHITE_USER_MASK定义为无符号字符型0x7F,但是~WHITE_USER_MASK却是一个4字节有符号类型,其值并不是想当然的0x80,而是0xFFFFFF80,所以在比较时,总是不相等的。
3 结论:解决方案及效果
知道原因以后,解决方法比较简单:定义一个BLACK_USER_MASK = 0x80,只需要判断uUseType & BLACK_USER_MASK是否为0就知道这个用户是否是黑名单用户了。
4 经验总结:预防措施和规范建议
1. 使用~此运算符号时,要谨慎使用,尤其是不要在if条件中直接使用,最好使用一个同类型的中间变量来代替比较。
2. 由此我们应该注意:if条件里面的2个比较对象一定要类型相同。否则很容易犯下错误的。
5 备注
6 考核点
运算符对数据类型的改变
7 试题
对下面这段代码,描述正确的是:C
const unsigned char ucMask = 0x7F;
BOOL test(unsigned char ucUserType)
{
if((ucUserType & (~ucMask)) ==  (~ucMask))
{
   return TRUE;
}
else
     {
return FALSE ;
  }
}
A. 该函数可能返回TRUE,也可能返回FALSE
B. 该函数总是返回TRUE
C. 该函数总是返回FALSE
D. 该函数没有错误
阅读(283) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~