在Linux上編寫運(yùn)行C語言程序,經(jīng)常會(huì)遇到程序崩潰、卡死等異常的情況。程序崩潰時(shí)最常見的就是程序運(yùn)行終止,報(bào)告Segmentation fault (core dumped)錯(cuò)誤。而程序卡死一般來源于代碼邏輯的缺陷,導(dǎo)致了死循環(huán)、死鎖等問題??偟膩砜矗R姷某绦虍惓栴}一般可以分為非法內(nèi)存訪問和資源訪問沖突兩大類。
非法內(nèi)存訪問(讀/寫):非法指針、多線程共享數(shù)據(jù)訪問沖突、內(nèi)存訪問越界、緩沖區(qū)溢出等。
資源訪問沖突:棧內(nèi)存溢出、堆內(nèi)存溢出、死鎖等。
一、非法內(nèi)存訪問
非法內(nèi)存訪問是最常見的程序異樣原因,可能開發(fā)者看的“表象”不盡相同,但是很多情況下都是由于非法內(nèi)存訪問引起的。
1. 非法指針
非法指針是最典型的非法內(nèi)存訪問案例,空指針、指向非法地址的指針是代碼中最常出現(xiàn)的錯(cuò)誤。
示例代碼如下:
long *ptr; *ptr = 0; &