代碼審查九句真言_第1頁
代碼審查九句真言_第2頁
代碼審查九句真言_第3頁
代碼審查九句真言_第4頁
代碼審查九句真言_第5頁
已閱讀5頁,還剩7頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、向配置文件發送消息進行配置下載看見了If,就想Else。看見malloc,就去找Free。函數調用要小心,需要看看返回值。看到for循環,就找邊界值。看見return要注意,要去前面找資源。看見數組把神提,問題往往在下標。不要小看字符串,長度是個大問題。得到函數不要急,看看變量初始化,各種路徑要小心賦值函數最危險,變量沒有初始化。九句句真言不孤立,相互結合顯神威。真言詳解1.看見If,就想Else。看到if語句,就要想到else語句。如果沒有else語句,就要分析是不需要,還是異常情況沒有處理,如果是異常情況沒有處理,可以提單。看見,就去找。看到malloc語句分配了內存,立即停下正常走讀,看

2、malloc代碼之后,是否在所有程序的返回分支中都有釋放語句。典型案例:該函數有了,但沒有看到free。于是在下面的代碼中尋找,發現中自動實現free功能。代碼看似沒有問題,但我們發現的返回值沒有判斷,如果返回失敗,free語句就沒有被執行到。這樣可以確認該函數存在內存泄露隱患。該代碼最終修改:U32DEV_IfSetSectionEnable(DEV_IF_T*pIfIns)CHAR*pSectionName=NULL;ULONGulMsg4;ULONGrc;/*向配置文件發送消息DEV_IF_READ_SECTION,進行配置下載*/if(pIfIns=NULL|(VOS_strlen(p

3、IfIns-ifName)(MAX_INTERFACE_NAME_LEN+1)returnDEV_ERR_GEN;pSectionName=VOS_Malloc(MOD_DEV,MAX_INTERFACE_NAME_LEN+1);if(pSectionName!=NULL)VOS_strcpy(pSectionName,pIfIns-ifName);ulMsg0=MID_DEV;ulMsg1=MID_CFM;ulMsg2=DEV_CFM_ENABLE_SECTION;ulMsg3=(ULONG)pSectionName;rc=VOS_Que_Write(ulVRPQID_CFM,ulMsg,V

4、OS_NO_WAIT,0);if(rc!=SUCCESS)rc=VOS_Free(pSectionName);VOS_DBGASSERT(rc=VOS_OK);returnDEV_ERR_GEN;returnSUCCESS;returnDEV_ERR_NOMEMORY;3.函數調用要小心,需要看看返回值。看到函數調用,要養成習慣,進入函數內部瞄一眼。看看函數的正常值和異常值都是什么。看看返回值需不需要判斷。看看有沒有參數理解不一致的地方。例如:得*到端口的索引判*斷端口是否已經存在函數使用-1作為非法值,而在函數中:接口的類型字符串字符串為空,返回錯誤returnDEV_ERR_VALUE;從

5、字為空符串的尾部向前查找,直到找到第一個不是數字的字符字符不為等于空.,或數字為字符時循環結束函數的一個錯誤返回值是dev_err_value,很顯然,兩邊參數理解不一致。看到循環,就找邊界值。看到for循環,就要看看邊界值是否合理。如果循環變量是數組的下標,更加需要注意。例如:函數中:而數組:設備目前只管理物理端口和子接口而數組定義中,去掉被注釋掉的部分,數組長度只有3。數組將嚴重越界。看見要注意,要去前面找資源。看見return語句,尤其是函數中間的異常返回語句。看到這種語句,就需要折回頭去看看前面有沒有分配資源。前面分配的任何資源(包括內存,端口,等等),在異常返回處需要一并釋放。例如:

6、在中的函數中禁止設置紅色代碼處分配了資源,而在蘭色代碼處異常返回時沒有被釋放。看見數組把神提,問題往往在下標。函數中一旦出現數組,就要提起精神。數組越界可是個致命問題。例如U32rc;U32i,j;/LoopVariableU8pOutputStr80;/outputinfobufferU32ulNetDEV_SLOT_ATMUNIT_MAX_NUM;U8*pOutputStatus;U8*pOutputType;U8*pOutputApcNetDEV_ASLT_SUB_MAX_NUM-1;U8xidx,yidx,tmpPort;U32ulNetVer;U32ulSeq;U32ulLen;vo

7、id*pData;/pointertomsgreceivedU8szBuf256;DEV_NET_SWPTMAP_TsNetSwptMap;/checknetboardnetIndex1=DEV_CONV_SLT2SLTINDEX(NET_CARD1);netIndex2=DEV_CONV_SLT2SLTINDEX(NET_CARD2);pNetIns1=DEV_GetSlotFromIndex(netIndex1);pNetIns2=DEV_GetSlotFromIndex(netIndex2);if(pNetIns1=NULL&pNetIns2=NULL)EXEC_OutString(ul

8、UserID,rnnetboardnotfound);returnSUCCESS;if(pNetIns1!=NULL)rc=DEV_SltGetSlotStatus(netIndex1,&sValue);if(rc)/erroroutputreturnDEV_ERR_GEN;if(sValue.v_num!=DEV_OBJ_STATUS_INACTIVE)netstatus1=DEV_OBJ_STATUS_ACTIVE;if(pNetIns2!=NULL)rc=DEV_SltGetSlotStatus(netIndex2,&sValue);if(rc)/erroroutputreturnDEV

9、_ERR_GEN;if(sValue.v_num!=DEV_OBJ_STATUS_INACTIVE)netstatus2=DEV_OBJ_STATUS_ACTIVE;if(netstatus1=DEV_OBJ_STATUS_INACTIVE&netstatus2=DEV_OBJ_STATUS_INACTIVE)EXEC_OutString(ulUserID,rnallthenetboardareinacitve);returnSUCCESS;/defaultframenumberis0frmIndex=DEV_CONV_FRM2FRMINDEX(DEV_DEFAULT_FRAME);每槽位最大

10、支持最大數單元數紅色代碼中:紅色數組定義的長度是1蘭色代碼中:使用的下標到了4,數組嚴重越界。不要小看字符串,長度是個大問題。字符串往往是代碼審查中不被重視的問題。而字符串由于各個模塊對其他模塊的不了解,經常出現隨便定義一個字符串長度的現象。例如:接口的類型字符串字符串為空,返回錯誤從字符串的尾部向前查找,直到找到第一個不是數字的字符字符不等于或數字字符時循環結束入口參數在調用方定義的長度是8而的長度是,因此,紅色代碼:有越界可能。得到函數不要急,看看變量初始化,各種路徑要小心。在拿到函數之后,要習慣性的看看所有的局部變量是在函數一開始就被初始化了如果有變量沒有被初始化,就要小心了。如果發現變量是在if,for,while,等語句中被初始化的,問題可能就來了。釋/放/原定時器申/請定時器向/源發出錯應答/啟/動定時器如果代碼走紅色的分支,則在蘭色的代碼處使用的紅色的變量就沒有被初始化。賦值函數最危險,變量沒有初始化。在C代碼中,經常使用將變量的指針作為參數,在被調用函數中對變量進行

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論