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

正文內(nèi)容

【經(jīng)管勵(lì)志】軟件編程規(guī)范培訓(xùn)實(shí)例與練習(xí)(編輯修改稿)

2025-05-29 03:57 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 型變量當(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)在以下代碼中有問(wè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 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(即無(wú)符號(hào)短整型)類型,在程序的處理時(shí),出現(xiàn) WORD和 DWORD(無(wú)符號(hào)長(zhǎng)整型)類型在一句中同時(shí)存在的情況,至此可以判斷問(wèn)題出在這里。由于 DLCI值在不同類型時(shí)的取值范圍不同,前三種類型的取值范圍為 16~991,第四種取值范圍為 2048~126975,第五種取值范圍為 131072~4194303,所以當(dāng)采用前三種 DLCI類型時(shí),采用 WORD類型最大值為 65535,已經(jīng)完全夠用了;而對(duì)于第四種類型時(shí),其取值在超過(guò) 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)行過(guò)程中,這些數(shù)據(jù)保存在 DRAM中,程序運(yùn)行直接從 DRAM中獲取數(shù)據(jù),程序不會(huì)出錯(cuò);當(dāng) FRI板復(fù)位或插拔后,需要從 FLASH中讀取數(shù)據(jù),此時(shí)恢復(fù)函數(shù)的錯(cuò)誤就表現(xiàn)出來(lái)。 另一個(gè)問(wèn)題是為什么 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è)案例可以看出,在程序開(kāi)發(fā)中一個(gè)很低級(jí)的錯(cuò)誤,將在實(shí)際工作中造成很嚴(yán)重的后果。 正確使用邏輯與 amp。amp。、屏蔽 amp。操作符 【案例 】 【案例描述】:由于 C語(yǔ)言中位與比求模效率高,因而系統(tǒng)設(shè)計(jì)時(shí),對(duì)于模 128的地方都改為與 127,系統(tǒng)定義的宏為 define MOD128 127和 define W_MOD 127(定義的宏的名字易引起誤解 ),但實(shí)際程序中還是采取求模,從而引起發(fā)送窗口欲重發(fā)的和實(shí)際重發(fā)的不一致,最終導(dǎo)致鏈路復(fù)位此類嚴(yán)重問(wèn)題,曾在定位此 問(wèn)題時(shí)花了不少時(shí)間。 【處理過(guò)程】:處理過(guò)程如下: define MOD128 127 //隊(duì)列長(zhǎng) 128,當(dāng)隊(duì)頭到 128時(shí),上其返回。 define W_MOD 127 //發(fā)送窗口隊(duì)列,意義同上。 在函數(shù) L2_TO_L1()中,有如下語(yǔ)句: linkstate_ptr = (head + 1) % W_MOD 。 這里當(dāng) head=126時(shí), = 0,這將造成發(fā)送窗口指針和隊(duì)列窗口 指針錯(cuò)位,造成鏈路復(fù)位 。 另外,在重發(fā)函數(shù) void INVOKE_RETRANSMISSION(_US logic_link,_US n_r)中,有如下語(yǔ)句: retran_num = (LinkState[logic_link].Vs + MOD128 (_UC)n_r) % MOD128 。 w_head = (LinkState[logic_link]. + W_MOD retran_num) % W_MOD 。 第一個(gè)語(yǔ)句求欲重發(fā) 的消息包個(gè)數(shù),第二個(gè)語(yǔ)句求重發(fā)的起始位置,當(dāng) Vs小于n_r時(shí),將造成實(shí)際重發(fā)數(shù)小于欲重發(fā)數(shù),同時(shí)造成實(shí)際起始重發(fā)位置和欲重發(fā)起始位置錯(cuò)開(kāi),從而引起鏈路復(fù)位。上面三個(gè)語(yǔ)句應(yīng)該做如下改動(dòng): linkstate_ptr = (head + 1) amp。 W_MOD 。 retran_num = (LinkState[logic_link].Vs + MOD128 + 1 (_UC)n_r) amp。 MOD128 。 w_head = (LinkState[logic_link]. + W_MOD + 1 retran_num) amp。 W_MOD 。 【結(jié) 論】:由于鏈路通信對(duì)系統(tǒng)效率要求很高,算法采用效率最高的,但位與( amp。)和求模( %)這小小的區(qū)別,造成的竟是鏈路復(fù)位這種嚴(yán)重的錯(cuò)誤。 【思考與啟示】:對(duì)這類問(wèn)題,大家在閱讀代碼或代碼審查時(shí)一定要注意,仔細(xì)一點(diǎn)往往能發(fā)現(xiàn)問(wèn)題,但在測(cè)試中來(lái)定位這種問(wèn)題,花費(fèi)的時(shí)間往往更長(zhǎng)。 注意數(shù)據(jù)類型的匹配 【案例 】 【案例描述】 下面通過(guò)測(cè)試中的一個(gè)例子來(lái)說(shuō) 明這個(gè)問(wèn)題:命令 DSP N7C是用來(lái)顯示 NO7電路狀態(tài)的,其參數(shù)設(shè)備類型 DID支持 TUP和 ISUP,參數(shù)信道號(hào) BSN支持多值輸入(最多支持 32路查詢),正常情況下該命令沒(méi)有問(wèn)題。但試了非正常情況下,問(wèn)題就出來(lái)了。 首先試 BSN參數(shù)越界情況,即參數(shù) BSN超過(guò) 32路查詢,選了幾個(gè)數(shù)據(jù)段,問(wèn)題就出來(lái)了。對(duì)于 0amp。amp。300和 0amp。amp。256,該命令返回結(jié)果不一致,對(duì)前者認(rèn)為參數(shù)越界,對(duì)后者返回執(zhí)行成功。 對(duì)于參數(shù) DID,選定一種設(shè)備類型( TUP或 ISUP),讓參數(shù) BSN所包含的32路電路跨越 TUP和 ISUP, 兩次結(jié)果是不一致的。 【處理過(guò)程】 反饋到開(kāi)發(fā)人員那里,第一個(gè)問(wèn)題是 BAM的問(wèn)題,第二個(gè)問(wèn)題是 SM的問(wèn)題。 【結(jié) 論】 為數(shù)據(jù)超出范圍溢出造成, int值賦值給 BYTE,造成數(shù)據(jù)丟失。 問(wèn)題的產(chǎn)生是因?yàn)椴樵兊牡谝粋€(gè)信道是 TUP電路,但是卻按 ISUP電路查詢。 ISUP的維護(hù)處理函數(shù)判斷第一個(gè)信道不是 ISUP信道,認(rèn)為整個(gè)的 PCM不是ISUP類型的 PCM,返回全部的電路狀態(tài)為未安裝。消息處理不合理。 TUP也會(huì)產(chǎn)生如此錯(cuò)誤。 【思考與啟示】 我們的 MML命令并不是無(wú)懈可擊的,許多表面上的小問(wèn)題, 往往隱藏著代碼的缺陷和錯(cuò)誤。 【案例 】 【正 文】 當(dāng)我們使用 PCLINT檢查代碼時(shí),會(huì)發(fā)現(xiàn)大量的數(shù)據(jù)類型不匹配的告警,大部分情況下,這種代碼上存在的問(wèn)題并不會(huì)引起程序功能實(shí)現(xiàn)上的錯(cuò)誤,但有些情況下,也許會(huì)產(chǎn)生嚴(yán)重的問(wèn)題: 一、不同數(shù)據(jù)類型變量之間賦值引起的問(wèn)題,實(shí)際上,該類問(wèn)題也可以分為幾種情況: 直接賦值,比如,把一個(gè) WORD型變量賦給一個(gè) INT型變量,如果WORD型變量大于 32767, INT型變量得到的就是一個(gè)負(fù)值了。 【例一】一次測(cè)試過(guò)程中發(fā) 現(xiàn), SDH送的告警在 BAM調(diào)試窗口打印出紅色提示: File(XXX),Line(XXX):Invalid alarm id ,from: 7, AlarmId: 65463 經(jīng)過(guò)檢查數(shù)據(jù)發(fā)現(xiàn),并沒(méi)有 ID為 65463的告警,分析上報(bào)的數(shù)據(jù)幀,發(fā)現(xiàn)上報(bào)的告警 ID為 B7,原來(lái)代碼中有一處強(qiáng)制類型轉(zhuǎn)換: = (WORD)RecvBuffer[iTmpLen + 5]。 char型強(qiáng)制轉(zhuǎn)換成 WORD型。 B7就變成了 FFB7,十進(jìn)制就是 65463。由于 char是有符號(hào)型, B7的第 8位為 1,所以轉(zhuǎn)換后為 FFB7,而不是代碼作者希望的 00B7,如果第 8位是 0,或該變量是 BYTE型,轉(zhuǎn)換就不會(huì)有問(wèn)題了。 函數(shù)形參和實(shí)參不一致,實(shí)際上和第一種情況本質(zhì)上是一樣的,只是表現(xiàn)的形式不太一樣
點(diǎn)擊復(fù)制文檔內(nèi)容
規(guī)章制度相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1