版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、代碼檢查摘要:代碼檢查是白盒測(cè)試的一種靜態(tài)測(cè)試方法,是眾多軟件測(cè)試方法中發(fā)現(xiàn)軟件缺陷最有效的方法之一。本文結(jié)合國(guó)內(nèi)外學(xué)者在相關(guān)領(lǐng)域的研究情況,介紹代碼檢查相關(guān)的基本概念、過(guò)程和分析方法。關(guān)鍵字:白盒測(cè)試,代碼檢查,靜態(tài)分析,檢查規(guī)則一、 引言按照測(cè)試時(shí)源代碼是否可見(jiàn),軟件測(cè)試可以分為白盒測(cè)試和黑盒測(cè)試兩類。白盒測(cè)試(結(jié)構(gòu)測(cè)試),即邏輯驅(qū)動(dòng)的測(cè)試,是在了解程序內(nèi)部結(jié)構(gòu)的基礎(chǔ)上,對(duì)程序的邏輯結(jié)構(gòu)進(jìn)行檢查,從中獲取測(cè)試數(shù)據(jù)。白盒測(cè)試關(guān)注的是測(cè)試用例執(zhí)行的程度或覆蓋程序邏輯結(jié)構(gòu)的程度。白盒測(cè)試一般只應(yīng)用于軟件開(kāi)發(fā)階段。白盒測(cè)試,又可按照是否需要運(yùn)行程序,進(jìn)一步細(xì)分為了靜態(tài)測(cè)試和動(dòng)態(tài)測(cè)試兩種。通常情況下
2、是按照先靜態(tài)后動(dòng)態(tài)測(cè)試順序來(lái)實(shí)施。其中,靜態(tài)測(cè)試包括代碼檢查、靜態(tài)結(jié)構(gòu)分析、代碼質(zhì)量度量等測(cè)試內(nèi)容。靜態(tài)測(cè)試既可以由人工進(jìn)行,充分發(fā)揮人的邏輯思維優(yōu)勢(shì),也可以借助軟件工具自動(dòng)進(jìn)行。代碼檢查是一種對(duì)程序代碼進(jìn)行靜態(tài)檢查。傳統(tǒng)的代碼檢查是通過(guò)人工閱讀代碼的方式,檢查軟件設(shè)計(jì)的正確性;用人腦模擬程序在計(jì)算機(jī)中的運(yùn)行,仔細(xì)推敲、校驗(yàn)和核實(shí)程序每一步的執(zhí)行結(jié)果,進(jìn)而判斷其執(zhí)行邏輯、控制模型、算法和使用參數(shù)與數(shù)據(jù)的正確性。在實(shí)踐中,代碼檢查比動(dòng)態(tài)測(cè)試更有效率,能找到更多的缺陷,通常能發(fā)現(xiàn)30%70%的邏輯設(shè)計(jì)和編碼缺陷。代碼檢查非常耗費(fèi)時(shí)間,而且需要專業(yè)知識(shí)和經(jīng)驗(yàn)的積累。代碼檢查定位在編譯之后和動(dòng)態(tài)測(cè)試之
3、前進(jìn)行,在檢查前,應(yīng)準(zhǔn)備好需求描述文檔、程序設(shè)計(jì)文檔、程序的源代碼清單、代碼編碼標(biāo)準(zhǔn)和代碼缺陷檢查表等。代碼檢查可以發(fā)現(xiàn)的軟件問(wèn)題包括:聲明或引用錯(cuò)誤、函數(shù)/方法參數(shù)錯(cuò)誤、語(yǔ)句不可達(dá)錯(cuò)誤、數(shù)組越界錯(cuò)誤、控制流錯(cuò)誤、界面錯(cuò)誤和輸入/輸出錯(cuò)誤等。1、代碼檢查代碼檢查包括桌面檢查、代碼走查和代碼審查等方式,主要檢查代碼和設(shè)計(jì)的一致性,代碼對(duì)標(biāo)準(zhǔn)地遵循、可讀性,代碼邏輯表達(dá)的正確性,代碼結(jié)構(gòu)的合理性等方面;發(fā)現(xiàn)違背程序編寫標(biāo)準(zhǔn)的問(wèn)題,程序中不安全、不明確和模糊的部分,找出程序中不可移植部分、違背程序編程風(fēng)格的問(wèn)題,包括變量檢查、命名和類型檢查、程序邏輯檢查、程序語(yǔ)法檢查和程序結(jié)構(gòu)檢查等內(nèi)容。下面對(duì)代碼
4、檢查的三種具體方式進(jìn)行介紹。桌面檢查是一種傳統(tǒng)的檢查方法,由程序員檢查自己編寫的程序。程序員在程序通過(guò)編譯之后對(duì)源代碼代碼進(jìn)行分析、檢驗(yàn),并補(bǔ)充相關(guān)的文檔,目的是發(fā)現(xiàn)程序中的錯(cuò)誤。代碼走查代碼走查就是針對(duì)代碼,在假想的輸入情況下,逐行的瀏覽代碼,走查代碼中潛在的缺陷并記錄結(jié)果的過(guò)程。代碼走查以小組會(huì)議方式進(jìn)行,每小組3-5人。與代碼審查不同的是,走查要求與會(huì)者扮演計(jì)算機(jī)的角色讓測(cè)試用例沿被測(cè)程序的邏輯運(yùn)行,是在模擬動(dòng)態(tài)測(cè)試;而代碼審查更多的是靜態(tài)測(cè)試。代碼審查代碼審查是由一組人通過(guò)閱讀、討論和爭(zhēng)議對(duì)程序進(jìn)行靜態(tài)分析的過(guò)程,以小組會(huì)的方式進(jìn)行。審查小組一般由若干程序員(包括程序代碼的設(shè)計(jì)者)和代
5、碼檢查人員組成。會(huì)前把設(shè)計(jì)規(guī)格說(shuō)明書、控制流程圖、程序文本以及要求、規(guī)范、錯(cuò)誤檢查清單交給與會(huì)者,開(kāi)會(huì)時(shí)程序作者朗讀解釋程序,其他人則集中精力,捕捉程序在結(jié)構(gòu)、功能、編碼風(fēng)格等方面的問(wèn)題。2、代碼檢查項(xiàng)代碼檢查項(xiàng)即檢查代碼時(shí),指定需要進(jìn)行檢查的內(nèi)容。具體如:檢查變量的交叉引用表;檢查標(biāo)號(hào)的交叉引用表;檢查子程序、宏、函數(shù);等價(jià)性檢查;標(biāo)準(zhǔn)檢查;風(fēng)格檢查;選擇、激活路徑;對(duì)照程序的規(guī)格說(shuō)明,詳細(xì)閱讀代碼,逐字逐句分析;補(bǔ)充文檔。2 / 18檢查項(xiàng)可以作為依據(jù),用來(lái)編制代碼規(guī)則、規(guī)范和缺陷檢查表等。3、編碼規(guī)范編碼規(guī)范是程序編寫過(guò)程中必須遵循的一套事先約定或者已經(jīng)制度化、標(biāo)準(zhǔn)化的規(guī)則集,一般會(huì)詳細(xì)
6、的規(guī)定代碼的語(yǔ)法規(guī)則和語(yǔ)法格式。一個(gè)良好的編碼規(guī)范能夠帶來(lái)許多好處:改善代碼質(zhì)量;提高開(kāi)發(fā)進(jìn)度;增進(jìn)團(tuán)隊(duì)精神。對(duì)于軟件開(kāi)發(fā)而言,采用好的編程規(guī)范,雖然不能徹底杜絕糟糕的代碼產(chǎn)生。但對(duì)于代碼檢查和將來(lái)的代碼維護(hù),仍然是意義重大的。4、缺陷檢查表在進(jìn)行人工代碼檢查時(shí),使用代碼缺陷檢查表作為代碼檢查的參考依據(jù)。在軟件測(cè)試項(xiàng)目實(shí)踐中代碼缺陷檢查表又常被稱作代碼檢查清單。代碼缺陷檢查表中一般包括開(kāi)發(fā)人員容易出錯(cuò)的地方和在以往的工作中遇到的典型錯(cuò)誤。對(duì)應(yīng)于不同的編程語(yǔ)言,代碼缺陷檢查表的具體內(nèi)容將會(huì)有所不同。例如:對(duì)于C/C+語(yǔ)言代碼缺陷檢查表內(nèi)容有以下幾部分:文件結(jié)構(gòu);文件的版式;命名規(guī)則;表達(dá)式與基本
7、語(yǔ)句;常量;函數(shù)設(shè)計(jì);內(nèi)存管理;C+函數(shù)的高級(jí)特性;類的構(gòu)造函數(shù)、析構(gòu)函數(shù)和賦值函數(shù);類的高級(jí)特性;其他的常見(jiàn)問(wèn)題等。5、代碼檢查規(guī)則在代碼檢查中,需要依據(jù)被測(cè)軟件的特點(diǎn),選用適當(dāng)?shù)臉?biāo)準(zhǔn)與規(guī)范。在使用測(cè)試軟件進(jìn)行自動(dòng)化代碼檢查或輔助代碼檢查時(shí),測(cè)試工具需要內(nèi)置許多編碼規(guī)范。不同編程語(yǔ)言,對(duì)應(yīng)的檢查規(guī)范有所不同。針對(duì)與C/C+語(yǔ)言的規(guī)則有以下幾類規(guī)則:通用規(guī)則、C+編碼規(guī)則、C編碼規(guī)則、Meyers-Klaus規(guī)則以及自定義規(guī)則。使用時(shí),需要根據(jù)編程語(yǔ)言和被測(cè)程序的特點(diǎn),選擇適當(dāng)?shù)囊?guī)則進(jìn)行檢查。6、靜態(tài)分析靜態(tài)分析是不執(zhí)行程序,而分析程序代碼的過(guò)程。源代碼被靜態(tài)分析器分析之后,得到的靜態(tài)分析結(jié)果
8、,通??梢员硎境梢豢渺o態(tài)語(yǔ)法樹(shù)。其中包含了被測(cè)項(xiàng)目源代碼的靜態(tài)結(jié)構(gòu)信息:基本代碼成分、程序結(jié)構(gòu)、語(yǔ)句結(jié)構(gòu)、類型和模板等信息。程序代碼靜態(tài)分析的結(jié)果能夠給代碼檢查提供幫助。三、 代碼檢查過(guò)程傳統(tǒng)的代碼檢查是一種靜態(tài)檢查程序的測(cè)試方法,通常以團(tuán)隊(duì)的形式來(lái)進(jìn)行。檢查團(tuán)隊(duì)由程序作者,一個(gè)負(fù)責(zé)人,一個(gè)記錄員以及一些檢查員組成。首先需要一系列的準(zhǔn)備工作,包括參與者的挑選和材料的準(zhǔn)備。然后是個(gè)人準(zhǔn)備階段,每個(gè)小組成員各自熟悉材料。個(gè)人準(zhǔn)備階段后,就是實(shí)際的檢查會(huì)議。在會(huì)議上,檢查小組在假想的輸入下,由程序作者帶領(lǐng),逐行的瀏覽代碼,評(píng)審代碼中潛在的缺陷。檢查小組根據(jù)發(fā)現(xiàn)缺陷的嚴(yán)重程度和類型對(duì)其進(jìn)行分類,并將問(wèn)
9、題記錄下來(lái)供作者修正。會(huì)議后是作者的返工,作者匯報(bào)每個(gè)缺陷,最后確認(rèn)每個(gè)缺陷已經(jīng)被陳述過(guò)了。圖 11為傳統(tǒng)的代碼檢查過(guò)程。 圖 1 代碼檢查過(guò)程示意圖代碼檢查過(guò)程中的兩個(gè)重要階段“個(gè)人準(zhǔn)備”和“召開(kāi)會(huì)議”階段有以下注意事項(xiàng):1、“個(gè)人準(zhǔn)備”階段:會(huì)前準(zhǔn)備階段是檢查過(guò)程的一個(gè)關(guān)鍵階段,因?yàn)槿绻麢z查者沒(méi)有為檢查做好充分的準(zhǔn)備,檢查效果會(huì)大打折扣。如果有檢查人員沒(méi)有做好準(zhǔn)備,主審員可取消其代碼檢查資格,甚至取消這次檢查會(huì)議。檢查人員要熟悉檢查內(nèi)容的相關(guān)文檔,了解程序背景、設(shè)計(jì)思想和編程方法,在讀懂、“吃”透代碼的基礎(chǔ)上,查出盡可能多的錯(cuò)誤。2、“召開(kāi)會(huì)議”階段:參與會(huì)議的檢查者
10、應(yīng)具有一定的專業(yè)技能和經(jīng)驗(yàn),缺乏經(jīng)驗(yàn)的檢查人員必然缺乏合適的領(lǐng)域知識(shí)來(lái)深入理解材料;參與會(huì)議的檢查者應(yīng)做充分的個(gè)人準(zhǔn)備,沒(méi)有做充分準(zhǔn)備的檢查人員不能在檢查會(huì)中做出實(shí)質(zhì)性的貢獻(xiàn);檢查會(huì)議的速度應(yīng)進(jìn)行控制,如果試圖在短時(shí)間內(nèi)處理太多的材料,檢查效果也會(huì)大打折扣?,F(xiàn)在較為常見(jiàn)的代碼檢查速度上的建議為:匯編代碼150行/小時(shí),C語(yǔ)言150行/小時(shí),而對(duì)于C+、Java這種面向?qū)ο笳Z(yǔ)言,代碼檢查速度可以提高到200-300行/小時(shí)。由此可見(jiàn),代碼檢查適合于采用工具輔助的特性有:文檔處理,個(gè)人準(zhǔn)備,會(huì)議支持,數(shù)據(jù)收集。文檔處理這是工具可支持的最明顯的領(lǐng)域。傳統(tǒng)的檢查要求分發(fā)每份文檔的復(fù)印件等,而將紙質(zhì)的文
11、檔替換成計(jì)算機(jī)式的文檔,不只是簡(jiǎn)單的介質(zhì)變更,更是提供了一種契機(jī)提高文檔的可用性和表示性的機(jī)遇。個(gè)人準(zhǔn)備首先,自動(dòng)的缺陷檢測(cè)可以用來(lái)發(fā)現(xiàn)簡(jiǎn)單的缺陷。如果簡(jiǎn)單問(wèn)題能被自動(dòng)發(fā)現(xiàn),檢查員就能專注于更加復(fù)雜/困難的缺陷,以及那些不能被自動(dòng)發(fā)現(xiàn)的、潛在的、可能帶來(lái)更大影響的問(wèn)題。另外,自動(dòng)化工具應(yīng)該對(duì)個(gè)人準(zhǔn)備階段提供更多的幫助。例如,檢查員可以利用檢查表以及其它支持文檔,并能很容易地交叉引用它們;還有些代碼輔助理解工具,可為檢查員理解程序、了解程序結(jié)構(gòu)提供幫助。l 會(huì)議支持一些成員由于某些原因,可能沒(méi)有花費(fèi)足夠的時(shí)間來(lái)進(jìn)行準(zhǔn)備,但他們?nèi)匀粎⒓訒?huì)議并試圖掩蓋他們的過(guò)失。項(xiàng)目管理人員可以使用計(jì)算機(jī)監(jiān)控的個(gè)人
12、準(zhǔn)備時(shí)間信息,來(lái)剔除那些沒(méi)有做好個(gè)人準(zhǔn)備的成員,或者督促他們投入更多的努力。召開(kāi)會(huì)議時(shí),檢查員通常面對(duì)的是一堆枯燥的程序代碼,如果在代碼之外再結(jié)合一些圖、表等便于分析、理解代碼的信息,相信檢查會(huì)議可以進(jìn)行得更加有序和高效。數(shù)據(jù)收集代碼檢查一個(gè)重要的部分就是度量信息的收集,用來(lái)提供反饋以改進(jìn)檢查過(guò)程。度量信息包括會(huì)議時(shí)間、發(fā)現(xiàn)的缺陷、檢查花費(fèi)的總時(shí)間等。根據(jù)這些數(shù)據(jù),可以來(lái)評(píng)價(jià)每一次代碼審查的質(zhì)量,進(jìn)而給出關(guān)于代碼審查的改進(jìn)建議。通過(guò)對(duì)檢查過(guò)程的部分階段提供計(jì)算機(jī)支持,代碼檢查可以進(jìn)行得更加有效。使用計(jì)算機(jī)來(lái)支持檢查過(guò)程,可以提高效率,并增加檢查過(guò)程的嚴(yán)格性。四、 代碼檢查歷史數(shù)據(jù)代碼檢查中的歷
13、史數(shù)據(jù)本質(zhì)是軟件問(wèn)題(缺陷)。按照不同的代碼檢查角度,存在多種對(duì)缺陷分類的方法。對(duì)過(guò)往發(fā)現(xiàn)的軟件問(wèn)題進(jìn)行分析,總結(jié)出今后對(duì)于類似的代碼需要按照某種規(guī)則來(lái)加以檢查,這種的規(guī)則就是檢查清單上的一條清單項(xiàng),代碼檢查清單就是大量規(guī)則的集合。此外,由于軟件問(wèn)題總是以軟件問(wèn)題報(bào)告為載體形式出現(xiàn),因此軟件問(wèn)題報(bào)告也被通俗的理解為代碼檢查歷史數(shù)據(jù)。下面對(duì)缺陷分類、代碼檢查清單和軟件問(wèn)題報(bào)告加以研究。1、缺陷分類關(guān)于缺陷分類存在以下幾種常見(jiàn)的劃分方式:1)按缺陷出現(xiàn)的區(qū)域分類這種分類方式是最常見(jiàn)的缺陷分類方式。按照出現(xiàn)區(qū)域?qū)⒋a缺陷劃分為變量級(jí)、屬性級(jí)、函數(shù)/方法級(jí)和類級(jí)缺陷。其中,變量級(jí)、屬性級(jí)和部分函數(shù)/方
14、法級(jí)的缺陷,與傳統(tǒng)的面向過(guò)程編程中的缺陷分類基本一致;而多數(shù)方法級(jí)缺陷和類級(jí)缺陷,則是針對(duì)面向?qū)ο蠹夹g(shù)編程特點(diǎn)提出的。2)按檢測(cè)內(nèi)容分類分為沖突、一致性問(wèn)題兩種。沖突對(duì)應(yīng)于文獻(xiàn)1中的基于確定性“信念”的判定,而一致性問(wèn)題則對(duì)應(yīng)于基于可能性“信念”的判定。3)按對(duì)代碼的危害分類按照對(duì)代碼的危害,一般分為浪費(fèi)時(shí)間和空間;語(yǔ)義混淆;暴露封裝性,擴(kuò)大使用權(quán)限;程序一致性問(wèn)題;程序約束條件問(wèn)題和空指針問(wèn)題等。2、代碼檢查清單(Checklist)代碼檢查過(guò)程中,代碼檢查人員都會(huì)有一份代碼檢查清單。代碼檢查清單是一份為代碼檢查人員準(zhǔn)備的缺陷檢查表,檢查表中開(kāi)列所有可能與代碼有關(guān)的缺陷,并注明了檢查的內(nèi)容、
15、缺陷類型以及嚴(yán)重性。檢查清單是檢查代碼的依據(jù),代碼檢查人員根據(jù)它來(lái)發(fā)現(xiàn)并判斷問(wèn)題。代碼檢查清單中會(huì)逐條列出所有應(yīng)該檢查的缺陷種類,以及每條缺陷的各種特征,并且根據(jù)缺陷的嚴(yán)重程度和類型對(duì)其進(jìn)行分類。通常每一條缺陷的特征描述如下:1)缺陷描述:該缺陷的問(wèn)題描述、舉例說(shuō)明,以及相應(yīng)的正確形式;2)缺陷出現(xiàn)的區(qū)域:分別為表達(dá)式級(jí)、語(yǔ)句級(jí)、聲明級(jí)、模板缺陷、預(yù)處理缺陷、類級(jí)缺陷以及性能缺陷。表達(dá)式級(jí)、語(yǔ)句級(jí)、聲明級(jí)以及預(yù)處理的缺陷,主要面向過(guò)程程序中的缺陷;模板缺陷、類級(jí)缺陷,則是針對(duì)面向?qū)ο筌浖奶攸c(diǎn)提出的;代碼冗余等歸為性能缺陷;3)缺陷對(duì)代碼的危害:代碼中出現(xiàn)某種缺陷將會(huì)造成什么樣的影響。例如,檢
16、查表中一條缺陷的特征描述如下:?jiǎn)栴}描述:指針?biāo)竷?nèi)存釋放后沒(méi)有將指針賦為NULL。舉例說(shuō)明:char *p=(char *) malloc(100) strcpy(p, "hello");free(p); /p所指的內(nèi)存被釋放,但是p所指的地址還是不變if(p!=NULL) /沒(méi)有起到防錯(cuò)的作用 strcpy(p, "world"); /出錯(cuò) 正確形式:在釋放內(nèi)存的同時(shí)將指針置空。
17、60;char *p=(char *) malloc(100) strcpy(p, "hello");free(p); p=NULL; /增加指針置空語(yǔ)句if(p!=NULL) strcpy(p, "world"); 出現(xiàn)區(qū)域:語(yǔ)句級(jí)。危害:指針被free釋放后其地址并不會(huì)自動(dòng)發(fā)生改變(非NULL),p成為了“野”指針,這種情況下再對(duì)p進(jìn)行操作,很容易造成程序崩潰,后果非常嚴(yán)重。而代碼
18、檢查清單正是由若干條這樣的缺陷特征描述構(gòu)成的。 3、軟件問(wèn)題報(bào)告(Software Problem Report)在軟件測(cè)試過(guò)程中,對(duì)于發(fā)現(xiàn)的每個(gè)軟件問(wèn)題(缺陷),都要進(jìn)行記錄該錯(cuò)誤的特征和再現(xiàn)步驟等信息,以便相關(guān)人員分析和處理軟件問(wèn)題。為了管理測(cè)試發(fā)現(xiàn)的軟件問(wèn)題,通常要采用軟件問(wèn)題報(bào)告數(shù)據(jù)庫(kù),將每一個(gè)發(fā)現(xiàn)的軟件問(wèn)題輸入到軟件問(wèn)題報(bào)告數(shù)據(jù)庫(kù)中,軟件問(wèn)題報(bào)告數(shù)據(jù)庫(kù)的每一條記錄稱為一個(gè)軟件問(wèn)題報(bào)告。軟件問(wèn)題報(bào)告包括頭信息、簡(jiǎn)述、操作步驟和注釋。 頭信息包括:被測(cè)試軟件名稱、版本號(hào)、缺陷或錯(cuò)誤類型、可重復(fù)性、測(cè)試平臺(tái)、平臺(tái)語(yǔ)言、缺陷或錯(cuò)誤范圍。并要求填寫完整和準(zhǔn)確。 簡(jiǎn)述是對(duì)缺陷或錯(cuò)誤特征的簡(jiǎn)單描述
19、,可以使用短語(yǔ)或短句,要求簡(jiǎn)練和準(zhǔn)確。 操作步驟是描述該缺陷或錯(cuò)誤出現(xiàn)的操作順序,要求完整、簡(jiǎn)潔和準(zhǔn)確。對(duì)命令、系統(tǒng)變量、選項(xiàng)要用大寫字母,對(duì)控件名稱等要加雙引號(hào)。 注釋一般是對(duì)缺陷或錯(cuò)誤的附加描述,一般包括缺陷或錯(cuò)誤現(xiàn)象的圖像,包括其他建議或注釋文字。 軟件問(wèn)題報(bào)告是軟件測(cè)試過(guò)程中最重要的文檔之一。它記錄了軟件問(wèn)題發(fā)生的環(huán)境,軟件問(wèn)題的再現(xiàn)步驟以及性質(zhì)的說(shuō)明,而且還可以跟蹤軟件問(wèn)題的處理過(guò)程和狀態(tài)。軟件問(wèn)題的處理進(jìn)程從一定角度反映了測(cè)試的進(jìn)程和被測(cè)軟件的質(zhì)量狀況及改善過(guò)程。五、 代碼檢查規(guī)則管理的研究1、潛在的編碼規(guī)則和缺陷代碼模式潛在的編碼規(guī)則(Implicit Coding Rules)
20、和缺陷代碼模式(Bug Code Pattern)是Tomoko MATSUMURA在文獻(xiàn)3,4中針對(duì)代碼檢查實(shí)踐,提出的兩個(gè)相關(guān)的概念。潛在的編碼規(guī)則潛在的編碼規(guī)則包含以下幾個(gè)特征:1)不同于在開(kāi)發(fā)啟動(dòng)時(shí)明確決定的“編碼規(guī)范”的規(guī)則,這些規(guī)則在長(zhǎng)期的測(cè)試/維護(hù)過(guò)程中是潛伏的,對(duì)這些規(guī)則的發(fā)現(xiàn)是不可預(yù)見(jiàn)的。2)這些規(guī)則很少在設(shè)計(jì)文檔或者特定的文檔中被清楚的描述。他們通常只存在于開(kāi)發(fā)人員、測(cè)試/維護(hù)人員的記憶中。換言之,是一種尚未系統(tǒng)化的經(jīng)驗(yàn)積累和總結(jié)的結(jié)果。3)不同于使用規(guī)范庫(kù)的公用規(guī)則。對(duì)于特定的軟件有其特定的規(guī)則,這也意味著對(duì)于不同的軟件有不同的潛在的編碼規(guī)則。4)由于違反潛在的編碼規(guī)則導(dǎo)
21、致的缺陷通常情況下不是那么容易發(fā)現(xiàn)的。其中相當(dāng)多一部分只在特定的罕見(jiàn)的情況下發(fā)生,所以在早期要想發(fā)現(xiàn)這些問(wèn)題是很困難的。5)目前,還不存在好的工具或者檢查清單來(lái)發(fā)現(xiàn)違反潛在的編碼規(guī)則的代碼片段,通常的檢查工具(例如PC-Lint、Purify)和通用的檢查清單只能發(fā)現(xiàn)常見(jiàn)的問(wèn)題。6)為了減少違反潛在的編碼規(guī)則的現(xiàn)象的發(fā)生,而進(jìn)行重構(gòu)通常很困難。要重構(gòu)一個(gè)軟件,準(zhǔn)確理解代碼是非常必要的,然而,老的系統(tǒng)太復(fù)雜,并且沒(méi)有精確的文檔和了解系統(tǒng)的專業(yè)維護(hù)人員??傊?,重構(gòu)過(guò)期系統(tǒng)的代價(jià)很大,需要冒很大的風(fēng)險(xiǎn)。缺陷代碼模式:違反潛在的編碼規(guī)則的編碼模式。缺陷代碼模式不是肯定會(huì)導(dǎo)致缺陷的發(fā)生,一段符合缺陷代碼
22、模式的代碼片段,并不意味著代碼片段一定就有缺陷,缺陷代碼模式只是疑似存在缺陷。另一方面,因?yàn)槿毕荽a模式是靜態(tài)的,沒(méi)有考慮到代碼片段之間的動(dòng)態(tài)關(guān)聯(lián)。需要代碼檢查人員或者維護(hù)人員把符合缺陷代碼模式的代碼片段提出來(lái),并判斷究竟是否存在缺陷。在軟件開(kāi)發(fā)過(guò)程中發(fā)現(xiàn)和建立缺陷代碼模式有三條主要途徑。其一:在進(jìn)行代碼檢查過(guò)程中,代碼檢查人員發(fā)現(xiàn)一個(gè)軟件問(wèn)題的同時(shí),根據(jù)對(duì)該問(wèn)題是否具備代表性和通用性等因素的考慮,確定是否建立一個(gè)缺陷代碼模式;其二:當(dāng)軟件失效或者發(fā)生問(wèn)題,檢查對(duì)應(yīng)的代碼部分,發(fā)現(xiàn)并確定是否有潛在的編碼規(guī)范與之相關(guān);其三:分析現(xiàn)存的代碼規(guī)范和積累的大量問(wèn)題報(bào)告,從中提煉出潛在的編碼規(guī)則。在文獻(xiàn)
23、3,4中還給我們介紹了一個(gè)代碼缺陷檢測(cè)系統(tǒng)的大致工作流程,如2所示。圖2 缺陷檢測(cè)模型系統(tǒng)的代碼檢查流程參考圖2、C+代碼檢查規(guī)則類型1)規(guī)則層次在代碼檢查工作中常常可以發(fā)現(xiàn)這樣的現(xiàn)象:有些規(guī)則能在所有的項(xiàng)目中都能發(fā)現(xiàn)問(wèn)題,另一些規(guī)則所能發(fā)現(xiàn)的問(wèn)題只存在于某類項(xiàng)目中。根據(jù)規(guī)則的這個(gè)特點(diǎn),如圖 33中所示,參考文獻(xiàn)2中將代碼檢查規(guī)則分為兩個(gè)層次:公共規(guī)則(General checks):用于檢查在大多數(shù)情況都有可能發(fā)生的缺陷。項(xiàng)目相關(guān)規(guī)則(Project specific checks):用于在項(xiàng)目中檢查可能的缺陷。圖 3 一個(gè)典型的代碼檢查規(guī)則清單節(jié)選圖在項(xiàng)目中積累了大
24、量軟件問(wèn)題報(bào)告歷史數(shù)據(jù)的支持下,可以從中進(jìn)一步細(xì)化出與項(xiàng)目或開(kāi)發(fā)人員相關(guān)的檢查規(guī)則。在學(xué)習(xí)任何一種計(jì)算機(jī)編程語(yǔ)言時(shí),總是按照基本數(shù)據(jù)類型>表達(dá)式>語(yǔ)句>復(fù)雜語(yǔ)句>函數(shù)>整個(gè)程序體(類)的順序逐步學(xué)習(xí)的。事實(shí)上軟件正是按照這樣的順序自下而上逐層組建起來(lái)的,代碼缺陷作為軟件編程寫時(shí)的一種異常情況,毫不例外也是按照這樣層次的構(gòu)建而成。在實(shí)際測(cè)試項(xiàng)目的代碼檢查過(guò)程中,我們發(fā)現(xiàn)在每個(gè)層次上都有可能存在潛在代碼缺陷,要找到引起軟件問(wèn)題的根源,要求在盡可能低的層次上找到引發(fā)缺陷的代碼。正因如此,非常有必要在C+語(yǔ)法的每個(gè)層次上都建立相應(yīng)的檢查元規(guī)則。圖4為一個(gè)代碼檢查規(guī)則體系模
25、型圖2,圖中展示了在代碼檢查項(xiàng)目開(kāi)始前,通過(guò)逐級(jí)組合各種元規(guī)則和規(guī)則形成新的檢查規(guī)則,最后形成了初始的檢查清單。在項(xiàng)目實(shí)踐中,經(jīng)過(guò)對(duì)缺陷代碼模式的推導(dǎo),進(jìn)而得到擴(kuò)展的檢查清單。初始檢查清單和擴(kuò)展檢查清單本質(zhì)上并沒(méi)有什么區(qū)別,只是因?yàn)樾纬傻臅r(shí)間不同。圖4 代碼檢查規(guī)則體系模型圖在檢查代碼時(shí)我們有時(shí)會(huì)想要定義一個(gè)帶有否定意義的規(guī)則,如“在AA情況下如果沒(méi)有BB,則可能存在一個(gè)問(wèn)題”。這類檢查規(guī)則采用自然語(yǔ)言描述比較容易,但是要用代碼實(shí)現(xiàn)起來(lái)往往并不簡(jiǎn)單,并且對(duì)這類規(guī)則的定義和維護(hù)也比較麻煩。定義組合規(guī)則,是解決這類問(wèn)題一種變通的方法。下面簡(jiǎn)單介紹一下定義組合規(guī)則的原理。如圖5中所示定義
26、三個(gè)規(guī)則,“滿足情況AA”對(duì)應(yīng)規(guī)則R1,“滿足在AA情況下出現(xiàn)BB”對(duì)應(yīng)規(guī)則R2, 將滿足R1但不滿足R2(即以!符號(hào)表示)組合則對(duì)應(yīng)規(guī)則R3“在AA情況下如果沒(méi)有BB,則可能存在一個(gè)問(wèn)題”。圖5 組合規(guī)則示例圖根據(jù)前面討論,本文將代碼檢查的規(guī)則分類設(shè)計(jì)如下: 公共規(guī)則l定義針對(duì)函數(shù)體(含)以上層次的檢查規(guī)則,在這些層次上出現(xiàn)的缺陷問(wèn)題一般不容易精確到具體的代碼行。 關(guān)鍵字規(guī)則l針對(duì)每個(gè)關(guān)鍵字定義的檢查規(guī)則。由于關(guān)鍵字是C+語(yǔ)法中一種最普通的元素,單獨(dú)使用關(guān)鍵字規(guī)則的意義不大,一般情況需要和語(yǔ)句、表達(dá)式規(guī)則或者復(fù)雜語(yǔ)句規(guī)則配合使用。 語(yǔ)句/表達(dá)式規(guī)則l
27、針對(duì)基本語(yǔ)句類型或基本表達(dá)式定義的規(guī)則,滿足對(duì)應(yīng)結(jié)構(gòu)的表達(dá)式,則可認(rèn)為符合了相應(yīng)的表達(dá)式規(guī)則。語(yǔ)句/表達(dá)式規(guī)則中可以包含多個(gè)關(guān)鍵字,在同一語(yǔ)句/表達(dá)式規(guī)則中包含的關(guān)鍵字地位是平等的,與檢查的先后次序無(wú)關(guān)。 復(fù)雜語(yǔ)句塊規(guī)則l針對(duì)條件、開(kāi)關(guān)選擇等多分支語(yǔ)句定義的規(guī)則,通常由關(guān)鍵字、語(yǔ)句/表達(dá)式進(jìn)行組合來(lái)定義復(fù)雜語(yǔ)句塊,并在定義時(shí)可以進(jìn)行嵌套,在定義復(fù)雜語(yǔ)句塊規(guī)則加入語(yǔ)句或表達(dá)式和復(fù)雜語(yǔ)句時(shí)需要考慮檢查的先后次序。 高級(jí)組合規(guī)則l關(guān)鍵字規(guī)則、語(yǔ)句/表達(dá)式規(guī)則和復(fù)雜語(yǔ)句塊規(guī)則合稱為普通規(guī)則。對(duì)于難以使用普通規(guī)則定義方式定義的復(fù)雜語(yǔ)義,需要定義高級(jí)組合規(guī)則。定義高級(jí)組合規(guī)則可以使用上面幾種規(guī)則作為基本單元,也可以嵌套使用其它組合規(guī)則。圖6為一個(gè)由下至上、由多個(gè)缺陷代碼模式組合形成的組合規(guī)則結(jié)構(gòu)圖。其中表示某條缺陷代碼模式對(duì)應(yīng)的規(guī)則。圖6 組合規(guī)則結(jié)構(gòu)圖六、 代碼分析方法1、靜態(tài)分析靜態(tài)分析主要對(duì)源代碼進(jìn)行詞法分析、語(yǔ)法分析,提取被分析程序的靜態(tài)信息,所提取的靜態(tài)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度環(huán)保型木托盤綠色采購(gòu)與銷售協(xié)議4篇
- 2025年度個(gè)人房產(chǎn)買賣及裝修工程管理協(xié)議3篇
- 2025年度牛羊肉批發(fā)市場(chǎng)租賃經(jīng)營(yíng)合同書模板4篇
- 二零二五年度出口代理服務(wù)合同樣本(含售后服務(wù))
- 2025年度高速鐵路沿線打井及地質(zhì)勘察合同4篇
- 二零二五年度虛擬現(xiàn)實(shí)游戲用戶免責(zé)條款合同范本4篇
- 二零二五年度出院患者隱私保護(hù)協(xié)議書范本4篇
- 二零二五版女方隱瞞病情男方主張解除婚姻合同3篇
- 2025年數(shù)據(jù)中心消防系統(tǒng)安裝與檢測(cè)合同3篇
- 2025年度物流倉(cāng)儲(chǔ)設(shè)施融資擔(dān)保合同3篇
- 骨髓穿刺課件
- 鄉(xiāng)村治理中正式制度與非正式制度的關(guān)系解析
- 2024版義務(wù)教育小學(xué)數(shù)學(xué)課程標(biāo)準(zhǔn)
- 智能護(hù)理:人工智能助力的醫(yī)療創(chuàng)新
- 國(guó)家中小學(xué)智慧教育平臺(tái)培訓(xùn)專題講座
- 5G+教育5G技術(shù)在智慧校園教育專網(wǎng)系統(tǒng)的應(yīng)用
- VI設(shè)計(jì)輔助圖形設(shè)計(jì)
- 淺談小學(xué)勞動(dòng)教育的開(kāi)展與探究 論文
- 2023年全國(guó)4月高等教育自學(xué)考試管理學(xué)原理00054試題及答案新編
- 河北省大學(xué)生調(diào)研河北社會(huì)調(diào)查活動(dòng)項(xiàng)目申請(qǐng)書
- JJG 921-2021環(huán)境振動(dòng)分析儀
評(píng)論
0/150
提交評(píng)論