![軟件編程低級(jí)錯(cuò)誤:空指針_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/4/322e03a9-bd88-4878-b8b1-79f5da6db144/322e03a9-bd88-4878-b8b1-79f5da6db1441.gif)
![軟件編程低級(jí)錯(cuò)誤:空指針_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/4/322e03a9-bd88-4878-b8b1-79f5da6db144/322e03a9-bd88-4878-b8b1-79f5da6db1442.gif)
![軟件編程低級(jí)錯(cuò)誤:空指針_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/4/322e03a9-bd88-4878-b8b1-79f5da6db144/322e03a9-bd88-4878-b8b1-79f5da6db1443.gif)
![軟件編程低級(jí)錯(cuò)誤:空指針_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/4/322e03a9-bd88-4878-b8b1-79f5da6db144/322e03a9-bd88-4878-b8b1-79f5da6db1444.gif)
![軟件編程低級(jí)錯(cuò)誤:空指針_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/4/322e03a9-bd88-4878-b8b1-79f5da6db144/322e03a9-bd88-4878-b8b1-79f5da6db1445.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、HUAWEI TECHNOLOGIES CO., LTDHuawei Confidential Security Level: 2022-4-11PSSTPSST系統(tǒng)工程部系統(tǒng)工程部 CC語(yǔ)言軟件編程規(guī)范工作組語(yǔ)言軟件編程規(guī)范工作組公司常見(jiàn)軟件編程低公司常見(jiàn)軟件編程低級(jí)錯(cuò)誤:空指針級(jí)錯(cuò)誤:空指針HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 前言l這套材料作為編程規(guī)范的輔助材料,幫助大家理解編程規(guī)范背后的原理。這套材料作為編程規(guī)范的輔助材料,幫助大家理解編程規(guī)范背后的原理。lC和和C+語(yǔ)言是我司的主流編程語(yǔ)言,然而語(yǔ)言是我司的主流編程語(yǔ)言,然而
2、C/C+具有很多強(qiáng)大的語(yǔ)言特性,從而導(dǎo)致具有很多強(qiáng)大的語(yǔ)言特性,從而導(dǎo)致C/C+非常復(fù)雜,使得代碼更容易出現(xiàn)非常復(fù)雜,使得代碼更容易出現(xiàn)BUG、難以閱讀和維護(hù)。、難以閱讀和維護(hù)。l業(yè)界知名的編程規(guī)范都對(duì)業(yè)界知名的編程規(guī)范都對(duì)C/C+容易出現(xiàn)問(wèn)題的語(yǔ)言特性進(jìn)行管理。例如容易出現(xiàn)問(wèn)題的語(yǔ)言特性進(jìn)行管理。例如MISRA(汽(汽車工業(yè)軟件可靠性聯(lián)合會(huì))制定的車工業(yè)軟件可靠性聯(lián)合會(huì))制定的1998版的版的MISRAC規(guī)范指出,一些在規(guī)范指出,一些在C看來(lái)可以接看來(lái)可以接受,卻存在隱患的地方有受,卻存在隱患的地方有127處之多。處之多。2004版的版的MISRAC規(guī)范將針對(duì)規(guī)范將針對(duì)C語(yǔ)言的規(guī)則增加語(yǔ)言的
3、規(guī)則增加到了到了141條。條。l對(duì)于程序員來(lái)說(shuō),能工作的代碼并不等于對(duì)于程序員來(lái)說(shuō),能工作的代碼并不等于“好好” 代碼。代碼。“好好”代碼的指標(biāo)很多,包代碼的指標(biāo)很多,包括可讀性、可維護(hù)性、可移植性和可靠性等。出現(xiàn)網(wǎng)上問(wèn)題的代碼,大多數(shù)是不良括可讀性、可維護(hù)性、可移植性和可靠性等。出現(xiàn)網(wǎng)上問(wèn)題的代碼,大多數(shù)是不良編程習(xí)慣引起的。不遵守編程規(guī)范的代碼,往往也是最不可靠的代碼。編程習(xí)慣引起的。不遵守編程規(guī)范的代碼,往往也是最不可靠的代碼。l本膠片收集了常見(jiàn)的空指針案例,給出了相應(yīng)的糾正措施。本膠片收集了常見(jiàn)的空指針案例,給出了相應(yīng)的糾正措施。HUAWEI TECHNOLOGIES CO., LTD
4、.Huawei Confidential 申請(qǐng)內(nèi)存沒(méi)有捕獲異?!締?wèn)題描述問(wèn)題描述】Web服務(wù)器返回500錯(cuò)誤?!締?wèn)題定位問(wèn)題定位】New內(nèi)存失敗,不會(huì)返回NULL,而會(huì)拋出異常,但代碼中沒(méi)有捕獲這個(gè)異?!靖驹蚋驹颉緾+語(yǔ)言中New內(nèi)存失敗后可以出現(xiàn)兩種情況,一種是返回NULL,一種是拋出異常??梢栽谡{(diào)用New函數(shù)時(shí)使用參數(shù)指定,也可以在編譯選項(xiàng)中統(tǒng)一選擇一種處理方式。項(xiàng)目組沒(méi)有明確規(guī)定采用哪種處理方式,開發(fā)人員根據(jù)以前項(xiàng)目組的經(jīng)驗(yàn)調(diào)用New函數(shù)后,判斷是否非空,但在這個(gè)項(xiàng)目中即使New失敗也不會(huì)返回NULL?!九e一反三舉一反三】項(xiàng)目組必須規(guī)定統(tǒng)一的編程規(guī)范。維護(hù)老代碼時(shí),注意弄清楚老代
5、碼的設(shè)計(jì)和編程的規(guī)則。HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 沒(méi)有判斷全局指針?lè)强铡締?wèn)題描述問(wèn)題描述】當(dāng)主控板起來(lái)但接口板還沒(méi)有起來(lái)時(shí),使用命令undo rule-map刪除所有的Rule-map,出現(xiàn)DA異常。 【問(wèn)題定位問(wèn)題定位】在刪除Rule-map時(shí),如果它引用了Link-group,則將Link-group中的pLink的引用計(jì)數(shù)減一。開發(fā)人員認(rèn)為全局變量pLink永遠(yuǎn)不可能為NULL,所以沒(méi)有判斷其合法性。正常情況下,pLink確實(shí)不可能為NULL,但當(dāng)系統(tǒng)重啟時(shí),先恢復(fù)了Rule-map,在恢復(fù)Link-group之前,p
6、Link指針為NULL。此時(shí)如果從命令行刪除所有的Rule-map,就會(huì)出現(xiàn)DA異常?!炯m正措施糾正措施】訪問(wèn)pLink之前,判斷其是否為NULL【根本原因根本原因】多個(gè)模塊相互配合時(shí),可能出現(xiàn)千奇百怪的調(diào)用順序,開發(fā)人員認(rèn)為永遠(yuǎn)不可能為NULL的參數(shù),實(shí)際網(wǎng)絡(luò)中卻很可能發(fā)生?!九e一反三舉一反三】外部接口傳入的參數(shù),或其它模塊維護(hù)的全局變量,使用之前必須判斷是否合法HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 沒(méi)有判斷外部傳入指針?lè)强铡締?wèn)題描述問(wèn)題描述】終端向服務(wù)器注冊(cè),服務(wù)器返回403失敗響應(yīng),這時(shí)終端向服務(wù)器發(fā)送群組廣告,服務(wù)core。
7、【問(wèn)題定位問(wèn)題定位】從core文件中看,是空指針引起。根據(jù)core文件中提供的的信息,反向檢視代碼, 發(fā)現(xiàn)藍(lán)色部分存在問(wèn)題,對(duì)獲取到的變量未做空指針判斷:pSession-SetUserContext( pLogic-GetPoCPCUUserContext() );在用戶未注冊(cè)上時(shí),服務(wù)器清空了資源,使得在用戶未注冊(cè)上時(shí),服務(wù)器清空了資源,使得pLogic-GetPoCPCUUserContext()取出來(lái)時(shí)取出來(lái)時(shí)為空,但傳入方與接收方都未做空指針判斷,導(dǎo)致出現(xiàn)問(wèn)題為空,但傳入方與接收方都未做空指針判斷,導(dǎo)致出現(xiàn)問(wèn)題.【糾正措施糾正措施】對(duì)傳入的指針應(yīng)做合法性檢查IPoCPCUUserCo
8、ntext* pContext = pLogic-GetPoCPCUUserContext();If (NULL = pContext) pSession-SetUserContext(pContext);【舉一反三舉一反三】外部接口傳入的指針,多個(gè)對(duì)象使用,很可能一方更改了,而另一方不知道的情況,使用之前必須判斷是否合法HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 沒(méi)有判斷文件輸入數(shù)據(jù)非空【問(wèn)題描述問(wèn)題描述】 MM代碼中使用了非法指針導(dǎo)致(空指針)服務(wù)器發(fā)生宕機(jī)?!締?wèn)題定位問(wèn)題定位】從操作日志分析到MM分析list.xml時(shí)出現(xiàn)宕機(jī), hr
9、 = pRootNode-get_firstChild(&pLogItem); / list.xml 為空,導(dǎo)致讀出pLogItem為空. hr = pLogItem-get_nextSibling(&pMediaNextNode); / pLogItem為空,導(dǎo)致宕機(jī)【糾正措施糾正措施】對(duì)指針應(yīng)做合法性檢查對(duì)指針應(yīng)做合法性檢查if (pLogItem = NULL) return retValue; hr = pLogItem-get_nextSibling(&pMediaNextNode); 【舉一反三舉一反三】外部文件讀入的指針,可能為空,使用之前必須判斷是否合法
10、外部文件讀入的指針,可能為空,使用之前必須判斷是否合法HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 沒(méi)有判斷文件輸入數(shù)據(jù)非空(續(xù))【問(wèn)題描述問(wèn)題描述】在某省項(xiàng)目中,現(xiàn)場(chǎng)開發(fā)了與第三方的網(wǎng)管系統(tǒng)(以后簡(jiǎn)稱E1)的接口程序(以后簡(jiǎn)稱E2),用于接收網(wǎng)管上的所有實(shí)時(shí)告警信息。在不定期的情況下,接口程序E2會(huì)core dump?!締?wèn)題定位問(wèn)題定位】從操作日志分析到讀取第三方空日志文件時(shí)宕機(jī) FILE *fp=fopen( ./writeAlarmLastTime.log,r);char buff128=;fscanf(fp,“%s”,buff); /
11、讀取最新的告警時(shí)間;由于文件writeAlarmLastTime.log為空,導(dǎo)致buff為空f(shuō)close(fp);long fileTime=getAlarmTime(buff); /解析獲取最新的告警時(shí)間;getAlarmTime函數(shù)未檢查buff指針【糾正措施糾正措施】在函數(shù)getAlarmTime檢查指針的合法性或者檢查fscanf的返回值:如果返回值為EOF,則返回if ( EOF=fscanf(fp,“%s”,buff) ) /讀取最新的告警時(shí)間 return ; 【舉一反三舉一反三】外部文件讀入的指針,可能為空,使用之前必須判斷是否合法外部文件讀入的指針,可能為空,使用之前必須判
12、斷是否合法HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 定時(shí)器處理函數(shù)沒(méi)有判斷指針?lè)强铡締?wèn)題描述問(wèn)題描述】測(cè)試人員在測(cè)試過(guò)程中發(fā)現(xiàn)scf出現(xiàn)core:查看日志分析scf在收到CCA(Term)消息時(shí)調(diào)用函數(shù)clearDiamCCATimer清除等待CCA(Term)后,又進(jìn)入處理定時(shí)器事件處理函數(shù)processDiamCCATimeOut,在該函數(shù)中出現(xiàn)core?!締?wèn)題定位問(wèn)題定位】在如下場(chǎng)景中將會(huì)出現(xiàn)空指針引用導(dǎo)致core:1)收到CCA(Term)消息,消息入隊(duì)列2)定時(shí)器觸發(fā),定時(shí)器超時(shí)事件入隊(duì)列3)處理CCR(Term)消息,調(diào)用cl
13、earDiamCCATimer:清除定時(shí)器后,刪除保存重發(fā)CCR消息的指針m_pResendDiamCCR4)處理定時(shí)器超時(shí)事件,調(diào)用processDiamCCATimeOut:從m_pResendDiamCCR中獲取重發(fā)消息。 TInterpretR TSCSM:processDiamCCATimeOut() 。*pTmpDiamCCR = *(TDiamScpCCR *)(m_pResendDiamCCR-pMsgPara); /當(dāng)出現(xiàn)上面的場(chǎng)景時(shí),此時(shí)m_pResendDiamCCR為空,core ?!炯m正措施糾正措施】在函數(shù)在函數(shù)processDiamCCATimeOut頭部增加頭部增
14、加m_pResendDiamCCR是否為空的判斷是否為空的判斷if (NULL = m_pResendDiamCCR) return ;*pTmpDiamCCR = *(TDiamScpCCR *)(m_pResendDiamCCR-pMsgPara);【舉一反三舉一反三】注意定時(shí)器里面的指針,是否在其他任務(wù)里面被刪除注意定時(shí)器里面的指針,是否在其他任務(wù)里面被刪除HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 指針初始化NULL,使用前沒(méi)有檢查【問(wèn)題描述問(wèn)題描述】山西電信客服坐席全部簽出山西電信客服坐席全部簽出【問(wèn)題定位問(wèn)題定位】 CTISer
15、ver發(fā)起資源連接時(shí),如果發(fā)現(xiàn)兩個(gè)連接方都已發(fā)起資源連接時(shí),如果發(fā)現(xiàn)兩個(gè)連接方都已經(jīng)存在有非會(huì)場(chǎng)的資源連接,則處理時(shí)存在有空指針訪問(wèn)。經(jīng)存在有非會(huì)場(chǎng)的資源連接,則處理時(shí)存在有空指針訪問(wèn)。 void CSCP:AnalysisConnectRequest(CTI_RESOURCE_CONNECT_Msg* pMsg, CConnectNode* pNode,CConference* pOcuppyConf) CConnectObject* pObject = NULL; . . if(pSourceObject != NULL & pDestObject != NULL) if(!pSo
16、urceObject-IsConference() & !pDestObject-IsConference() CConference* pDevice = pOcuppyConf;if (!pDevice) /lint -e413 if(CONN_CONF_REQUEST=pObject-m_ucCurConnectContext) /使用指針時(shí)沒(méi)有檢查,導(dǎo)致使用空指針使用指針時(shí)沒(méi)有檢查,導(dǎo)致使用空指針 . .pObject 僅僅賦初始值僅僅賦初始值NULL,沒(méi)有真正賦值;,沒(méi)有真正賦值;pclint有空指針告警,被錯(cuò)誤關(guān)閉有空指針告警,被錯(cuò)誤關(guān)閉HUAWEI TECHNOLOGIE
17、S CO., LTD.Huawei Confidential 指針初始化NULL,使用前沒(méi)有檢查 (續(xù))【糾正措施糾正措施】變量的定義、初始化和使用變量的定義、初始化和使用要做到親密無(wú)間要做到親密無(wú)間 :在首:在首次使用之前定義和初始化變量次使用之前定義和初始化變量CConnectObject* pObject = pDestObject; if(CONN_CONF_REQUEST=pObject-m_ucCurConnectContext)【舉一反三舉一反三】C99C99之前的之前的C C語(yǔ)言版本要求只能在作用域開始處定義變語(yǔ)言版本要求只能在作用域開始處定義變量,這種方式在量,這種方式在C
18、C中已經(jīng)過(guò)時(shí)。這一限制的嚴(yán)重問(wèn)題在于,中已經(jīng)過(guò)時(shí)。這一限制的嚴(yán)重問(wèn)題在于,在作用域開始時(shí)沒(méi)有足夠的相關(guān)信息進(jìn)行初始化。因此我們只在作用域開始時(shí)沒(méi)有足夠的相關(guān)信息進(jìn)行初始化。因此我們只有兩種選擇:要么用某個(gè)默認(rèn)的空值(比如例子中的有兩種選擇:要么用某個(gè)默認(rèn)的空值(比如例子中的NULLNULL)來(lái))來(lái)初始化,這通常是一種浪費(fèi),還回導(dǎo)致錯(cuò)誤;要么讓變量未初初始化,這通常是一種浪費(fèi),還回導(dǎo)致錯(cuò)誤;要么讓變量未初始化,而這是很危險(xiǎn)的。解決方案很簡(jiǎn)單:盡可能局部定義變始化,而這是很危險(xiǎn)的。解決方案很簡(jiǎn)單:盡可能局部定義變量,在需要首次使用前定義和初始化變量。量,在需要首次使用前定義和初始化變量。HUAWE
19、I TECHNOLOGIES CO., LTD.Huawei Confidential 空指針操作:多個(gè)條件一起判斷(1)【問(wèn)題描述問(wèn)題描述】測(cè)試接口時(shí),如果沒(méi)有輸入必選參數(shù)(操作類型operationType),系統(tǒng)異常【問(wèn)題定位問(wèn)題定位】if (operationType != null & operationType.equals(1)if (operationType != null & operationType.equals(1) / 分支操作 else if (operationType.equals(2) / 分支操作 else / 分支操作表面上代碼對(duì)空指針和
20、各種取值都進(jìn)行了判斷,但是當(dāng)operationType為null時(shí),第一行的判斷為FALSE,然后執(zhí)行第二個(gè)判斷分支,立刻出現(xiàn)空指針異常。其實(shí),我們代碼中經(jīng)常會(huì)出現(xiàn)這樣的低級(jí)錯(cuò)誤,編碼者第一次判斷時(shí)思路很清晰,要對(duì)對(duì)象判空,但是以后想當(dāng)然認(rèn)為第一次已經(jīng)判空了,else if之后就不需要再次判斷?!炯m正措施糾正措施】見(jiàn)下頁(yè)見(jiàn)下頁(yè)HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 空指針操作:多個(gè)條件一起判斷(2)【糾正措施糾正措施】將判空作為單獨(dú)的條件,這樣代碼雖然多了一行,卻清晰了很多if (if (nullnull = = operationTy
21、pe = operationType ) / / 分支操作分支操作 else if( else if( operationType.equals(1) operationType.equals(1) / / 分支操作分支操作 else if (operationType.equals(2) (operationType.equals(2) / / 分支操作分支操作 else / / 分支操作分支操作 【舉一反三舉一反三】將多條判斷語(yǔ)句寫在一起,非常容易出錯(cuò)。每一行代碼最好只完成一個(gè)功能HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 空指針操作:
22、&寫成了|【問(wèn)題描述問(wèn)題描述】代碼飛檢發(fā)現(xiàn)下面代碼:typedef mapMsgmap;Msgmap m_mapMsgData;Msgmap:iterator itor = m_mapMsgData.find(nMsgID);if (m_mapMsgData.end() != itor) | !itor-second)if (m_mapMsgData.end() != itor) | !itor-second) 【問(wèn)題定位問(wèn)題定位】當(dāng) m_mapMsgData.end() != itor為非,會(huì)繼續(xù)執(zhí)行 !itor-second,但此時(shí)itor為空指針?!炯m正措施糾正措施】將|修改成&
23、amp;。同時(shí),上面的寫法強(qiáng)烈依賴判斷語(yǔ)句從左到右執(zhí)行。在“表達(dá)式副作用”章節(jié)中已經(jīng)說(shuō)過(guò),& | ?運(yùn)算符左側(cè)有一個(gè)sequence point,所以判斷語(yǔ)句一定是從左到右執(zhí)行的,但為了提高可維護(hù)性,最好還是明確寫出這種執(zhí)行順序,將條件判斷修改成兩行:if (m_mapMsgData.end() != itor) if (m_mapMsgData.end() != itor) if ( !itor-second) if ( !itor-second) ; ; HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 空指針操作:Map取值自動(dòng)添加空指針(1)【問(wèn)題描述問(wèn)題描述】版本驗(yàn)證中,進(jìn)行關(guān)閉操作,引起coredump。問(wèn)題無(wú)規(guī)律重現(xiàn)?!締?wèn)題定位問(wèn)題定位】分析dump文件,導(dǎo)致coredump的代碼是:if(itRevTElink-second)-GetLinkstat() = TELINK_STATE_DISCONNECT ).itRevTElink是從m_ma
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度屋頂光伏系統(tǒng)維護(hù)保養(yǎng)合同模板
- 學(xué)校安全管理方案
- 2024-2025學(xué)年廣西壯族自治區(qū)高三上學(xué)期11月聯(lián)考?xì)v史試卷
- 2025年公共照明設(shè)施合同
- 2025年自動(dòng)化設(shè)備購(gòu)買與前期策劃協(xié)議
- 2025年住宅用地和樓宇訂購(gòu)合同
- 2025年綠化養(yǎng)護(hù)承包合同范本
- 2025年外教聘請(qǐng)合作協(xié)議
- 2025年二手房產(chǎn)交易代理協(xié)議格式
- 2025年交通運(yùn)輸中介合同協(xié)議書范本
- Q∕GDW 10364-2020 單相智能電能表技術(shù)規(guī)范
- 電廠鋼結(jié)構(gòu)施工方案(53頁(yè))
- 房地產(chǎn)現(xiàn)金流量表
- 水體國(guó)產(chǎn)載體固化微生物
- 2022年露天煤礦安全資格證考試題庫(kù)-上(單選、多選題庫(kù))
- MIL-STD-1916 抽樣技術(shù) (C=0 零不良)
- 膠合板公司人員招聘與配置(模板)
- 團(tuán)建方案版攻防箭對(duì)戰(zhàn)
- 樁身強(qiáng)度自動(dòng)驗(yàn)算表格Excel
- 燃?xì)廨啓C(jī)LM2500介紹
- (精選)淺談在小學(xué)數(shù)學(xué)教學(xué)中如何進(jìn)行有效提問(wèn)
評(píng)論
0/150
提交評(píng)論