【现 象】
在接入网主机程序的代码审查中,发现dbquery.c的DBQ_Init_ANType函数中如下代码段缺少应有的条件分支,在数据异常的情况下,会产生较严重的问题。
【处理过程】
该错误比较隐蔽,现在说明如下:
Max2B1QStatTime 最大统计时间
Max2B1QStatPortNum最大统计端口数
MAX_2B1Q_STAT_PSN 最大统计内存分配数量
其中:Max2B1QStatTime(最大统计时间)和Max2B1QStatPortNum
(最大统计 端口数)的乘积不能大于MAX_2B1Q_STAT_PSN
程序如下:
//查询数据库,获得Max2B1QStatTime的值
directQueryCond.tupleNo = 10;
error_code = DB_Query( RID_OTHERS_PARA_INFO, 1,
(LPDBCondition)&directQueryCond,
(BYTE FAR *)&tempstruct0 );
//查询数据库成功
if( error_code == DB_SUCCESS )
{
//tempstruct0.data是数据库中为Max2B1QStatTime配置的值
if ( tempstruct0.data > MAX_2B1Q_STAT_PSN )
Max2B1QStatTime = MAX_2B1Q_STAT_PSN;
else if ( tempstruct0.data != 0 )
Max2B1QStatTime = tempstruct0.data;
}
//查询数据库,获得Max2B1QStatPortNum的值
directQueryCond.tupleNo = 11;
error_code = DB_Query( RID_OTHERS_PARA_INFO, 1,
(LPDBCondition)&directQueryCond,
(BYTE FAR *)&tempstruct0 );
//查询数据库成功
if( error_code == DB_SUCCESS )
{
//tempstruct0.data为数据库中为Max2B1QStatPortNum配置的值,如果其缺省值和Max2B1QStatTime乘积值大于MAX_2B1Q_STAT_PSN的话:
if ( (tempstruct0.data * Max2B1QStatTime) > MAX_2B1Q_STAT_PSN )
Max2B1QStatPortNum = MAX_2B1Q_STAT_PSN / Max2B1QStatTime;
//如果在合理范围内且不为0的话:
else if ( tempstruct0.data != 0 )
Max2B1QStatPortNum = tempstruct0.data;
}
此处if-else if 分支没有判断 值为0的情况,即数据库为Max2B1QStatPortNum配置的值为0: tempstruct0.data == 0,则Max2B1QStatPortNum就为缺省值32。
-
-
xilinxue 发表于 2008/11/6 12:56:33
【结 论】
由于内存限制,Max2B1QStatTime(最大统计时间)和Max2B1QStatPortNum(最大统计端口数)的乘积不能大于MAX_2B1Q_STAT_PSN,
如果从数据库中得到Max2B1QStatTime为MAX_2B1Q_STAT_PSN,而数据库中最大统计端口数恰好为0,由于上述代码没有对tempstruct0.data == 0的情况进行判断,Max2B1QStatPortNum为缺省值32,这样Max2B1QStatTime和Max2B1QStatPortNum乘积已经是32倍MAX_2B1Q_STAT_PSN了,远远超过了设计内存的限制。
造成这种错误的原因是判断语句对条件判断不完整。【思考与启示】
在代码审查时,应该十分注意条件判断的的完备性。好多问题就是因为条件判断不完全造成的。
引用 xilinxue 2008/11/6 12:56:33 发表于2楼的内容