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. 该函数没有错误
阅读(290) | 评论(0) | 转发(0) |