通常我們程序跑飛的原因有以下幾個(gè)方面:
1 memset/ memcpy使用錯(cuò)誤
錯(cuò)誤代碼
aucCpyLength=NAME_DATA_LENGTH-((wucCdTextCmdBufferPara.stTagCmdPara.ucPageNo+1)*TAG_PAGE_LENGTH);
memset(pucCpyDestAdress + TAG_PAGE_LENGTH,0x00,aucCpyLength)
其中:NAME_DATA_LENGTH 為64
TAG_PAGE_LENGTH 為10
錯(cuò)誤原因
由于變量 wucCdTextCmdBufferPara.stTagCmdPara.ucPageNo 為6 ,導(dǎo)致aucCpyLength=64-70=0xFA ,由于之后調(diào)用memset函數(shù),導(dǎo)致pucCpyDestAdress 地址開始的0xFA個(gè)地址的內(nèi)容全部被改寫為0 ,導(dǎo)致在進(jìn)行引擎控制時(shí)指針變量運(yùn)算錯(cuò)誤而指向非法區(qū)域運(yùn)行,最終程序跑飛。
解決方法
1 memset函數(shù)調(diào)用前對(duì)長度進(jìn)行最大范圍的判斷容錯(cuò)處理,避免因長度超出范
圍而導(dǎo)致其它變量被修改。
2 對(duì)參與長度運(yùn)算的變量進(jìn)行檢討,避免在程序中賦上超出范圍的數(shù)值。
方法舉例
i f(NAME_DATA_LENGTH>=((wucCdTextCmdBufferPara.stTagCmdPara.ucPageNo+1)* TAG_PAGE_LENGTH ))
{
aucCpyLength=NAME_DATA_LENGTH-((wucCdTextCmdBufferPara.stTagCmdPara.ucPageNo+1)*TAG_PAGE_LENGTH);
memset(pucCpyDestAdress+ TAG_PAGE_LENGTH,0x00,aucCpyLength);
}
2 指針使用錯(cuò)誤
錯(cuò)誤代碼
INT8U* pucCDMode;
CDDRV_L1_wvdGetCDMP3Mode(pucCDMode);
其中函數(shù)原型void CDDRV_L1_wvdGetCDMP3Mode(INT8U* pucCDMode)
錯(cuò)誤原因 指針pucCDMode沒有被初始化就使用了。
解決方法
1 對(duì)指針pucCDMode初始化
2 使用自動(dòng)變量,通過自動(dòng)變量的地址進(jìn)行運(yùn)算。
方法舉例
INT8U pucCDMode;
CDDRV_L1_wvdGetCDMP3Mode(&pucCDMode);
3 數(shù)組控制錯(cuò)誤 { 當(dāng)nuiBTDrvOnePacketDataSize 大于nucBTDrvReceiveSaveBuffer數(shù)組大小時(shí)即nuiBTDrvOnePacketDataSize>200時(shí),導(dǎo)致 nucBTDrvReceiveSaveBuffer+200地址之后的內(nèi)容被改寫,最終導(dǎo)致程序跑飛。 取得數(shù)據(jù)的大小超過通信數(shù)組規(guī)定的大小范圍時(shí),丟棄錯(cuò)誤的數(shù)據(jù)或者作相應(yīng)的其他處理。也就是說對(duì)數(shù)組賦值時(shí)需要判斷是否超出范圍,如果超出范圍則進(jìn)行相應(yīng)處理。 在錯(cuò)誤的代碼前加入容錯(cuò)處理。
錯(cuò)誤代碼
for(nuiBTDrvUartRcvSvCnt=REC_DATA_CMDID_ADDR1;nuiBTDrvUartRcvSvCnt
nucBTDrvReceiveSaveBuffer[nuiBTDrvUartRcvSvCnt]=nucBTUartReceiveBuffer[nuiBTDrvUartRcvRp];
nuiBTDrvUartRcvRp++;
if(nuiBTDrvUartRcvRp >= RECEIVE_DATA_LENGTH_MAX){
nuiBTDrvUartRcvRp = BT_DRV_NULL;
}
}
其中nucBTDrvReceiveSaveBuffer定義大小為 200
錯(cuò)誤原因
這種情況發(fā)生在BT通信有干擾信號(hào)時(shí)才會(huì)產(chǎn)生。
解決方法
方法舉例
if(nuiBTDrvOnePacketDataSize >= RECEIVE_DATA_PROC_LENGTH)
{
nuiBTDrvOnePacketDataSize = RECEIVE_DATA_PROC_LENGTH;
}