第一篇:代碼檢查
代碼檢查
摘要:代碼檢查是白盒測試的一種靜態(tài)測試方法,是眾多軟件測試方法中發(fā)現(xiàn)軟件缺陷最有效的方法之一。本文結合國內外學者在相關領域的研究情況,介紹代碼檢查相關的基本概念、過程和分析方法。
關鍵字:白盒測試,代碼檢查,靜態(tài)分析,檢查規(guī)則
一、引言
按照測試時源代碼是否可見,軟件測試可以分為白盒測試和黑盒測試兩類。
白盒測試(結構測試),即邏輯驅動的測試,是在了解程序內部結構的基礎上,對程序的邏輯結構進行檢查,從中獲取測試數(shù)據(jù)。白盒測試關注的是測試用例執(zhí)行的程度或覆蓋程序邏輯結構的程度。白盒測試一般只應用于軟件開發(fā)階段。
白盒測試,又可按照是否需要運行程序,進一步細分為了靜態(tài)測試和動態(tài)測試兩種。通常情況下是按照先靜態(tài)后動態(tài)測試順序來實施。其中,靜態(tài)測試包括代碼檢查、靜態(tài)結構分析、代碼質量度量等測試內容。靜態(tài)測試既可以由人工進行,充分發(fā)揮人的邏輯思維優(yōu)勢,也可以借助軟件工具自動進行。
代碼檢查是一種對程序代碼進行靜態(tài)檢查。傳統(tǒng)的代碼檢查是通過人工閱讀代碼的方式,檢查軟件設計的正確性;用人腦模擬程序在計算機中的運行,仔細推敲、校驗和核實程序每一步的執(zhí)行結果,進而判斷其執(zhí)行邏輯、控制模型、算法和使用參數(shù)與數(shù)據(jù)的正確性。
在實踐中,代碼檢查比動態(tài)測試更有效率,能找到更多的缺陷,通常能發(fā)現(xiàn)30%~70%的邏輯設計和編碼缺陷。代碼檢查非常耗費時間,而且需要專業(yè)知識和經驗的積累。代碼檢查定位在編譯之后和動態(tài)測試之前進行,在檢查前,應準備好需求描述文檔、程序設計文檔、程序的源代碼清單、代碼編碼標準和代碼缺陷檢查表等。
代碼檢查可以發(fā)現(xiàn)的軟件問題包括:聲明或引用錯誤、函數(shù)/方法參數(shù)錯誤、語句不可達錯誤、數(shù)組越界錯誤、控制流錯誤、界面錯誤和輸入/輸出錯誤等。
1、代碼檢查
代碼檢查包括桌面檢查、代碼走查和代碼審查等方式,主要檢查代碼和設計的一致性,代碼對標準地遵循、可讀性,代碼邏輯表達的正確性,代碼結構的合理性等方面;發(fā)現(xiàn)違背程序編寫標準的問題,程序中不安全、不明確和模糊的部分,找出程序中不可移植部分、違背程序編程風格的問題,包括變量檢查、命名和類型檢查、程序邏輯檢查、程序語法檢查和程序結構檢查等內容。下面對代碼檢查的三種具體方式進行介紹。
桌面檢查
是一種傳統(tǒng)的檢查方法,由程序員檢查自己編寫的程序。程序員在程序通過編譯之后對源代碼代碼進行分析、檢驗,并補充相關的文檔,目的是發(fā)現(xiàn)程序中的錯誤。
代碼走查
代碼走查就是針對代碼,在假想的輸入情況下,逐行的瀏覽代碼,走查代碼中潛在的缺陷并記錄結果的過程。
代碼走查以小組會議方式進行,每小組3-5人。與代碼審查不同的是,走查要求與會者扮演計算機的角色讓測試用例沿被測程序的邏輯運行,是在模擬動態(tài)測試;而代碼審查更多的是靜態(tài)測試。
代碼審查
代碼審查是由一組人通過閱讀、討論和爭議對程序進行靜態(tài)分析的過程,以小組會的方式進行。
審查小組一般由若干程序員(包括程序代碼的設計者)和代碼檢查人員組成。會前把設計規(guī)格說明書、控制流程圖、程序文本以及要求、規(guī)范、錯誤檢查清單交給與會者,開會時程序作者朗讀解釋程序,其他人則集中精力,捕捉程序在結構、功能、編碼風格等方面的問題。
2、代碼檢查項
代碼檢查項即檢查代碼時,指定需要進行檢查的內容。具體如:檢查變量的交叉引用表;檢查標號的交叉引用表;檢查子程序、宏、函數(shù);等價性檢查;標準檢查;風格檢查;選擇、激活路徑;對照程序的規(guī)格說明,詳細閱讀代碼,逐字逐句分析;補充文檔。
檢查項可以作為依據(jù),用來編制代碼規(guī)則、規(guī)范和缺陷檢查表等。
3、編碼規(guī)范
編碼規(guī)范是程序編寫過程中必須遵循的一套事先約定或者已經制度化、標準化的規(guī)則集,一般會詳細的規(guī)定代碼的語法規(guī)則和語法格式。
一個良好的編碼規(guī)范能夠帶來許多好處:改善代碼質量;提高開發(fā)進度;增進團隊精神。對于軟件開發(fā)而言,采用好的編程規(guī)范,雖然不能徹底杜絕糟糕的代碼產生。但對于代碼檢查和將來的代碼維護,仍然是意義重大的。
4、缺陷檢查表
在進行人工代碼檢查時,使用代碼缺陷檢查表作為代碼檢查的參考依據(jù)。在軟件測試項目實踐中代碼缺陷檢查表又常被稱作代碼檢查清單。
代碼缺陷檢查表中一般包括開發(fā)人員容易出錯的地方和在以往的工作中遇到的典型錯誤。對應于不同的編程語言,代碼缺陷檢查表的具體內容將會有所不同。例如:對于C/C++語言代碼缺陷檢查表內容有以下幾部分:文件結構;文件的版式;命名規(guī)則;表達式與基本語句;常量;函數(shù)設計;內存管理;C++函數(shù)的高級特性;類的構造函數(shù)、析構函數(shù)和賦值函數(shù);類的高級特性;其他的常見問題等。
5、代碼檢查規(guī)則
在代碼檢查中,需要依據(jù)被測軟件的特點,選用適當?shù)臉藴逝c規(guī)范。在使用測試軟件進行自動化代碼檢查或輔助代碼檢查時,測試工具需要內置許多編碼規(guī)范。不同編程語言,對應的檢查規(guī)范有所不同。針對與C/C++語言的規(guī)則有以下幾類規(guī)則:通用規(guī)則、C++編碼規(guī)則、C編碼規(guī)則、Meyers-Klaus規(guī)則以及自定義規(guī)則。使用時,需要根據(jù)編程語言和被測程序的特點,選擇適當?shù)囊?guī)則進行檢查。
6、靜態(tài)分析
靜態(tài)分析是不執(zhí)行程序,而分析程序代碼的過程。源代碼被靜態(tài)分析器分析之后,得到的靜態(tài)分析結果,通??梢员硎境梢豢渺o態(tài)語法樹。其中包含了被測項目源代碼的靜態(tài)結構信息:基本代碼成分、程序結構、語句結構、類型和模板等信息。
程序代碼靜態(tài)分析的結果能夠給代碼檢查提供幫助。
三、代碼檢查過程
傳統(tǒng)的代碼檢查是一種靜態(tài)檢查程序的測試方法,通常以團隊的形式來進行。檢查團隊由程序作者,一個負責人,一個記錄員以及一些檢查員組成。首先需要一系列的準備工作,包括參與者的挑選和材料的準備。然后是個人準備階段,每個小組成員各自熟悉材料。個人準備階段后,就是實際的檢查會議。在會議上,檢查小組在假想的輸入下,由程序作者帶領,逐行的瀏覽代碼,評審代碼中潛在的缺陷。檢查小組根據(jù)發(fā)現(xiàn)缺陷的嚴重程度和類型對其進行分類,并將問題記錄下來供作者修正。會議后是作者的返工,作者匯報每個缺陷,最后確認每個缺陷已經被陳述過了。圖 11為傳統(tǒng)的代碼檢查過程。
圖 1 代碼檢查過程示意圖
代碼檢查過程中的兩個重要階段“個人準備”和“召開會議”階段有以下注意事項:
1、“個人準備”階段:
會前準備階段是檢查過程的一個關鍵階段,因為如果檢查者沒有為檢查做好充分的準備,檢查效果會大打折扣。如果有檢查人員沒有做好準備,主審員可取消其代碼檢查資格,甚至取消這次檢查會議。
檢查人員要熟悉檢查內容的相關文檔,了解程序背景、設計思想和編程方法,在讀懂、“吃”透代碼的基礎上,查出盡可能多的錯誤。
2、“召開會議”階段:
參與會議的檢查者應具有一定的專業(yè)技能和經驗,缺乏經驗的檢查人員必然缺乏合適的領域知識來深入理解材料;
參與會議的檢查者應做充分的個人準備,沒有做充分準備的檢查人員不能在檢查會中做出實質性的貢獻;
檢查會議的速度應進行控制,如果試圖在短時間內處理太多的材料,檢查效果也會大打折扣。現(xiàn)在較為常見的代碼檢查速度上的建議為:匯編代碼150行/小時,C語言150行/小時,而對于C++、Java這種面向對象語言,代碼檢查速度可以提高到200-300行/小時。
由此可見,代碼檢查適合于采用工具輔助的特性有:文檔處理,個人準備,會議支持,數(shù)據(jù)收集。
文檔處理
這是工具可支持的最明顯的領域。傳統(tǒng)的檢查要求分發(fā)每份文檔的復印件等,而將紙質的文檔替換成計算機式的文檔,不只是簡單的介質變更,更是提供了一種契機——提高文檔的可用性和表示性的機遇。
個人準備
首先,自動的缺陷檢測可以用來發(fā)現(xiàn)簡單的缺陷。如果簡單問題能被自動發(fā)現(xiàn),檢查員就能專注于更加復雜/困難的缺陷,以及那些不能被自動發(fā)現(xiàn)的、潛在的、可能帶來更大影響的問題。另外,自動化工具應該對個人準備階段提供更多的幫助。例如,檢查員可以利用檢查表以及其它支持文檔,并能很容易地交叉引用它們;還有些代碼輔助理解工具,可為檢查員理解程序、了解程序結構提供幫助。? 會議支持
一些成員由于某些原因,可能沒有花費足夠的時間來進行準備,但他們仍然參加會議并試圖掩蓋他們的過失。項目管理人員可以使用計算機監(jiān)控的個人準備時間信息,來剔除那些沒有做好個人準備的成員,或者督促他們投入更多的努力。
召開會議時,檢查員通常面對的是一堆枯燥的程序代碼,如果在代碼之外再結合一些圖、表等便于分析、理解代碼的信息,相信檢查會議可以進行得更加有序和高效。
數(shù)據(jù)收集
代碼檢查一個重要的部分就是度量信息的收集,用來提供反饋以改進檢查過程。度量信息包括會議時間、發(fā)現(xiàn)的缺陷、檢查花費的總時間等。根據(jù)這些數(shù)據(jù),可以來評價每一次代碼審查的質量,進而給出關于代碼審查的改進建議。
通過對檢查過程的部分階段提供計算機支持,代碼檢查可以進行得更加有效。使用計算機來支持檢查過程,可以提高效率,并增加檢查過程的嚴格性。
四、代碼檢查歷史數(shù)據(jù)
代碼檢查中的歷史數(shù)據(jù)本質是軟件問題(缺陷)。按照不同的代碼檢查角度,存在多種對缺陷分類的方法。對過往發(fā)現(xiàn)的軟件問題進行分析,總結出今后對于類似的代碼需要按照某種規(guī)則來加以檢查,這種的規(guī)則就是檢查清單上的一條清單項,代碼檢查清單就是大量規(guī)則的集合。此外,由于軟件問題總是以軟件問題報告為載體形式出現(xiàn),因此軟件問題報告也被通俗的理解為代碼檢查歷史數(shù)據(jù)。
下面對缺陷分類、代碼檢查清單和軟件問題報告加以研究。
1、缺陷分類
關于缺陷分類存在以下幾種常見的劃分方式:
1)按缺陷出現(xiàn)的區(qū)域分類
這種分類方式是最常見的缺陷分類方式。按照出現(xiàn)區(qū)域將代碼缺陷劃分為變量級、屬性級、函數(shù)/方法級和類級缺陷。其中,變量級、屬性級和部分函數(shù)/方法級的缺陷,與傳統(tǒng)的面向過程編程中的缺陷分類基本一致;而多數(shù)方法級缺陷和類級缺陷,則是針對面向對象技術編程特點提出的。
2)按檢測內容分類
分為沖突、一致性問題兩種。
沖突對應于文獻[1]中的基于確定性“信念”的判定,而一致性問題則對應于基于可能性“信念”的判定。
3)按對代碼的危害分類
按照對代碼的危害,一般分為浪費時間和空間;語義混淆;暴露封裝性,擴大使用權限;程序一致性問題;程序約束條件問題和空指針問題等。
2、代碼檢查清單(Checklist)
代碼檢查過程中,代碼檢查人員都會有一份代碼檢查清單。代碼檢查清單是一份為代碼檢查人員準備的缺陷檢查表,檢查表中開列所有可能與代碼有關的缺陷,并注明了檢查的內容、缺陷類型以及嚴重性。檢查清單是檢查代碼的依據(jù),代碼檢查人員根據(jù)它來發(fā)現(xiàn)并判斷問題。代碼檢查清單中會逐條列出所有應該檢查的缺陷種類,以及每條缺陷的各種特征,并且根據(jù)缺陷的嚴重程度和類型對其進行分類。通常每一條缺陷的特征描述如下:
1)缺陷描述:該缺陷的問題描述、舉例說明,以及相應的正確形式;
2)缺陷出現(xiàn)的區(qū)域:分別為表達式級、語句級、聲明級、模板缺陷、預處理缺陷、類級缺陷以及性能缺陷。表達式級、語句級、聲明級以及預處理的缺陷,主要面向過程程序中的缺陷;模板缺陷、類級缺陷,則是針對面向對象軟件的特點提出的;代碼冗余等歸為性能缺陷;
3)缺陷對代碼的危害:代碼中出現(xiàn)某種缺陷將會造成什么樣的影響。
例如,檢查表中一條缺陷的特征描述如下:
問題描述:指針所指內存釋放后沒有將指針賦為NULL。
舉例說明:
char *p=(char *)malloc(100);strcpy(p, “hello”);free(p);//p所指的內存被釋放,但是p所指的地址還是不變 …
if(p!=NULL)//沒有起到防錯的作用 { strcpy(p, “world”);//出錯 }
正確形式:在釋放內存的同時將指針置空。
char *p=(char *)malloc(100);strcpy(p, “hello”);free(p);p=NULL;//增加指針置空語句
…
if(p!=NULL){ strcpy(p, “world”);}
出現(xiàn)區(qū)域:語句級。
危害:指針被free釋放后其地址并不會自動發(fā)生改變(非NULL),p成為了“野”指針,這種情況下再對p進行操作,很容易造成程序崩潰,后果非常嚴重。而代碼檢查清單正是由若干條這樣的缺陷特征描述構成的。
3、軟件問題報告(Software Problem Report)
在軟件測試過程中,對于發(fā)現(xiàn)的每個軟件問題(缺陷),都要進行記錄該錯誤的特征和再現(xiàn)步驟等信息,以便相關人員分析和處理軟件問題。為了管理測試發(fā)現(xiàn)的軟件問題,通常要采用軟件問題報告數(shù)據(jù)庫,將每一個發(fā)現(xiàn)的軟件問題輸入到軟件問題報告數(shù)據(jù)庫中,軟件問題報告數(shù)據(jù)庫的每一條記錄稱為一個軟件問題報告。
軟件問題報告包括頭信息、簡述、操作步驟和注釋。
頭信息包括:被測試軟件名稱、版本號、缺陷或錯誤類型、可重復性、測試平臺、平臺語言、缺陷或錯誤范圍。并要求填寫完整和準確。
簡述是對缺陷或錯誤特征的簡單描述,可以使用短語或短句,要求簡練和準確。
操作步驟是描述該缺陷或錯誤出現(xiàn)的操作順序,要求完整、簡潔和準確。對命令、系統(tǒng)變量、選項要用大寫字母,對控件名稱等要加雙引號。
注釋一般是對缺陷或錯誤的附加描述,一般包括缺陷或錯誤現(xiàn)象的圖像,包括其他建議或注釋文字。
軟件問題報告是軟件測試過程中最重要的文檔之一。它記錄了軟件問題發(fā)生的環(huán)境,軟件問題的再現(xiàn)步驟以及性質的說明,而且還可以跟蹤軟件問題的處理過程和狀態(tài)。軟件問題的處理進程從一定角度反映了測試的進程和被測軟件的質量狀況及改善過程。
五、代碼檢查規(guī)則管理的研究
1、潛在的編碼規(guī)則和缺陷代碼模式
潛在的編碼規(guī)則(Implicit Coding Rules)和缺陷代碼模式(Bug Code Pattern)是Tomoko MATSUMURA在文獻[3,4]中針對代碼檢查實踐,提出的兩個相關的概念。
潛在的編碼規(guī)則
潛在的編碼規(guī)則包含以下幾個特征:
1)不同于在開發(fā)啟動時明確決定的“編碼規(guī)范”的規(guī)則,這些規(guī)則在長期的測試/維護過程中是潛伏的,對這些規(guī)則的發(fā)現(xiàn)是不可預見的。
2)這些規(guī)則很少在設計文檔或者特定的文檔中被清楚的描述。他們通常只存在于開發(fā)人員、測試/維護人員的記憶中。換言之,是一種尚未系統(tǒng)化的經驗積累和總結的結果。
3)不同于使用規(guī)范庫的公用規(guī)則。對于特定的軟件有其特定的規(guī)則,這也意味著對于不同的軟件有不同的潛在的編碼規(guī)則。
4)由于違反潛在的編碼規(guī)則導致的缺陷通常情況下不是那么容易發(fā)現(xiàn)的。其中相當多一部分只在特定的罕見的情況下發(fā)生,所以在早期要想發(fā)現(xiàn)這些問題是很困難的。
5)目前,還不存在好的工具或者檢查清單來發(fā)現(xiàn)違反潛在的編碼規(guī)則的代碼片段,通常的檢查工具(例如PC-Lint、Purify)和通用的檢查清單只能發(fā)現(xiàn)常見的問題。
6)為了減少違反潛在的編碼規(guī)則的現(xiàn)象的發(fā)生,而進行重構通常很困難。要重構一個軟件,準確理解代碼是非常必要的,然而,老的系統(tǒng)太復雜,并且沒有精確的文檔和了
解系統(tǒng)的專業(yè)維護人員??傊?,重構過期系統(tǒng)的代價很大,需要冒很大的風險。
缺陷代碼模式:違反潛在的編碼規(guī)則的編碼模式。
缺陷代碼模式不是肯定會導致缺陷的發(fā)生,一段符合缺陷代碼模式的代碼片段,并不意味著代碼片段一定就有缺陷,缺陷代碼模式只是疑似存在缺陷。另一方面,因為缺陷代碼模式是靜態(tài)的,沒有考慮到代碼片段之間的動態(tài)關聯(lián)。需要代碼檢查人員或者維護人員把符合缺陷代碼模式的代碼片段提出來,并判斷究竟是否存在缺陷。
在軟件開發(fā)過程中發(fā)現(xiàn)和建立缺陷代碼模式有三條主要途徑。其一:在進行代碼檢查過程中,代碼檢查人員發(fā)現(xiàn)一個軟件問題的同時,根據(jù)對該問題是否具備代表性和通用性等因素的考慮,確定是否建立一個缺陷代碼模式;其二:當軟件失效或者發(fā)生問題,檢查對應的代碼部分,發(fā)現(xiàn)并確定是否有潛在的編碼規(guī)范與之相關;其三:分析現(xiàn)存的代碼規(guī)范和積累的大量問題報告,從中提煉出潛在的編碼規(guī)則。
在文獻[3,4]中還給我們介紹了一個代碼缺陷檢測系統(tǒng)的大致工作流程,如2所示。
圖2 缺陷檢測模型系統(tǒng)的代碼檢查流程參考圖
2、C++代碼檢查規(guī)則類型
1)規(guī)則層次
在代碼檢查工作中常常可以發(fā)現(xiàn)這樣的現(xiàn)象:有些規(guī)則能在所有的項目中都能發(fā)現(xiàn)問題,另一些規(guī)則所能發(fā)現(xiàn)的問題只存在于某類項目中。
根據(jù)規(guī)則的這個特點,如圖 33中所示,參考文獻[2]中將代碼檢查規(guī)則分為兩個層次:
公共規(guī)則(General checks):用于檢查在大多數(shù)情況都有可能發(fā)生的缺陷。
項目相關規(guī)則(Project specific checks):用于在項目中檢查可能的缺陷。
圖 3 一個典型的代碼檢查規(guī)則清單節(jié)選圖
在項目中積累了大量軟件問題報告歷史數(shù)據(jù)的支持下,可以從中進一步細化出與項目或開發(fā)人員相關的檢查規(guī)則。
在學習任何一種計算機編程語言時,總是按照基本數(shù)據(jù)類型->表達式->語句->復雜語句->函數(shù)->整個程序體(類)的順序逐步學習的。事實上軟件正是按照這樣的順序自下而上逐層組建起來的,代碼缺陷作為軟件編程寫時的一種異常情況,毫不例外也是按照這樣層次的構建而成。在實際測試項目的代碼檢查過程中,我們發(fā)現(xiàn)在每個層次上都有可能存在潛在代碼缺陷,要找到引起軟件問題的根源,要求在盡可能低的層次上找到引發(fā)缺陷的代碼。正因如此,非常有必要在C++語法的每個層次上都建立相應的檢查元規(guī)則。
圖4為一個代碼檢查規(guī)則體系模型圖[2],圖中展示了在代碼檢查項目開始前,通過逐級組合各種元規(guī)則和規(guī)則形成新的檢查規(guī)則,最后形成了初始的檢查清單。在項目實踐中,經過對缺陷代碼模式的推導,進而得到擴展的檢查清單。初始檢查清單和擴展檢查清單本質上并沒有什么區(qū)別,只是因為形成的時間不同。
圖4 代碼檢查規(guī)則體系模型圖
在檢查代碼時我們有時會想要定義一個帶有否定意義的規(guī)則,如“在AA情況下如果沒有BB,則可能存在一個問題”。這類檢查規(guī)則采用自然語言描述比較容易,但是要用代碼實現(xiàn)起來往往并不簡單,并且對這類規(guī)則的定義和維護也比較麻煩。定義組合規(guī)則,是解決這類問題一種變通的方法。
下面簡單介紹一下定義組合規(guī)則的原理。如圖5中所示定義三個規(guī)則,“滿足情況AA”對應規(guī)則R1,“滿足在AA情況下出現(xiàn)BB”對應規(guī)則R2,將滿足R1但不滿足R2(即以!符號表示)組合則對應規(guī)則R3-“在AA情況下如果沒有BB,則可能存在一個問題”。
圖5 組合規(guī)則示例圖
根據(jù)前面討論,本文將代碼檢查的規(guī)則分類設計如下:
公共規(guī)則?
定義針對函數(shù)體(含)以上層次的檢查規(guī)則,在這些層次上出現(xiàn)的缺陷問題一般不容易精確到具體的代碼行。
關鍵字規(guī)則?
針對每個關鍵字定義的檢查規(guī)則。由于關鍵字是C++語法中一種最普通的元素,單獨使用關鍵字規(guī)則的意義不大,一般情況需要和語句、表達式規(guī)則或者復雜語句規(guī)則配合使用。
語句/表達式規(guī)則?
針對基本語句類型或基本表達式定義的規(guī)則,滿足對應結構的表達式,則可認為符合了相應的表達式規(guī)則。語句/表達式規(guī)則中可以包含多個關鍵字,在同一語句/表達式規(guī)則中包含的關鍵字地位是平等的,與檢查的先后次序無關。
復雜語句塊規(guī)則?
針對條件、開關選擇等多分支語句定義的規(guī)則,通常由關鍵字、語句/表達式進行組合來定義復雜語句塊,并在定義時可以進行嵌套,在定義復雜語句塊規(guī)則加入語句或表達式和復雜語句時需要考慮檢查的先后次序。
高級組合規(guī)則?
關鍵字規(guī)則、語句/表達式規(guī)則和復雜語句塊規(guī)則合稱為普通規(guī)則。
對于難以使用普通規(guī)則定義方式定義的復雜語義,需要定義高級組合規(guī)則。定義高級組合規(guī)則可以使用上面幾種規(guī)則作為基本單元,也可以嵌套使用其它組合規(guī)則。
圖6為一個由下至上、由多個缺陷代碼模式組合形成的組合規(guī)則結構圖。其中{}表示某條缺陷代碼模式對應的規(guī)則。
圖6 組合規(guī)則結構圖
六、代碼分析方法
1、靜態(tài)分析
靜態(tài)分析主要對源代碼進行詞法分析、語法分析,提取被分析程序的靜態(tài)信息,所提取的靜態(tài)信息是代碼缺陷檢測的基礎。靜態(tài)分析結果主要包括三部分信息:
程序定義信息:程序定義信息包含了程序中所有的定義和聲明信息,如類定義、方法和數(shù)據(jù)成員的定義、方法內局部變量的定義等。
程序結構信息:主要指方法內的控制流信息和方法間的調用關系。靜態(tài)分析器分析程序的語句分支、分支間的嵌套關系和方法調用,記錄方法的控制流信息和調用信息,構造語法樹。
分支內的變量操作:以方法控制流程中的分支為基本單元,記錄每一分支中各語句對各變量施加的操作和操作序列。
2、數(shù)據(jù)流分析
數(shù)據(jù)流分析也是一種靜態(tài)代碼檢查方法。它是在不通過計算機運行被測程序的條件下,利用預先進行靜態(tài)分析后獲取的信息,檢測對變量的賦值與使用操作中,是否存在不合理情況,即找出被測程序中是否存在變量在使用前未被賦值;變量在兩次賦值之間未被使用;一個變量在被賦值后是否未被使用等異常情況。
數(shù)據(jù)流分析目前的主要用途大多局限在編譯器的實現(xiàn)和優(yōu)化技術方面,而在代碼檢查系統(tǒng)中實用的數(shù)據(jù)流分析技術并不多見,主要集中在某幾種缺陷檢測上,如賦值引用異常檢測以及內存錯誤檢測,使用方式主要是定義數(shù)據(jù)流操作的符號,使用該符號系統(tǒng)構造數(shù)據(jù)流表達式(由數(shù)據(jù)操作符號構成的符號串),再分析該符號串來確定是否存在代碼缺陷。
數(shù)據(jù)流分析包括以下兩個步驟:一是分析程序的所有邏輯路徑;二是對所有邏輯路徑上的所有變量,分析其所有操作序列,然后將得到的操作序列輸入自動機進行分析。因此數(shù)據(jù)流分析方法不可避免的存在以下缺點:
1)信息量多,上面所述的數(shù)據(jù)流分析方法是一種窮舉法。事實上一個變量在大部分路徑上存在問題的幾率并不高,因此窮舉每個變量的所有操作序列不可避免的要分析很多正確的信息,而且信息量巨大;
2)組合爆炸,當程序復雜度增長時,該分析方法的復雜度呈幾何級數(shù)增長,并且當這種組合是建立在對所有邏輯路徑、所有變量的窮舉基礎上時,如果不能找到一個非常高效的算法,數(shù)據(jù)流分析方法將是一個非常低效的方法;
3)實用性低,上述兩點導致的數(shù)據(jù)流分析的實用性降低。
為緩解這些的缺點,數(shù)據(jù)流分析過程有許多改進方法,但實現(xiàn)都具有一定難度。本系統(tǒng)中數(shù)據(jù)流分析不是重點,采取的策略是盡可能簡化數(shù)據(jù)流分析的過程,或者在可能的情況下盡量避免數(shù)據(jù)流分析。
第二篇:有效檢查Java代碼的三個工具
有效檢查Java代碼的三個工具
Java項目最枯燥的一部分,也是程序員總是避而不談的一部分,就是檢查代碼。為了區(qū)塊括號、代碼縮進、Javadoc注釋以及命名約定而檢查其他人的上千行代碼的確是一件痛苦的事。更糟糕的是,通常代碼的檢查還受限于緊迫的項目進度。沒有足夠的時間對代碼的細節(jié)進行評估,因此代碼檢查經常變成了對代碼的美化練習。不管檢查者有多么好的意圖,優(yōu)化和邏輯檢查都退居次席。
Java代碼分析器減輕了這樣的痛苦
在面對這種情況的時候,Java代碼分析器正是對癥良藥。這些工具盡可能地將代碼檢查過程自動化。留給人工來做的就只有檢查類的缺陷以及核心邏輯并確定可能的優(yōu)化方法。優(yōu)化(去除不必要的實例化對象、檢查數(shù)據(jù)庫連接是否合理、確保數(shù)據(jù)在可能的情況下被緩存)對于任何代碼通常會帶來性能上的極大改進。
最近我接觸了各種代碼分析器。我覺得一個基本的最重要的功能是與常用IDE(如NetBeans、Eclipse、jEdit以及JDeveloper)的集成。有一些代碼檢查工具在查找錯誤方面很有效,但是它們需要你根據(jù)給出的錯誤行的行號手工來追蹤錯誤。這樣的工具使用起來太累人了。與IDE環(huán)境集成了的工具可以大大簡化這個過程,因為代碼檢查的結果是由所使用的IDE顯示的。你只需在錯誤上雙擊就可以在Java編輯器中到達錯誤代碼所在的行
我的試用心得
在我試用過的工具中,我發(fā)現(xiàn)其中三個工具十分強大并合乎與IDE集成的標準,它們是: PMD、Checkstyle 和 Jalopy。
PMD和Checkstyle
根據(jù)PMD的文檔,它會對代碼中的如下部分進行檢查:
未使用的本地變量
空的catch塊
未使用參數(shù)
空if語句
重復的import語句
未使用的私有方法
可能是Singletons的類
短/長變量及方法名字
Checkstyle檢查如下部分:
Javadoc注釋
命名約定
標題
Import語句
體積大小
空白
修飾符
塊
混合檢查(包活一些有用的比如非必須的System.out和printstackTrace)
它們的作用
不像PMD,Checkstyle能夠檢查Javadoc注釋;但是PMD提供了一項叫作CPD的很有用的功能,它檢查代碼的拷貝粘貼部分。我使用PMD找到的最頻繁的錯誤是未使用的import語句,未使用的私有變量以及意外重復拼寫。Checkstyle可以發(fā)現(xiàn)更多的錯誤。包括漏掉的Javadoc注釋,超過80個字符的行、不合約定的變量名、用tab來代替空格等等。兩個工具都允許創(chuàng)建自定義的規(guī)則。
如果想在你的組織中使用它們中的一個,Checkstyle似乎更好一些:它檢查公司編碼約定的大多數(shù)項目。如果增強代碼質量是主要目標,那PMD是一個好的選擇。但是如果你想要更多的功能并真正使用工具來修改代碼,應該試試Jalopy。
Jalopy
Jalopy是一個易于配置的源代碼格式程序,它能檢測并修補Java代碼中大量的習慣性缺陷。Jalopy更像一個代碼整理器而不是檢查器。Jalopy的插件現(xiàn)在已經支持大多數(shù)IDE,而且多數(shù)是無縫集成。我發(fā)現(xiàn)Jalopy特別強大,能夠干許多很酷的事情。例如,它可以修改代碼縮進、對齊括號、使行寬符合某個字符長度、插入相關的Javadoc注釋以及對import語句排序。Jalopy最好的地方是超級自定義功能。一個簡單的用戶界面就可以讓你選擇Jalopy的所有功能的開關,不需要XML配置文件。
不要浪費資源
我建議大家使用這些工具來代替那些費時費力卻收效甚微的人工代碼檢查工作。一旦使用這些工具將代碼檢查變成了一個相對輕松的任務,你就可以把代碼檢查作為一項普通工作而不是在項目結尾被進度逼得一團糟時做的事情。這些工具也提供了與Apache Ant的集成,因此你可以每天運行這些代碼檢查器,在編譯或執(zhí)行單元測試它們也能工作得很好。控制好你的代碼,并交付那些你真的認為是高質量的東西。
第三篇:中學代碼
010407師大附中
010301西安市第一中學
010202西安市第八十三中 010527西安中學
010101西安高級中學
碑林區(qū)
學校代碼學校名稱
010101西安高級中學(重點)010102西工大附中(重點)010103西安交大附中(重點)010104西安市第三中學(重點)010105西安市第六中學(重點)010106省建一中(重點)010107鐵一局子中(重點)010108西安市第二中學
010112西安市第二十六中學(重點)010113英才中學(重點)
010114西安市第八十二中學(重點)010115西安市第八十六中學 010116省建二中
010118西鐵一中(重點)010119西北大學附中(重點)010120西工院附中
010121理工大附中
010122建科大附中(重點)010128西鐵國際中學
010131西安市第八中學(重點)010133思源中學
010135西安交大陽光中學 010139西工大附中分校
010140西安交大附中分校 010144尊德中學
010146西安市六中分校(公辦)
新城區(qū)
學校代碼學校名稱
010202西安市第八十三中(重點)010203西安市第三十八中(重點)010205西安市第八十九中(重點)010206西安市第四十三中 010207西安市第三十九中
010208西安市第三十中學(重點)010209西安市第七十二中 010210自立中學(重點)
010211大華中學
010212省建三中
010213秦川中學
010214黃河中學(重點)
010215西光中學(重點)
010216華山中學(重點)
010217昆侖中學
010218東方中學(重點)
010221陜汽二校
010222自達中學
010237東方美術高中
蓮湖區(qū)
學校代碼學校名稱
010301西安市第一中學(重點)010302西安市第十中學(重點)010303西安市第十五中學
010304西安市第二十五中學 010305西安市第四十二中學
010306西安市第四十四中學(重點)010308信德中學
010309西安市第九十一中學 010310西電公司高中(重點)010312遠東一中(重點)
010313慶安中學(重點)
010316遠東二中(重點)
010318西安市外語學校(重點)010319益華中學
010320西安市第七十中學(重點)雁塔區(qū)
學校代碼學校名稱
010401西安市第四十五中學 010402西安市第四十六中學
010403西安市第五十三中學(重點)010405西安市育才中學(重點)010406西安市第八十五中學(重點)010407師大附中(重點)
010408西電科大附中(重點)010409東儀子中
010410交大二附中(重點)010411長安大學附中(重點)010413西科一中(重點)010415航天中學(重點)
010422師大實驗中學
010425博迪中學(重點)010427西電科大附中太白校區(qū) 010430高新一中(重點)010434唐南中學(重點)010436明達中學
010437交大二附中南校區(qū) 010439大唐中學
未央?yún)^(qū)
學校代碼學校名稱
010501西安市第十一中學 010502西安市第三十三中學 010503西安市第四十八中學 010504西安市第五十一中學 010505西安市第六十六中學
010506西安市第七十五中學(重點)010507西煤子校
010508陜重子校(重點)010509五二四子校
010510西航一中(重點)010511華山分廠子校
010513車輛廠子中(重點)010515陜棉十廠子中(重點)010516空導學院子校
010518海紅廠子校
010520華瑞中學
010521博愛中學
010522群星學校
010525和平中學
010526陜西師大錦園中學 010527西安中學(重點)
010528交大教育集團經發(fā)高級中學 010529長慶二中
灞橋區(qū)
學校代碼學校名稱
010601西安市第十九中學
010602西安市第三十四中學(重點)010603西安市第五十五中學 010604西安市第六十二中學
010605西安市第六十四中學(重點)010609四棉子中(重點)
010613西北電建四公司子校 010615慶華中學(重點)010620西安宇航中學
010621西安西港花園高級中學閆良區(qū)
學校代碼學校名稱
010701閆良二中
010702關山中學(重點)010703武屯中學
010704試飛院中學
010705西飛一中(重點)臨潼區(qū)
學校代碼學校名稱
010801華清中學(重點)010802臨潼中學(重點)010803馬額中學
010804雨金中學(重點)010805新豐中學
010806油槐中學
010807徐楊中學
010809陜鼓子校
010812臨潼鐵中
010813西北院子校
長安區(qū)
學校代碼學校名稱
010901長安一中(重點)010902長安二中(重點)010903長安十二中
010904長安四中(重點)010905長安五中
010906長安六中(重點)010907長安七中
010908長安八中
010909長安九中
010910長安十中
010913長安三中
周至縣
學校代碼學校名稱
011001周至一中
011002周至二中(重點)011003周至三中
011004周至四中
011005周至五中
011006周至六中
011007周至中學(重點)戶縣
學校代碼學校名稱
011101戶縣第一中學(重點)011102戶縣第二中學(重點)011103陜西實驗中學
011104戶縣第四中學(重點)011105戶縣第五中學
011107戶縣第七中學
011108戶縣第八中學
011109戶縣第三中學
011111戶縣第六中學
011112戶縣惠安中學(重點)011113戶縣電廠子校
高陵縣
學校代碼學校名稱
011201高陵一中(重點)011202高陵三中
藍田縣
學校代碼學校名稱
011301田家炳中學(重點)011302城關中學(重點)011303孟村中學
011304前衛(wèi)中學
011305焦岱中學
011306泄湖中學
011307玉山中學
011310藍田工業(yè)園高級中學
第四篇:部門代碼
部門代碼
總經理:GMD 行政人事部:AD 技術部:TD 發(fā)展部:RDD 宣傳部:PD 策劃部:SD 工程部:ED 造價部:EC 財務部:ACD 投融資部:FD 戰(zhàn)略計劃部:SPD 招標合約部:BCD 審計部:ADD 招商部:MD 研究院:RI 物業(yè)部:PD 后勤部:LD 資源管理部:RD
第五篇:原產地證書代碼
原產地證書優(yōu)惠貿易協(xié)定代碼
屬于“亞太貿易協(xié)定”項下的進口貨物填“01”;
屬于“中國-東盟自貿區(qū)”項下的進口貨物填“02”;
屬于“內地與香港緊密經貿關系安排”(香港CEPA)項下的進口貨物填“03”;
屬于“內地與澳門緊密經貿關系安排”(澳門CEPA)項下的進口貨物填“04”;
屬于“對非洲特惠待遇”項下的進口貨物填“05”;
屬于“臺灣水果零關稅措施”項下的進口貨物填“06”;
屬于“中巴自貿區(qū)”項下的進口貨物填“07”;
屬于“中智自貿區(qū)”項下的進口貨物填“08”。