您的位置:控制工程论坛网论坛 » 软件与程序 » 软件编程经典培训实例 8、条件分支处理是否有遗漏

xilinxue

xilinxue   |   当前状态:在线

总积分:16186  2024年可用积分:0

注册时间: 2008-06-26

最后登录时间: 2020-03-22

空间 发短消息加为好友

软件编程经典培训实例 8、条件分支处理是否有遗漏

xilinxue  发表于 2008/11/6 12:56:33      1040 查看 1 回复  [上一主题]  [下一主题]

手机阅读


【现  象】
        在接入网主机程序的代码审查中,发现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。

1楼 0 0 回复
  • xilinxue

    xilinxue   |   当前状态:在线

    总积分:16186  2024年可用积分:0

    注册时间: 2008-06-26

    最后登录时间: 2020-03-22

    空间 发短消息加为好友

    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了,远远超过了设计内存的限制。
             造成这种错误的原因是判断语句对条件判断不完整。


    【思考与启示】
            在代码审查时,应该十分注意条件判断的的完备性。好多问题就是因为条件判断不完全造成的。

    2楼 回复本楼

    引用 xilinxue 2008/11/6 12:56:33 发表于2楼的内容

总共 , 当前 /