【創建時間:2014-11-1 11:50】
[2014-10-31]:環境:系統:Linux版本:3.08 平臺:Hisi3516c。
內存填充越界:
問題:
申請了一個2048字節局部靜態的變量存儲一個固定RGB值,方便後續畫框、線時快速copy。但是在第一次賦固定值時,越界了,導致內核自動向應用程序 發送信號
SIGBUS(7)給應用程序,導致應用程序異常退出。
static char s_DefColor[2048] = {};
static char s_fillflag = 1;
//錯誤代碼:
if(1 == s_fillflag)
{
int cycle =0;
unsigned short color = 0xfc00;
s_fillflag = 0;
for(;cycle < 2048;cycle++)
{
memcpy(s_DefColor + (cycle <<1), &color,2);//由於每次移動兩個字節,而循環了2048次,導致數據填充越界,
//當cycle >= 1024時,填充的位置爲位置區域,所以系統發送
//SIGBUS(7)給應用程序,導致應用程序異常退出。
}
}
//更正後的代碼
if(1 == s_fillflag)
{
int cycle =0;
unsigned short color = 0xfc00;
s_fillflag = 0;
for(;cycle < 1024;cycle++)
{
memcpy(s_DefColor + (cycle <<1), &color,2);//由於每次移動兩個字節,而循環了2048次,導致數據填充越界,
//當cycle >= 1024時,填充的位置爲位置區域,所以系統發送
//SIGBUS(7)給應用程序,導致應用程序異常退出。
}
}
收穫:
1、在寫程序時一定要打印出每次收到的系統信號值,方便快速定位到是什麼問題導致程序崩潰。
2、在使用指針時,一定要注意內存是否越界。
Malloc空間不夠導致越界:
問題:
由於像素格式爲ARG1555,所以每個像素點的顏色實際有兩個字節的ARGB值確定。而我在填充的時候注意到了,但是在申請填充內存
空間實際時卻沒有考慮到兩字節,導致填充時越界,出現程序自動崩潰。
收穫:
在處理一個問題時,一定要先了解清楚其原理,例如像素格式會影響決定每個像素點的顏色的字節數。