版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、第6章 檢查代碼 靜態(tài)白盒測試在不執(zhí)行軟件的條件下有條理的仔細審查軟件設計、體系結構和代碼,從而找出軟件缺陷的過程(結構化分析)。作用 盡早發(fā)現(xiàn)軟件缺陷,以找出動態(tài)黑盒測試難以發(fā)現(xiàn)或隔離的軟件缺陷 為黑盒測試員在接受軟件進行測試時設計和應用測試用例提供思路過程1 開發(fā)小組負責組織和執(zhí)行審查 負責靜態(tài)白盒測試的人是不固定的 軟件測試員被邀請作為觀察者16.1 靜態(tài)白盒測試過程2 軟件測試人是執(zhí)行人 編寫代碼的程序員和其它同事作為觀察者第6章 檢查代碼 正式審查執(zhí)行靜態(tài)白盒測試的過程保證審查效率的四個基本要素 確定問題找出軟件的問題所在出錯的項目、遺漏的項目對碼不對人! 遵守規(guī)則嚴格遵守固定規(guī)則,
2、設定審查代碼量、花費時間 準備參與者在審查會議前進行準備,包括事先閱讀文檔、代碼 編寫報告需要對審查過程進行書面總結正式審查 聚在一起復查代碼正式審查 聊天吃飯26.2 正式審查第6章 檢查代碼 正式審查同事審查(Peer Review) 伙伴審查:要求最低的正式方法 “你給我看你的代碼,我給你看我的代碼” 小團體:編寫代碼以及充當審查者的2-3個程序員和測試員走查(Walkthrough) 編寫代碼的程序員向5人小組(程序員和測試員)作正式陳述 審查人員中至少要有一位資深程序員 陳述者逐行解釋代碼,審查人員聆聽陳述,提出疑問檢驗(Inspection) 最正式的審查類型 表述者:不是編寫代碼
3、的程序員意義? 檢驗員:從不同的角度(用戶、產(chǎn)品人員、測試人員)審查代碼 協(xié)調(diào)員:會后與檢驗員共同準備書面報告36.2 正式審查第6章 檢查代碼 標準建立起來、經(jīng)過修補和必須遵守的規(guī)則做什么和不做什么沒有例外 規(guī)范建議最佳做法、推薦更好的方法相對標準松一些 代碼雖然可以正常運行,但是編寫不符合某種標準或規(guī)范“軟件測試2點周一下午上課” 堅持標準或規(guī)范的原因可靠性、可讀性、移植性46.3 編碼標準和規(guī)范第6章 檢查代碼 編碼風格風格是代碼的外表和感覺風格 標準/規(guī)范從軟件質(zhì)量和測試的角度看,風格不是問題在正式審查過程中,測試和注解的對象僅限于錯誤和缺漏,而不管是否堅持標準和規(guī)范 標準來源美國國家
4、標準學會(ANSI)國際工程協(xié)會(IEC)國際標準化組織(ISO)信息技術國家標準委員會(NCITS)中國電子工業(yè)標準化技術協(xié)會(CESA)56.3 編碼標準和規(guī)范第6章 檢查代碼 數(shù)據(jù)引用錯誤使用未經(jīng)正確聲明和初始化的變量、常量、數(shù)組、字符串或記錄而導致的軟件缺陷 數(shù)據(jù)聲明錯誤不正確的聲明或使用變量和常量 計算錯誤糟糕的數(shù)學問題,計算無法得到預期結果 比較錯誤可能由于邊界條件問題 控制流程錯誤編程語言中循環(huán)等控制結構未按預期方式工作66.4 通用代碼審查清單第6章 檢查代碼 子程序參數(shù)錯誤軟件子程序不正確的傳遞數(shù)據(jù) 輸入/輸出錯誤文件讀取、接受鍵盤等讀寫錯誤 其它檢查 國際化/本地化 移植到
5、其它編譯器或CPU 兼容性 程序編譯是否出現(xiàn)Warning76.4 通用代碼審查清單第6章 檢查代碼 靜態(tài)白盒測試的作用越早發(fā)現(xiàn)錯誤越好 調(diào)試代價昂貴定位和修復錯誤是非常困難和耗時的調(diào)試對80%的軟件項目延期有直接責任Microsoft所做的研究表明發(fā)現(xiàn)和改正一個編程錯誤平均需要12個小時有研究表明每千行代碼平均有6個錯誤處理軟件缺陷的正確方法是在第一時間防止錯誤進入代碼86.5 小結第6章 檢查代碼 編碼標準優(yōu)點 在開發(fā)中每天都堅持貫徹編碼標準,一定能夠減少錯誤的幾率,提高代碼質(zhì)量 良好的編碼標準將有效地幫助您避免開發(fā)有潛在危險的代碼缺點編碼標準應使開發(fā)人員的工作更容易而不是更困難96.5
6、小結第6章 檢查代碼 靜態(tài)白盒測試的概念 正式審查的三種形式 編碼標準和規(guī)范 通用代碼審查清單106.5 小結第6章 檢查代碼 “編程老手”真正的程序員沒有進度表,只有討好領導的馬屁精才有進度表,真正的程序員會讓領導提心吊膽。真正的程序員不寫使用說明書,用戶應當自己去猜想程序的功能。真正的程序員幾乎不寫代碼的注釋,如果注釋很難寫,它理所當然也很難讀。真正的程序員不畫流程圖,原始人和文盲才會干這事。真正的程序員不看參考手冊,新手和膽小鬼才會看。真正的程序員不寫文檔也不需要文檔,只有看不懂程序的笨蛋才用文檔。真正的程序員認為自己比用戶更明白用戶需要什么。真正的程序員不接受團隊開發(fā)的理念,除非他自己
7、是頭頭。真正的程序員的程序不會在第一次就正確運行,但是他們愿意守著機器進行若干個30小時的調(diào)試改錯。真正的程序員不會在上午9:00 到下午5:00 之間工作,如果你看到他在上午9:00工作,這表明他從昨晚一直干到現(xiàn)在。11延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 定義 1:能長期穩(wěn)定地編寫出高質(zhì)量程序的程序員稱為編程老手。 定義 2:能長期穩(wěn)定地編寫出高難度、高質(zhì)量程序的程序員稱為編程高手。12延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 程序的版式程序員的書法空行 在每個類聲明之后、每個函數(shù)定義結束之后都要加空行。 在一個函數(shù)體內(nèi),邏揖上密切相關的語句之間不加空行,其它地方應加空行分隔。
8、13延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 程序的版式程序員的書法代碼行 一行代碼只做一件事情,如只定義一個變量,或只寫一條語句。這樣的代碼容易閱讀,并且方便于寫注釋。 if、for、while、do 等語句自占一行,執(zhí)行語句不得緊跟其后。不論執(zhí)行語句有多少都要加。這樣可以防止書寫失誤。14延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 程序的版式程序員的書法代碼行內(nèi)的空格 關鍵字之后要留空格。象const、virtual、inline、case 等關鍵字之后至少要留一個空格,否則無法辨析關鍵字。象if、for、while 等關鍵字之后應留一個空格再跟左括號(,以突出關鍵字。 函數(shù)名之后不
9、要留空格,緊跟左括號(,以與關鍵字區(qū)別。 ,之后要留空格,如Function(x, y, z)。如果;不是一行的結束符號,其后要留空格,如for (initialization; condition; update)。 賦值操作符、比較操作符、算術操作符、邏輯操作符、位域操作符,如“=”、“+=” “=”、“=”、“+”、“*”、“%”、“&”、“|”、“”這類操作符前后不加空格。15延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 程序的版式程序員的書法對齊 程序的分界符和應獨占一行并且位于同一列,同時與引用它們的語句左對齊。 之內(nèi)的代碼塊在右邊數(shù)格處左對齊。16延伸知識:高質(zhì)量C/C+編程第6
10、章 檢查代碼 程序的版式程序員的書法長行拆分 代碼行最大長度宜控制在70 至80 個字符以內(nèi)。代碼行不要過長,否則眼睛看不過來,也不便于打印。 長表達式要在低優(yōu)先級操作符處拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要進行適當?shù)目s進,使排版整齊,語句可讀。17延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 程序的版式程序員的書法修飾符的位置 應當將修飾符 * 和 緊靠變量名。18延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 程序的版式程序員的書法注釋 注釋是對代碼的“提示”,而不是文檔。程序中的注釋不可喧賓奪主,注釋太多了會讓人眼花繚亂。注釋的花樣要少。 如果代碼本來就是清楚的
11、,則不必加注釋。否則多此一舉,令人厭煩。 邊寫代碼邊注釋,修改代碼同時修改相應的注釋,以保證注釋與代碼的一致性。不再有用的注釋要刪除。 注釋應當準確、易懂,防止注釋有二義性。錯誤的注釋不但無益反而有害。 盡量避免在注釋中使用縮寫,特別是不常用縮寫。 注釋的位置應與被描述的代碼相鄰,可以放在代碼的上方或右方,不可放在下方。 當代碼比較長,特別是有多重嵌套時,應當在一些段落的結束處加注釋,便于閱讀。19延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 程序的版式程序員的書法類的版式 類 火鍋 “以數(shù)據(jù)為中心”,重點關注類的內(nèi)部結構 將private 類型的數(shù)據(jù)寫在前面,而將public 類型的函數(shù)寫在
12、后面 “以行為為中心”,重點關注的是類應該提供什么樣的接口將public 類型的函數(shù)寫在前面,而將private 類型的數(shù)據(jù)寫在后面20延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 命名規(guī)則沒有一種命名規(guī)則可以讓所有的程序員贊同,程序設計教科書一般都不指不要化太多精力試圖發(fā)明世界上最好的命名規(guī)則,而應當制定一種令大多數(shù)項目成員滿意的命名規(guī)則,并在項目中貫徹實施。21延伸知識:高質(zhì)量C/C+編程int a;int b;int c;int z; int a1;int a2;int a3;int a100; 第6章 檢查代碼 命名規(guī)則共性規(guī)則標識符應當直觀且可以拼讀,可望文知意,不必進行“解碼”。
13、標識符最好采用英文單詞或其組合,便于記憶和閱讀。切忌使用漢語拼音來命名。程序中的英文單詞一般不會太復雜,用詞應當準確。例如不要把CurrentValue 寫成NowValue。標識符的長度應當符合“min-length & max-information”原則。 名字是否越長約好? maxval v.s. maxValueUntilOverflow 單字符的名字不好? i,j,k,m,n,x,y,z等通常用作函數(shù)內(nèi)局部變量命名規(guī)則盡量與操作系統(tǒng)或開發(fā)工具的風格保持一致。 Windows應用程序的標識符通常采用“大小寫”混排的方式,如AddChild Unix應用程序的標識符通常采用“小寫加下劃
14、線”的方式,如add_child22延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 命名規(guī)則共性規(guī)則程序中不要出現(xiàn)僅靠大小寫區(qū)分的相似的標識符。 int x, X;void foo(int x);void FOO(float x); 程序中不要出現(xiàn)標識符完全相同的局部變量和全局變量。變量的名字應當使用“名詞”或者“形容詞名詞”。 float value;float oldValue; float newValue; 全局函數(shù)的名字應當使用“動詞”或者“動詞名詞”(動賓詞組)。類的成員函數(shù)應當只使用“動詞”,被省略掉的名詞就是對象本身。 DrawBox(); / 全局函數(shù)box-Draw(); /
15、 類的成員函數(shù) 23延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 命名規(guī)則共性規(guī)則用正確的反義詞組命名具有互斥意義的變量或相反動作的函數(shù)等。 int minValue; int maxValue; int SetValue(); int GetValue(); 24延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 命名規(guī)則簡單的Windows應用程序命名規(guī)則 類名和函數(shù)名用大寫字母開頭的單詞組合而成。 class Node; / 類名 class LeafNode; / 類名void Draw(void); / 函數(shù)名void SetValue(int value); / 函數(shù)名變量和參數(shù)用小寫字
16、母開頭的單詞組合而成。 BOOL flag;int drawMode;常量全用大寫的字母,用下劃線分割單詞。 const int MAX = 100;const int MAX_LENGTH = 100; 25延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 命名規(guī)則簡單的Windows應用程序命名規(guī)則 靜態(tài)變量加前綴s_(表示static)。 void Init() static int s_initValue; / 靜態(tài)變量 如果不得已需要全局變量,則使全局變量加前綴g_(表示global)。 int g_howManyPeople; / 全局變量int g_howMuchMoney; / 全
17、局變量26延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 命名規(guī)則簡單的Windows應用程序命名規(guī)則 類的數(shù)據(jù)成員加前綴m_(表示member),這樣可以避免數(shù)據(jù)成員與成員函數(shù)的參數(shù)同名。 void Object:SetValue(int width, int height) m_width = width; m_height = height; 為了防止某一軟件庫中的一些標識符和其它軟件庫中的沖突,可以為各種標識符加上能反映軟件性質(zhì)的前綴。例如三維圖形標準OpenGL的所有庫函數(shù)均以gl開頭,所有常量(或宏定義)均以GL開頭。27延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 命名規(guī)則簡單的L
18、inux應用程序命名規(guī)則變量名必須有一定的意義,并且意義準確。 有一個變量用于保存圖書的數(shù)目,可以命名為number_of_book或者num_of_book。不建議使用i,因為它沒有意義。也不建議使用number或book,因為意義不準確。不建議大小寫混用,在命名中不包含變量類型。 int nCount; (Windows命名規(guī)則)在失去意義的情況下,盡量使用較短的變量名。 一個變量用于暫時存儲一個計數(shù)值tmp_count v.s. this_is_a_temperary_counter函數(shù)名應該以動詞開頭,因為函數(shù)是一組具有特定功能的語句塊。 一個函數(shù)用于取得外部輸入的數(shù)值get_inpu
19、t_number()28延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 內(nèi)存管理內(nèi)存分配方式 從靜態(tài)存儲區(qū)域分配。內(nèi)存在程序編譯的時候就已經(jīng)分配好,這塊內(nèi)存在程序的整個運行期間都存在。例如全局變量,static 變量。 在棧上創(chuàng)建。在執(zhí)行函數(shù)時,函數(shù)內(nèi)局部變量的存儲單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結束時這些存儲單元自動被釋放。棧內(nèi)存分配運算內(nèi)置于處理器的指令集中,效率很高,但是分配的內(nèi)存容量有限。 從堆上分配,亦稱動態(tài)內(nèi)存分配。程序在運行的時候用malloc 或new 申請任意多少的內(nèi)存,程序員自己負責在何時用free 或delete 釋放內(nèi)存。動態(tài)內(nèi)存的生存期由我們決定,使用非常靈活,但問題也最
20、多。29延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 內(nèi)存管理常見的內(nèi)存錯誤 內(nèi)存分配未成功,卻使用了它。在使用內(nèi)存之前檢查指針是否為NULLNULL。如果指針p 是函數(shù)的參數(shù),那么在函數(shù)的入口處用assert(p!=NULL)進行檢查。如果是用malloc 或new 來申請內(nèi)存,應該用if(p=NULL)或if(p!=NULL)進行防錯處理。 內(nèi)存分配雖然成功,但是尚未初始化就引用它。內(nèi)存的缺省初值究竟是什么并沒有統(tǒng)一的標準不要誤以為內(nèi)存的缺省初值全為零 內(nèi)存分配成功并且已經(jīng)初始化,但操作越過了內(nèi)存的邊界。在使用數(shù)組時經(jīng)常發(fā)生下標“多1”或者“少1”的操作30延伸知識:高質(zhì)量C/C+編程第6
21、章 檢查代碼 內(nèi)存管理常見的內(nèi)存錯誤 忘記了釋放內(nèi)存,造成內(nèi)存泄露。動態(tài)內(nèi)存的申請與釋放必須配對,程序中malloc 與free 的使用次數(shù)一定要相同,否則肯定有錯誤。 釋放了內(nèi)存卻繼續(xù)使用它。程序中的對象調(diào)用關系過于復雜,實在難以搞清楚某個對象究竟是否已經(jīng)釋放了內(nèi)存,此時應該重新設計數(shù)據(jù)結構,從根本上解決對象管理的混亂局面。函數(shù)的return 語句寫錯了,注意不要返回指向“棧內(nèi)存”的“指針”或者“引用”,因為該內(nèi)存在函數(shù)體結束時被自動銷毀。使用free 或delete 釋放了內(nèi)存后,沒有將指針設置為NULL。導致產(chǎn)生“野指針”。31延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 內(nèi)存管理指針與
22、數(shù)組的對比 數(shù)組要么在靜態(tài)存儲區(qū)被創(chuàng)建(如全局數(shù)組),要么在棧上被創(chuàng)建。數(shù)組名對應著(而不是指向)一塊內(nèi)存,其地址與容量在生命期內(nèi)保持不變,只有數(shù)組的內(nèi)容可以改變。 指針可以隨時指向任意類型的內(nèi)存塊,它的特征是“可變”,所以我們常用指針來操作動態(tài)內(nèi)存。指針遠比數(shù)組靈活,但也更危險。指針 數(shù)組32延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 內(nèi)存管理指針與數(shù)組的對比修改內(nèi)容33延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 內(nèi)存管理指針與數(shù)組的對比內(nèi)容復制與比較34延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 內(nèi)存管理指針與數(shù)組的對比計算內(nèi)存容量35延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 內(nèi)
23、存管理指針與數(shù)組的對比指針參數(shù)是如何傳遞內(nèi)存的?36延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 內(nèi)存管理指針與數(shù)組的對比指針參數(shù)是如何傳遞內(nèi)存的?37延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 內(nèi)存管理指針與數(shù)組的對比指針參數(shù)是如何傳遞內(nèi)存的?38延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 內(nèi)存管理指針與數(shù)組的對比指針參數(shù)是如何傳遞內(nèi)存的?39延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 內(nèi)存管理指針與數(shù)組的對比指針參數(shù)是如何傳遞內(nèi)存的?40延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 內(nèi)存管理指針與數(shù)組的對比free 和delete 把指針怎么啦?41延伸知識:高質(zhì)量C/C+編程第6章
24、 檢查代碼 內(nèi)存管理指針與數(shù)組的對比動態(tài)內(nèi)存會被自動釋放嗎? 指針消亡了,并不表示它所指的內(nèi)存會被自動釋放內(nèi)存泄露 內(nèi)存被釋放了,并不表示指針會消亡或者成了NULL 指針野指針42延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 內(nèi)存管理指針與數(shù)組的對比有了malloc/free 為什么還要new/delete ? malloc 與free 是C+/C 語言的標準庫函數(shù) malloc/free 是庫函數(shù)而不是運算符,不在編譯器控制權限之內(nèi),不能夠把執(zhí)行構造函數(shù)和析構函數(shù), 光用maloc/free 無法滿足動態(tài)對象的要求。 new/delete 是C+的運算符 運算符new能完成動態(tài)內(nèi)存分配和初始
25、化工作;運算符delete能完成清理與釋放內(nèi)存工作 如果用 free 釋放“new 創(chuàng)建的動態(tài)對象”,那么該對象因無法執(zhí)行析構函數(shù)而可能導致程序出錯。 如果用delete 釋放“malloc 申請的動態(tài)內(nèi)存”,理論上講程序不會出錯,但是該程序的可讀性很差43延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 內(nèi)存管理指針與數(shù)組的對比有了malloc/free 為什么還要new/delete ?44延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 內(nèi)存管理指針與數(shù)組的對比malloc/free 的使用要點 void * malloc(size_t size);用 malloc 申請一塊長度為length
26、的整數(shù)類型的內(nèi)存 int *p = (int *) malloc(sizeof(int) * length);malloc 返回值的類型是void *,所以在調(diào)用malloc 時要顯式地進行類型轉換,將void * 轉換成所需要的指針類型。malloc 函數(shù)本身并不識別要申請的內(nèi)存是什么類型,它只關心內(nèi)存的總字節(jié)數(shù),在 malloc 的“()”中使用sizeof 運算符是良好的風格 void free( void * memblock );如果p 是NULL 指針,那么free 對p 無論操作多少次都不會出問題。如果p 不是NULL 指針,那么free 對p連續(xù)操作兩次就會導致程序運行錯誤。4
27、5延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 內(nèi)存管理指針與數(shù)組的對比new/delete 的使用要點 內(nèi)部數(shù)據(jù)類型int *p2 = new intlength;new 內(nèi)置了sizeof、類型轉換和類型安全檢查功能 非內(nèi)部數(shù)據(jù)類型46延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 內(nèi)存管理指針與數(shù)組的對比new/delete 的使用要點 創(chuàng)建對象數(shù)組時,只能使用對象的無參數(shù)構造函數(shù)Obj *objects = new Obj100; / 創(chuàng)建100 個動態(tài)對象不能寫成Obj *objects = new Obj100(1); / 創(chuàng)建100 個動態(tài)對象的同時賦初值1 釋放對象數(shù)組時,留意不
28、要丟了符號delete objects; / 正確的用法delete objects; / 錯誤的用法47延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 一些有益的編程實踐 使用const提高函數(shù)的健壯性用const 修飾函數(shù)的參數(shù)(只能修飾輸入?yún)?shù)) 如果輸入?yún)?shù)采用“指針傳遞”,那么加const 修飾可以防止意外地改動該指針,起到保護作用。 void StringCopy(char *strDestination, const char *strSource); 如果輸入?yún)?shù)采用“值傳遞”,由于函數(shù)將自動產(chǎn)生臨時變量用于復制該參數(shù),該輸入?yún)?shù)本來就無需保護,所以不要加const 修飾。 不要
29、將函數(shù)void Func1(int x) 寫成void Func1(const int x) 如果輸入?yún)?shù)采用“引用傳遞” 對于非內(nèi)部數(shù)據(jù)類型的輸入?yún)?shù),應該將“值傳遞”的方式改為“const 引用傳遞”,目的是提高效率。例如將void Func(A a) 改為void Func(const A &a)。對于內(nèi)部數(shù)據(jù)類型的輸入?yún)?shù),不要將“值傳遞”的方式改為“const 引用傳遞”。48延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 使用const提高函數(shù)的健壯性用const 修飾函數(shù)的返回值 如果給以“指針傳遞”方式的函數(shù)返回值加const 修飾,那么函數(shù)返回值(即指針)的內(nèi)容不能被修改,該返
30、回值只能被賦給加const修飾的同類型指針。 const char * GetString(void); char *str = GetString(); const char *str = GetString(); 如果函數(shù)返回值采用“值傳遞方式”,由于函數(shù)會把返回值復制到外部臨時的存儲單元中,加const 修飾沒有任何價值。例如不要把函數(shù)int GetInt(void) 寫成const int GetInt(void)。const成員函數(shù) 任何不會修改數(shù)據(jù)成員的函數(shù)都應該聲明為const類型。如果在編寫const成員函數(shù)時,不慎修改了數(shù)據(jù)成員,或者調(diào)用了其它非const成員函數(shù),編譯器將指
31、出錯誤,這無疑會提高程序的健壯性。49延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 提高程序的效率時間效率 v.s. 空間效率全局效率 v.s. 局部效率 不要一味地追求程序的效率,應當在滿足正確性、可靠性、健壯性、可讀性等質(zhì)量因素的前提下,設法提高程序的效率。 以提高程序的全局效率為主,提高局部效率為輔。 在優(yōu)化程序的效率時,應當先找出限制效率的“瓶頸”,不要在無關緊要之處優(yōu)化。 先優(yōu)化數(shù)據(jù)結構和算法,再優(yōu)化執(zhí)行代碼。 有時候時間效率和空間效率可能對立,此時應當分析那個更重要,作出適當?shù)恼壑?。例如多花費一些內(nèi)存來提高性能。 不要追求緊湊的代碼,因為緊湊的代碼并不能產(chǎn)生高效的機器碼。50延伸知
32、識:高質(zhì)量C/C+編程第6章 檢查代碼 一些有益的建議 當心那些視覺上不易分辨的操作符發(fā)生書寫錯誤。 變量(指針、數(shù)組)被創(chuàng)建之后應當及時把它們初始化,以防止把未被初始化的變量當成右值使用。 當心變量的初值、缺省值錯誤,或者精度不夠。 當心數(shù)據(jù)類型轉換發(fā)生錯誤。盡量使用顯式的數(shù)據(jù)類型轉換(讓人們知道發(fā)生了什么事),避免讓編譯器輕悄悄地進行隱式的數(shù)據(jù)類型轉換。 當心變量發(fā)生上溢或下溢,數(shù)組的下標越界。 當心忘記編寫錯誤處理程序,當心錯誤處理程序本身有誤。 當心文件I/O 有錯誤。 避免編寫技巧性很高代碼。 不要設計面面俱到、非常靈活的數(shù)據(jù)結構。 如果原有的代碼質(zhì)量比較好,盡量復用它。但是不要修補
33、很差勁的代碼,應當重新編寫。 盡量使用標準庫函數(shù),不要“發(fā)明”已經(jīng)存在的庫函數(shù)。 盡量不要使用與具體硬件或軟件環(huán)境關系密切的變量。 把編譯器的選擇項設置為最嚴格狀態(tài)。 如果可能的話,使用PC-Lint、LogiScope 等工具進行代碼審查。51延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 內(nèi)存/字符串操作庫函數(shù) char *strcpy(char *dest, char *src) Copies the C string pointed by src into the array pointed by dest, including the terminating null characte
34、r. To avoid overflows, the size of the array pointed by destination shall be long enough to contain the same C string as source (including the terminating null character), and should not overlap in memory with source.52延伸知識:高質(zhì)量C/C+編程第6章 檢查代碼 內(nèi)存/字符串操作庫函數(shù) char *strncpy(char *dest, char *src, unsigned n) Copies the first num characters of src to dest. If the en
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 北京理工大學《植物生物學》2024 - 2025 學年第一學期期末試卷
- 軟件項目質(zhì)量管理
- 心理咨詢和輔導
- 2025年智能垃圾桶清潔十年技術報告
- 2026年文化娛樂產(chǎn)業(yè)虛擬現(xiàn)實報告
- 2026年及未來5年中國車廂底板市場運行態(tài)勢及行業(yè)發(fā)展前景預測報告
- 小學道德與法治教學中生命教育的實施路徑課題報告教學研究課題報告
- 藝術研究院試題及答案
- 幼兒園預防接種培訓課件
- 中國人民銀行清算總中心直屬企業(yè)銀清科技有限公司2026年度公開招聘備考題庫及答案詳解一套
- 承包團建燒烤合同范本
- 電力線通信技術
- 人工流產(chǎn)手術知情同意書
- 2025秋人教版七年級全一冊信息科技期末測試卷(三套)
- 教師三筆字培訓課件
- 鋼鐵燒結機脫硫脫硝施工方案
- 中國醫(yī)藥行業(yè)中間體出口全景分析:破解政策難題深挖全球紅利
- 搶工補償協(xié)議書
- 孕婦尿液捐獻協(xié)議書
- 賓館物資轉讓協(xié)議書
- BIM技術在建筑施工環(huán)境管理中的應用
評論
0/150
提交評論