Klockwork告警常见错误
生活随笔
收集整理的這篇文章主要介紹了
Klockwork告警常见错误
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
下面列舉的是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告警常见错误的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AttachThreadInput
- 下一篇: 每天一点C++(之四)