freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

軟件編程規(guī)范培訓(xùn)實(shí)例與練習(xí)-cmmi-文庫(kù)吧

2025-05-26 22:25 本頁(yè)面


【正文】 文】 在一次測(cè)試中,并沒有記得做了什么操作,發(fā)現(xiàn) HONET系統(tǒng)的主機(jī)復(fù)位了,之后,系統(tǒng)又工作正常了。由于沒有打開后臺(tái)的跟蹤窗 口,當(dāng)時(shí)查了半天沒有眉目。過了半天,現(xiàn)象又出現(xiàn)了,而且這次是主機(jī)在反復(fù)復(fù)位,系統(tǒng)根本無法正常工作了。 我憑記憶,判斷應(yīng)該是與當(dāng)時(shí)正在測(cè)試的 DSL板的端口配置有關(guān)。于是將板上所有端口配置為普通 2B+D端口,重新加載在主機(jī)數(shù)據(jù),現(xiàn)象消失。于是初步定位為主機(jī)在 DSL端口處理過程中有重大錯(cuò)誤。 我在新的數(shù)據(jù)上努力恢復(fù)原出問題的現(xiàn)象,卻一直沒有重現(xiàn),于是恢復(fù)原數(shù)據(jù),加載后立即重現(xiàn)。并注意到,當(dāng) DSL端口激活時(shí),主機(jī)復(fù)位。仔細(xì)比較兩種數(shù)據(jù)的差別,發(fā)現(xiàn)出現(xiàn)主機(jī)復(fù)位問題的數(shù)據(jù)中 DSL板配置了 MNT/MLT端口,但是沒有做 DSL端口之間的半永久數(shù)據(jù)。 于是在程序中不斷加打印語(yǔ)句,通過后臺(tái)的 DBWIN調(diào)試程序跟蹤,最后終于定位為:每當(dāng)執(zhí)行到 DeviceDslMsgProc()函數(shù)中處理 U口透?jìng)鞯? if ( SPC_STATE_OK == pSpcCBbySpcState ) 語(yǔ)句時(shí),主機(jī)復(fù)位。但是該語(yǔ)句似乎并無不妥。 再分析整個(gè)函數(shù), pSpcCB在函數(shù)前部分已經(jīng)被賦值, pSpcCB = SpcCB + (PortTable+index)spcNo。 但由于得到 index 后,沒有任何判斷,導(dǎo)致若 MNT/MLT端口沒有做半永久,端口激活后,執(zhí)行此部分函數(shù), (PortTable+index)spcNo 有可能為 NULL_WORD,于是,運(yùn)算后, pSpcCB 可能為非法值。此時(shí)主機(jī)在取進(jìn)行判斷,就不知會(huì)導(dǎo)致什么后果了。 其實(shí),改起來很簡(jiǎn)單,只要在這兩句前增加一個(gè)判斷就行了。于是,修改代碼為: if ( (PortTable+index)spcNo != NULL_WORD) { pSpcCB = SpcCB + (PortTable+index)spcNo。 if ( SPC_STATE_OK == pSpcCBbySpcState ) {。 } } 修改后,問題不再重現(xiàn)。 經(jīng)過分析可以發(fā)現(xiàn),編譯環(huán)境是有很大的容許空間的,若主機(jī)沒有做充分的保護(hù),很可能會(huì)有極嚴(yán)重的隨即故障出現(xiàn)。所以編程時(shí)一定要考慮各種可能情況;而測(cè)試中遇到此類死機(jī)問題,則要耐心的定位到具體是執(zhí)行哪句代碼時(shí)出現(xiàn)的,再進(jìn)行分析。因?yàn)閱栴}很隱蔽,直接分析海一樣的代碼是很難發(fā)現(xiàn)的。 變量類型定義錯(cuò)誤 【案例 】 【正 文】 在 FRI板上建幾條 FRPVC,其 DLCI類型分 別為: 10Bit/2bytes、10bit/3bytes、 16bit/3bytes、 17bit/4bytes、 23bit/4bytes。相應(yīng)的 DLCI值為: 123 99 12697 1234567,然后保存,重起 MUX,觀察 PVC的恢復(fù)情況,結(jié)果 DLCI值為 1 234和 991的 PVC正確恢復(fù),而 DLCI=126975的 PVC恢復(fù)的數(shù)據(jù)錯(cuò)誤為 61439,而 DLCI=1234567的 PVC完全沒有恢復(fù)。 對(duì)于 17/4類型, DLCI=126975的 PVC在恢復(fù)時(shí)變成 61439,根據(jù)這條 線索,查找原因,發(fā)現(xiàn) 12697561439=65535,轉(zhuǎn)化二進(jìn)制就是 10000000000000000,也就是說在數(shù)據(jù)恢復(fù)或保存時(shí)把原數(shù)據(jù)的第一個(gè) 1給忽略了。此時(shí)第一個(gè)想法是:在程序處理中,把無符號(hào)長(zhǎng)整型變量當(dāng)作短整型變量處理了,為了證實(shí)這個(gè)判斷,針對(duì) 17bit/4bytes類型又重新設(shè)計(jì)測(cè)試用例:( 1) 先建 PVC, DLCI=65535,然后保存,重起 MUX,觀察 PVC的恢復(fù)情況,發(fā)現(xiàn) PVC能夠正確恢復(fù); ( 2)再建 PVC, DLCI=65536,然后保存,重起 MUX,觀察 PVC的恢復(fù)情況,此時(shí) PVC不 能正確恢復(fù)。 至此基本可以斷定原因就是出在這里。帶著這個(gè)目的查看原代碼,發(fā)現(xiàn)在以下代碼中有問題: int _GetFrDlci( DWORD* dwDlci, char* str, DWORD dwDlciType, DWORD dwPortType, DWORD dwSlotID, DWORD dwPortID) { DWORD tempDlci。 char szArg[80]。 1 char szLine[80]。 ID LowPVCEP。 DWORD dwDlciVal[5][2] = { {16,1007}, {16,1007}, {1024,64511}, {2048,129023}, {131072,4194303} } 。 ... } typedef struct tagFrPppIntIWF { ... WORD wHdlcPort。 WORD wHdlcDlci。 WORD wPeerHdlcDlci。 WORD wPeerOldAtmPort。 ... } SFrPppIntIWFData。 DWORD SaveFrNetIntIWFData ( DWORD *pdwWritePoint ) { BYTE bSlotID, bPeerSlotID。 DWORD dwCCID, dwPeerCCID。 WORD wHdlcPort, wAtmPort, wIci, wPeerIci, wPeerHdlcPort 。 WORD wCount。 ... } DWORD SaveFrNetExtIWFData ( DWORD *pdwWritePoint ) { BYTE bSlotID。 DWORD dwCCID, dwPeerCCID。 WORD wHdlcPort, wAtmPort, wIci 。 WORD wCount。 ... [wCount].bSlotID = bSlotID。 [wCount].wHdlcPort = wHdlcPort。 [wCount].wHdlcDlci = gFrPVCEP[bSlotID ][ gFrPVCC[bSlotID][dwCCID].dwLoPVCEP ].dwDLCI。 [wCount].wOldAtmPort = wAtmPort。 [wCount].wAtmDlci = gFrPVCEP[ bSlotID ][ gFrPVCC[bSlotID][dwCCID].dwHiPVCEP ].dwDLCI。 [wCount].dwMapMode = gFrPVCC[bSlotID][dwCCID].dwMapMode。 ... } DWORD RestoreFrNetExtIWFData ( WORD wSlotID, BYTE *pReadPoint ) { WORD wCount, wTotalNetIWF。 BYTE bSlotID, bHdlcDlciType, bAtmDlciType。 WORD wOldAtmPort, wAtmDlci, wHdlcPort, wHdlcDlci。 DWORD dwMapMode, dwCIR, dwBe。 DWORD dwCCID, dwResult, dwAtmPort。 wTotalNetIWF = 。 ... } DWORD RestoreFrHdlcIntIWFData ( WORD wSlotID, BYTE *pReadPoint ) { WORD wCount, wTotalHdlcIWF。 DWORD dwCCID, dwPeerCCID, dwAtmPort, dwPeerAtmPort。 DWORD dwResult。 BYTE bSlotID, bPeerSlotID。 WORD wHdlcPort, wOldAtmPort, wCIR。 WORD wPeerHdlcPort, wPeerOldAtmPort。 ... } 其中涉及 DLCI值的變量都為 WORD(即無符號(hào)短整型)類型,在程序的處理時(shí),出現(xiàn) WORD和 DWORD(無符號(hào)長(zhǎng)整型)類型在一句中同時(shí)存在的情況,至此可以判斷問題出在這里。由于 DLCI值在不同類型時(shí)的取值范圍不同,前三種類型的取值范圍為 16~991,第四種取值范圍為 2048~126975,第五種取值范圍為 131072~4194303,所以當(dāng)采用前三種 DLCI類型時(shí),采用 WORD類型最大值為 65535,已經(jīng)完全夠用了;而對(duì)于第四種類型時(shí),其取值在超過 65535時(shí),獲取 DLCI值的函數(shù) _GetFrDlci()采用 DWORD類型,而負(fù)責(zé)保存和恢復(fù)的兩個(gè)函數(shù) SaveFrNetExtIWFData()和 RestoreFrNetExtIWFData(),都把 DLCI的值當(dāng)作 WORD類型進(jìn)行處理,因此導(dǎo)致 DLCI取值越界,于是程序把原本為長(zhǎng)整型的DLCI強(qiáng)制轉(zhuǎn)換成整型,從而導(dǎo)致 DLCI值在恢復(fù)時(shí),比原數(shù)據(jù)小 65536。而在程序運(yùn)行過程中,這些數(shù)據(jù)保存在 DRAM中,程序運(yùn)行直接從 DRAM中獲取數(shù)據(jù),程序不會(huì)出錯(cuò);當(dāng) FRI板復(fù)位或插拔后,需要從 FLASH中讀取數(shù)據(jù),此時(shí)恢復(fù)函數(shù)的錯(cuò)誤就表現(xiàn)出來。 另一個(gè)問題是為什么 23/4類型的 DLCI數(shù)據(jù)不能恢復(fù)?這是由于對(duì)于 23/4類型的 PVC,其 DLCI的取值范圍為: 131072~4194303,而程序強(qiáng)制轉(zhuǎn)換并恢復(fù)的數(shù)據(jù)最大只能是 65535,所以這條 PVC不能恢復(fù)。 至此, DLCI數(shù)據(jù)恢復(fù)出錯(cuò)的原因完全找到,解決的方 法是將 DLCI的類型改為 DWORD類型。從這個(gè)案例可以看出,在程序開發(fā)中一個(gè)很低級(jí)的錯(cuò)誤,將在實(shí)際工作中造成很嚴(yán)重的后果。 【案例 】 【正 文】 在 FRI板上建幾條 FRPVC,其 DLCI類型分別為: 10Bit/2bytes、10bit/3bytes、 16bit/3bytes、 17bit/4bytes、 23bit/4bytes。相應(yīng)的 DLCI值為: 123 99 12697 1234567,然后保存,重起 MUX,觀察 PVC的恢復(fù)情況,結(jié)果 DLCI值為 1 234和 991的 PVC正確恢復(fù),而 DLCI=126975的 PVC恢復(fù)的數(shù)據(jù)錯(cuò)誤為 61439,而 DLCI=1234567的 PVC完全沒有恢復(fù)。 對(duì)于 17/4類型, DLCI=126975的 PVC在恢復(fù)時(shí)變成 61439,根據(jù)這條線索,查找原因,發(fā)現(xiàn) 12697561439=65535,轉(zhuǎn)化二進(jìn)制就是 10000000000000000,也就是說在數(shù)據(jù)恢復(fù)或保存時(shí)把原數(shù)據(jù)的第一個(gè) 1給忽略了。此時(shí)第一個(gè)想法是:在程序處理中,把無符號(hào)長(zhǎng)整型變量當(dāng)作短整型變量處理了,為了證實(shí)這個(gè)判斷,針對(duì) 17bit/4bytes類型又重新設(shè)計(jì)測(cè)試用例:( 1) 先建 PVC, DLCI=65535,然后保存,重起 MUX,觀察 PVC的恢復(fù)情況,發(fā)現(xiàn) PVC能夠正確恢復(fù); ( 2)再建 PVC, DLCI=65536,然后保存,重起 MUX,觀察 PVC的恢復(fù)情況,此時(shí) PVC不能正確恢復(fù)。 至此基本可以斷定原因就是出在這里。帶著這個(gè)目的查看原代碼,發(fā)現(xiàn)在以下代碼中有問題: int _GetFrDlci( DWORD* dwDlci, char* str, DWORD dwDlciType, DWORD dwPortType, DWORD dwSlotID, DWORD dwPortID) { DWORD tempDlci。 char szArg[80]。 char szLine[80]。 ID LowPVCEP。 DWORD dwDlciVal[5][2] = { {16,1007}, {16,1007}, {1024,64511}, {2048,129023}, {131072,4194303} } 。 ... } typedef struct tagFrPppIntIWF { ... WORD wHdlcPort。 WORD wHdlcDlci。 WORD wPeerHdlcDlci。 WORD wPeerOldAtmPort。 ... } SFrPppIntIWFData。 DWORD SaveFrNetIntIWFData ( DWORD *pdwWritePoint ) { BYTE bSlotID, bPeerSlotID。 DWORD dwCCID, dwPeerCCID。 WORD wHdlcPort, wAtmPort, wIci, wPeerIci, wPeerHdlcPort 。 WORD wCount。 ... } DWORD SaveFrNetExtIWFDa
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1