比如數組的越界,在循環操作時循環變量的控制問題,也有字符串拷貝時長度溢出,指針指向了非法的空間。還有就是申明一個指針,但卻沒有對其初始化。就直接引用。或者沒有開辟內存空間就釋放內存,以下是自己找的一些可能情況。當做提醒自己吧。
1.內存訪問越界
a) 因為使用錯誤的下標,導致數組訪問越界。
b) 搜索字符串時。依靠字符串結束符來推斷字符串是否結束,可是字符串沒有正常的使用結束符。
c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp等字符串操作函數。將目標字符串讀/寫爆。
應該使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函數防止讀寫越界。
d)訪問系統數據區,尤其是往系統保護的內存地址寫數據,內存越界(數組越界。變量類型不一致等) 訪問到不屬於你的內存區域。
2. 多線程程序使用了線程不安全的函數。
3. 多線程讀寫的數據未加鎖保護。對於會被多個線程同一時候訪問的全局數據。應該注意加鎖保護,否則非常easy造成core dump
4. 非法指針
a) 使用空指針
b) 任意使用指針轉換。
一個指向一段內存的指針。除非確定這段內存原先就分配為某種結構或類型,或者這樣的結構或類型的數組。否則不要將它轉換為這樣的結構或類型的指針,而應該將這段內存復制到一個這樣的結構或類型中。再訪問這個結構或類型。這是由於假設這段內存的開始地址不是依照這樣的結構或類型對齊的。那么訪問它時就非常easy由於bus error而core dump.
5 堆棧溢出。不要使用大的局部變量(由於局部變量都分配在棧上),這樣easy造成堆棧溢出,破壞系統的棧和堆結構。導致出現莫名其妙的錯誤。
另一個個問題是在調試時會有這種信息:Program terminated with signal SIGSEGV, Segmentation fault.
對於SIGSEGV這個信號。常常會和SIGBUS信號出如今一塊。
SIGBUS與SIGSEGV信號的一般差別例如以下:
1) SIGBUS(Bus error)意味着指針所相應的地址是有效地址,但總線不能正常使用該指針。
一般是未對齊的數據訪問所致。
2) SIGSEGV(Segment fault)意味着指針所相應的地址是無效地址,沒有物理內存相應該地址。