犯過的錯誤就要避免下次再犯罐盔,因此,決定采取《代碼大全》里面的方法却特,對最近編程中遇到的bug以及原因進行梳理扶供,并整理出常犯錯誤檢查清單,作為以后編程的核心步驟之一裂明。
一椿浓、bug詳情
1.關于日志打印的bug
%s與int類型不匹配,%格式與參數(shù)個數(shù)不匹配
2.訪問null指針
在異常分支情況下闽晦,訪問了null指針
3.關于指針的加法
目的是(char *)ptr + num扳碍,結果寫成了ptr + num,導致對內存越界寫值
4.分支覆蓋檢查
如果goto和return混用仙蛉,容易造成return之前申請的內存泄漏
如果所有分支檢查不全左腔,會導致有的流程有問題,比如釋放鎖兩次
二捅儒、為什么會引入這些bug
1.最根本的原因還是缺乏必要的常犯錯誤清單
這上面的所有錯誤我之前自己都處理過,但是不對代碼進行必要的錯誤清單核查振亮,很容易遺漏巧还。
2.忽視了編譯器告警
編譯器告警能提供豐富的錯誤信息,比如所類型不匹配
3.忽視了core文件的分析
這個需要熟練使用gdb
三坊秸、怎樣將錯誤數(shù)減到最少麸祷,甚至不犯錯
1.對自己寫的每一句代碼都要理解清楚,理解其目的和上下文之間的作用和關系
首先語法要正確褒搔,其次在各種情況下要正確(正常阶牍、異常分支)
2.根據(jù)自己常犯的錯誤,制定自己的錯誤核查清單星瘾,每一次對代碼的修改走孽,都要對所有相關模塊按照清單核查一遍。
3.借助編譯器的warning信息
4.讓別人幫忙走查自己的源代碼
5.對于很難定位的bug(一般都是指針琳状、內存引起的)磕瓷,要熟練使用gdb調試。
6.學習使用各種內存、反匯編技術來加深對代碼的理解和問題的排查
四困食、根據(jù)之前翻過的錯誤边翁,確定自己初步的錯誤核查清單
1.所有變量是否都正確初始化
2.指針在使用前檢查是否為null
3.指針的加法是否正確
4.確保數(shù)組不越界訪問
5.確保循環(huán)不變式成立
6.對同一個臨時變量的多次使用確保每次都正確初始化
7.函數(shù)傳參,如果是指針硕盹,需要注意值的改變
8.所有指針都要正確賦值符匾,null或者正確的值
9.注意對所有分支進行檢查,同時注意goto和return不混用
10.動態(tài)內存泄漏檢查
11.加鎖瘩例、解鎖的檢查啊胶,尤其是所有分支都正確
?另外確保無嵌套、無死鎖