下面列举的是Klockwork告警中常见的告警形式,这些情况在编译阶段都不会报出来语法上的错误,并且在运行阶段执行到的概率很小。但是在某些场景下一旦执行到了这些语句, 很可能引起进程的跑飞和挂起。

 
1、没有对所有入参指针做有效性检查
WORD32 Test(WORD32 *p,WORD32 *q)
{
    WORD32 dwBindType = 0;
    if ((NULL == p) ||(NULL == q))
    {
        SF_ASSERT(0);
        return SFWD_ERROR;
    }
    return SFWD_OK;
}
 
编程规范要求,所有入参是指针,都必须进行判空操作;如果是入参是整型等,可以根据需要决定是否对入参进行检查;但参数不合法都要做异常处理;
 
2、函数中的异常处理缺少返回值
WORD32 Test(WORD32 *p, WORD32 *q)
{
    WORD32 dwBindType = 0;
    if ((NULL == p) || (NULL == q))
    {
        SF_ASSERT(0);
       return SFWD_ERROR;        //导致与预期返回的结果不符
    }
    return SFWD_OK;
}
 
断言需要做异常处理的,并不是断言就完事了,如果tr掉,继续往下走,可能会出现跑飞或单板重启等严重问题;
在release版本,断言是被忽略的;debug版本,适当增加断言,当出现异常时,容易定位问题。
 
3、函数在异常退出前务必要释放先前申请的内存
SOCK_PKTINFO* Test(WORD32 dwReplyType)
{
    BYTE *pValidatePkt = NULL;
    SOCK_PKTINFO *pPktInfo = NULL;
 
    pValidatePkt = (BYTE *)XOS_GetUB(VER_REPLY_PKTLEN);
    if (NULL == pValidatePkt)
    {
        ROSNG_TRACE_ERROR("Error: XOS_GetUB failed!\n");
        return NULL;
    }
    MEMSET(pValidatePkt, 0, VER_REPLY_PKTLEN);
 
    if (TOPO_REPLY_OK == dwReplyType)
    {
        MEMCPY(&pValidatePkt[4], "YES", 4);
    }
    else
    {
        SF_ASSERT(0);
        XOS_RetUB(pValidatePkt);
        return NULL;
    }
    return pPktInfo;
}
 
这段代码其实有几个问题:
1.没有遵守谁申请谁释放的原则,C语言很容易出现内存泄漏,但遵守规范,这种泄漏就会少很多;
  除了申请的内存需要缓存而不是在一个消息中释放外(比如分片组包的情况),报文处理中基本上可以做到谁申请谁释放;
2.在异常流程,没有释放内存,这个是非常容易犯的错误;
3.如果是临时申请内存,应该使用PUB_GetLocalUB/PUB_RetLoacalUB这对接口;
 
 
4、函数内对空指针进行引用操作
VOID Test(SFWD_NBR_INFO *pNbrInfo)
{
    WORD32 *pIndex= NULL;
 
    if(NULL == pNbrInfo)
    {
        ROSNG_TRACE_ERROR("Error: Para is NULL!\n");
        SF_ASSERT(0);
        return;
    }
 
    if(0 == pNbrInfo->wActiveNbrNum)
    {
       pIndex= sfwd_node_new(sizeof(WORD32));
        if(NULL == pIndex)
        {
            ROSNG_TRACE_ERROR("Error: sfwd_node_new return NULL!\n");
            return;
        }
        *pIndex= pVifInfo->dwIndex;
       
    }
    XOS_RawPrint("gIndex = %d, pNbrInfo->dwNbrStatus = %d\n", *pIndex, pNbrInfo->dwNbrStatus);
   //这里如果没有执行上面if语句内的代码,就会导致对空指针进行操作;
    return;
}
 
不管是打印还是语句,只有是访问指针指向的内容,先想想这个指针有没有为空或非法地址的情况;
 
5、函数中数组操作的越界访问
WORD32 Test(SFWD_TOPO_PKT_CAP_IF_INFO_T *pIfInfo, WORD32 gIndex)
{
    WORD32 dwSubslot = 0;
    WORD32 dwSubindex = 0;
    WORD16 if_type = 0;
 
    if (NULL == pIfInfo)
    {
        ROSNG_TRACE_ERROR("sfwd_topo_pkt_cap_get_ifinfo: inParam is NULL!\n");
        SF_ASSERT(0);
        return FALSE;
    }
 
    if ((gIndex <= 0))
    {
        ROSNG_TRACE_ERROR("sfwd_topo_pkt_cap_get_ifinfo: Para error!\n");
        SF_ASSERT(0);
        return FALSE;
    }
 
   dwSubslot= gIndex / MAX_IF_NUMBER_PERCARD;
   dwSubindex= gIndex % MAX_IF_NUMBER_PERCARD;
    if((dwSubslot >= MAX_SUBCARD_NUMBER) || (dwSubindex > MAX_IF_NUMBER_PERCARD))  
    {
        ROSNG_TRACE_WARNING("sfwd_topo_pkt_cap_get_ifinfo: invalid subslot or subindex.\n");
        SF_ASSERT(0);
        return FALSE;
    }
   if_type = gInterface[dwSubslot][dwSubindex].wType;
   //在对gInterface数组进行访问时,如果dwSubslot、dwSubindex的下标值超出了该数组声明的大小可能产生越界。所以,需要根据代码的上下文来对数组的下标做有效性检查(并不是所有的数组访问都检查,有些是没必要的)
    return TRUE;
}
 
#define SFWD_SUBCARD_NO_CHECK(A, B)    ((A >= MAX_SUBCARD_NUMBER) || (B > MAX_IF_NUMBER_PERCARD))
 
数组越界也是经常犯的错误,对数组的访问,加一下检查;考虑到会频繁出现数组下标的检查,可以写一个类似上面的宏;

转载于:https://www.cnblogs.com/wanghaoran/p/3690879.html

Klockwork告警常见错误相关推荐

  1. make的常见错误信息

    本文对make执行时可能出现常见错误进行汇总.分析,并给出修正的可能方法. make执行过程中所产生错误并不都是致命的:特别是在命令行之前存在"-".或者make使用"- ...

  2. Makefile的常见错误信息

     转载:http://blog.csdn.net/wanruirui/article/details/5894780 本章是对 make 执行过程中可能出现常见错误进行汇总.分析,并给出修正的可能 ...

  3. mysql主从同步常见错误以及解决方法总结

    前言 在发生故障切换后,经常遇到的问题就是同步报错,数据库很小的时候,dump完再导入很简单就处理好了,但线上的数据库都150G-200G,如果用单纯的这种方法,成本太高,故经过一段时间的摸索,总结了 ...

  4. Golang 要注意的陷阱和常见错误

    原文: 50 Shades of Go: Traps, Gotchas, and Common Mistakes for New Golang Devs 翻译: Go的50度灰:新Golang开发者要 ...

  5. Python运行的17个时新手常见错误小结

    Python运行的17个时新手常见错误小结 1 发布时间:『 2017-11-04 11:20 』     帖子类别:『人工智能』  阅读次数:8803 (本文『Python运行的17个时新手常见错误 ...

  6. 极客新闻——16、数据库设计中的5个常见错误

    本文笔记全部来自<极客新闻>--新鲜的技术资讯.权威的趋势剖析.别样的技术洞察 本文作者总结了数据库设计中的5个常见错误,以供开发人员参考. 1.糟糕的预规划 好的数据库是深思熟虑的结果, ...

  7. 构建微服务时的三大常见错误

      来自:分布式实验室 公众号,作者:解博 想在网上挨骂,最简单的方法就是写点关于微服务架构的东西.每个人对微服务都有自己的一套见解:无论我们是赞扬还是批评,总会有人跳出来强调"你错了&qu ...

  8. 稳定性专题 | Spring Boot 常见错误及解决方法

    导读 『StabilityGuide』是阿里多位阿里技术工程师共同发起的稳定性领域的知识库开源项目,涵盖性能压测.故障演练.JVM.应用容器.服务框架.流量调度.监控.诊断等多个技术领域,以更结构化的 ...

  9. 机器学习“七宗罪”:影响可信度的七个常见错误

    机器学习是一个伟大的工具,它正在改变我们的世界.在许多优秀的应用中,机器学习(尤其是深度学习)比传统方法优越得多.从用于图像分类的Alex-Net到用于图像分割的U-Net,人们看到了计算机视觉和医学 ...

最新文章

  1. casperjs 安装试用
  2. javaweb:servlet的多线程同步问题
  3. python——迭代器
  4. python PyQt5 QFrame类
  5. python中的作用域_python作用域
  6. 用PMML实现机器学习模型的跨平台上线
  7. MATLAB库函数resample(重新采样序列)的C语言实现
  8. 素数环 与 算法 全排列
  9. Linux驱动中相关函数查询
  10. 怎么用虚拟机安装Windows XP?
  11. 历时三月,致远互联从“鸟巢”飞到哪了?
  12. Android之路——第一个上线 APP项目总结
  13. scipy中使用linalg.inv函数计算矩阵的逆矩阵
  14. 电脑端微信可以打开微信小程序了
  15. 盘一盘 Python 系列 - Cufflinks (下)
  16. 让机器认知中文实体 — 复旦大学知识工场发布中文实体识别与链接服务
  17. K8S之pod生命周期
  18. sqlzoo-day7
  19. 龙芯软件开发(6)--CPU龙芯2E
  20. PC版微信  网络不可用,请检查你的网络设置 的解决方法

热门文章

  1. 台式机安装系统时区分BIOS与UEFI
  2. c语言每瓶啤酒2元答案,【原创源码】C语言 一个喝啤酒小游戏的编程实现(菜鸟级)...
  3. php extension 安装,php + clucene extension的安装
  4. Android 使用 ActivityResult 处理 Activity 之间的数据通信及调起拍照实例
  5. 048_输出一下short的所有值
  6. x5675相当于e5_至强X5675比I7 2600强多少 至强X5675相当于几个AMD X2 220
  7. 东软java的笔试_东软的笔试题
  8. android内存代码,Android内存优化(五) Lint代码扫描工具
  9. 环形队列PHP,环形队列 - Go语言中文网 - Golang中文社区
  10. dataframe两个表合并_Part25:Pandas基础(Series,DataFrame类的创建、索引、切片、算术方法)...