內存填充越界 + malloc空間不夠導致越界

【創建時間: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值確定。而我在填充的時候注意到了,但是在申請填充內存
		空間實際時卻沒有考慮到兩字節,導致填充時越界,出現程序自動崩潰。
	收穫:
		在處理一個問題時,一定要先了解清楚其原理,例如像素格式會影響決定每個像素點的顏色的字節數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章