個人讀《編寫高質量代碼改善c++程序的150個建議》摘錄的重點_第1頁
已閱讀1頁,還剩5頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、個人讀《編寫高質量代碼:改善C程序的150個建議》摘錄的重點本人主要從事底層驅動的編寫,因此主要閱讀了《編寫高質量代碼:改善C程序的150個建議》其中的C語言的部分,對于自己認為重要的點記錄于此(呵呵,其實每點都重要)1.不要讓不要讓main函數(shù)寫成函數(shù)寫成voidmain要想保證程序具有良好的可移植性能,就要標明main函數(shù)返回int,而不是void。強烈建議使用以下形式:intmain()someprocessingcodesret

2、urn02.賦值符賦值符“=”和運算符和運算符“==”的區(qū)別的區(qū)別下面的代碼就是一個典型的例子:if(nValue=0)dosomethingifnValueisnotzero.顯然,程序員的本意是要寫if(nValue==0)。不幸的是,上述語句雖未達成程序員的本意,但它卻完全是合法的,編譯器不會給出任何錯誤提示。C語句首先會將nValue賦值為0,然后再判斷nValue是否為非零。結果就是if條件始終不能被滿足,大括號中的代碼永遠不

3、會被執(zhí)行。針對=和==之間的問題,通過良好的代碼習慣可以避免,代碼如下所示:if(0==nValue)dosomethingifnValueisnotzero.其他幾對容易弄錯的運算符是boolisGradeOne=((nGrade《TheCProgrammingLauguage》(程序員親切地稱此書為“K&R”)中反復強調,函數(shù)參數(shù)也好,某個操作符中的操作數(shù)也罷,表達式求值次序是不一定的,每個特定機器、操作系統(tǒng)、編譯器也都不一樣。例如

4、:a=p()q()r()三個函數(shù)p()、q()和r()可能以6種順序中的任何一種被評估求值。乘法運算符的高優(yōu)級只能保證q()和r()的返回值首先相乘,然后再加到p()的返回值上。所以,就算l=0w=0h=05.不要忘記指針變量的初始化不要忘記指針變量的初始化指針是CC語言編程中最給力的工具。指針,讓我們直接去面對最為神秘的內(nèi)存空間,賦予我們對內(nèi)存進行直接操作的能力。為對于全局變量來說,在聲明的同時,編譯器會悄悄完成對變量的初始化。使用未

5、初始化的局部指針變量是件很危險的事,所以,在使用局部指針變量時,一定要及時將其初始化。6.時刻提防內(nèi)存溢出時刻提防內(nèi)存溢出在內(nèi)存空間中,當要表示的數(shù)據(jù)超出了計算機為該數(shù)據(jù)分配的空間范圍時,就產(chǎn)生了溢出,而溢出的多余數(shù)據(jù)則可以作為指令在計算機中大搖大擺地運行,這樣很容易造成程序崩潰。C語言中的字符串庫沒有采用相應的安全保護措施,所以在使用時要特別小心。例如在執(zhí)行strcpy、strcat等函數(shù)操作時沒有檢查緩沖區(qū)大小,就會很容易引起安全問

6、題。現(xiàn)在分析下面的代碼片段:constintMAX_DATA_LENGTH=32voidDataCopy(szSrcData)szDestData[MAX_DATA_LENGTH]strcpy(szDestDataszSrcData)原文這里有筆誤strcpy(cDestszData)processingcodes...似乎這段代碼不存在什么問題,但是細心的讀者還是會發(fā)其中的危險。如果數(shù)據(jù)源szSrcDatar的長度不超過規(guī)定的長度,那

7、么這段代碼確實沒什么問題。strcpy()不會在乎數(shù)據(jù)來源,也不會檢查字符串長度,唯一能讓它停下來的只有字符串結束符0。不過,如果沒有遇到這個結束符,它就會一個字節(jié)一個字節(jié)地復制szSrcData的內(nèi)容,在填滿32字節(jié)的預設空間后,溢出的字符就會取代緩沖區(qū)后面的數(shù)據(jù)。如果這些溢出的數(shù)據(jù)恰好覆蓋了后面DataCopy函數(shù)的返回地址,在該函數(shù)調用完畢后,程序就會轉入攻擊者設定的“返回地址”中,乖乖地進入預先設定好的陷阱。為了避免落入這樣的圈

8、套,給作惡者留下可乘之機,當CC代碼處理來自用戶的數(shù)據(jù)時,應該處處留意。如果一個函數(shù)的數(shù)據(jù)來源不可靠,又要用到內(nèi)存緩沖區(qū),那么必須提高警惕,必須知道內(nèi)存緩沖區(qū)的總長度,并檢驗內(nèi)存緩沖區(qū)。constintMAX_DATA_LENGTH=32voidDataCopy(szSrcDataDWDnDataLen)szDestData[MAX_DATA_LENGTH]if(nDataLenMAX_DATA_LENGTH)strcpy(szDest

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論