總會有一個人需要你的分享~!- 唐風 -
作者:orangeRed3Stones唐風m.shnenglu.com/liyiwen轉(zhuǎn)載請注明出處
在一個團隊進行軟件開發(fā)的過程中,一般都會制定一個大家共同遵守的編碼規(guī)范,程序員遵循良好的編碼規(guī)范寫程序有很多好處: 1.有助于程序的維護,降低軟件生命周期成本,符合項目管理的規(guī)律; 2.使團隊中相關人員的流動對項目的影響盡可能小,有利于項目的控制與管理 3.提高程序的可讀性,有利于相關設計人員交流,提高軟件質(zhì)量 4.有利于形成可管理,可重用的團隊后備資源 5.有利于軟件工程相關產(chǎn)品元素的SCM
并且,通過建立代碼編寫規(guī)范,可以提高程序的可靠性、可讀性、可修改性、可維護性、一致性,保證程序代碼的質(zhì)量,繼續(xù)軟件開發(fā)成果,充分利用資源。提高程序的可繼續(xù)性,使開發(fā)人員之間的工作成果可以共享。這是遵守規(guī)范進行代碼編寫是程序員的基本素質(zhì)。
如果對編碼規(guī)范進行人肉檢查,無疑是非常費時費力,效果不好。使用自動化的工作來進行檢查顯然是一個更好的執(zhí)行方法。為了這個目標,我們就研究了下使用C++ Test進行代碼靜態(tài)檢查。
C++Test是一個C/C++自動單元測試工具,自動測試C/C++類、函數(shù)或部件,自動生成測試用例、測試驅(qū)動程序或樁調(diào)用,無需手工編寫。C++Test能夠自動測試代碼構造(白盒測試)、測試代碼的功能性(黑盒測試)和維護代碼的完整性(回歸測試),并提供自動覆蓋率測試。同時C++Test還是一個C/C++編程規(guī)范自動檢查工具,它內(nèi)置了800多條業(yè)界規(guī)則,同時可以圖形化地定制自己的規(guī)則,C++ Test進行靜態(tài)測試(自動編程規(guī)范檢查)有以下優(yōu)點: 1.Pattern Matching(自動代碼走查) 2.內(nèi)置800多條業(yè)界有名的C/C++規(guī)則(大量規(guī)則來自于多家世界著名電信公司的編程規(guī)范,以及世界權威的編程規(guī)范資料),可實現(xiàn)自動的圖形化代碼編程規(guī)范檢查 3.使用RuleWizard圖形化建立自定義代碼規(guī)則的功能。客戶可以很方便建立并保存一整套自己的代碼編程規(guī)范(團隊經(jīng)驗),從而保證團隊經(jīng)驗不會因為人員變動而流失。與此同時避免了編程人員為了保存團隊的代碼編程規(guī)范而浪費大量時間人工編寫scriptBug Detective(Flow Analysis) 4.Hot Spot技術(“熱點”技術)。C++Test通過自帶的“熱點”包,用回溯的方式自動模擬運行程序中的執(zhí)行路徑,從而精確高速地找到程序存在問題的位置;例如,我們不允許程序中存在“/0”的運算部分,由此凡是程序中“/var”的部分都有可能因為var是0而造成程序邏輯錯誤(其中“/var”的型態(tài)就稱為程序中的“熱點”),此時,C++Test會自動搜索程序中所有“/var”的運算型態(tài),并回溯運行程序中的執(zhí)行路徑,找到所有致使var變成0的路徑,從而精確地找到程序中的錯誤。
C++ Test內(nèi)置了300多個靜態(tài)測試項,一般的情況下其實也就夠用了。但是如果有特殊的測試要求,動輒幾十K的代碼,用眼睛看,腦子想,太辛苦,也不“安全”。如果我們用C++Test圖形化的RuleWizard,結合公司的編碼規(guī)范來制定規(guī)則,一來方便,高效,二來可以節(jié)約人工檢查所帶來的不必要的成本。Rule的創(chuàng)建有2種方式,一種是手工寫規(guī)則,讓RuleWizard去幫你生成規(guī)則(最好別用autocreate,因為C++Test的智能化還很欠缺)。我這里主要重點放在自己寫規(guī)則方面,下面介紹基本步驟:2.1 C++Test的基本設置
首先使用C++Test靜態(tài)規(guī)則集檢查必須要進行一些簡單的設置新建工程:選擇VS6.0或者VS.NET工程文件,或者打開一個已有的工程(是原來已經(jīng)建立的C++Test工程,后綴名為*.cpf)配置工程,引入需要包含的頭文件文件夾 。測試選項的篩選,Enable Coding Standards(靜態(tài)測試),Enable Unit Testing(單元測試),選擇靜態(tài)測試,去掉單元測試的選項。2.2 默認規(guī)則 C++Test內(nèi)置了800多條規(guī)則包括Effective C++,Security等各個方面的C++規(guī)則,應該能夠滿足大多數(shù)公司編碼規(guī)范,啟用某某規(guī)則只要勾選checkbox即可。另外,如果不會寫規(guī)則的話,也可以參看默認的規(guī)則和C++Test的manual在\Parasoft\C++Test\manuals\rulewizard文件夾下。
2.3 制作規(guī)則
首先介紹一下基本規(guī)則的制作方法
在出現(xiàn)的對話框中Dictionary選擇C,C++,還有一個選項是C++Test一般用于C++文本規(guī)則的制作,Rule Creation選擇By Node,Auto-Create用于手動書寫代碼而自動生成規(guī)則,但是自動生成的規(guī)則往往不盡人意,所以一般不用。Node Selections選擇if,因為此次書寫的規(guī)則跟if有關,完成了點擊ok。 以上制作的規(guī)則是在邏輯表達式中常量應該放==號的左邊,這樣可以避免漏寫一個“=”號后造成分支判斷出現(xiàn)永真或者永假式即:
以上條件判斷永遠只會走 return (ERROR)這個分支。
2.4 Rulewizard定義的基本組成部分 Node:規(guī)則的基本組成部分,通過Node你可以很清楚的知道它的功能。比如表達式a=b、變量的類型測試分為:parentNode:規(guī)則中的主分支Node或者次分支的主Node。內(nèi)容可以是表達式、變量、函數(shù)等childNode:規(guī)則的組成單元。Commands:用來在Node和Nodes之間建立關聯(lián)關系。形象一點就是點中一個Node然后右鍵顯示出的快捷菜單的上半部分。如下圖: 介紹一下主要的Command Collector:集合。這個概念更像數(shù)學中的集合而不是Java中的廣義集合。滿足一定條件的數(shù)據(jù)或者方法或者變量的全體。比如,所有被聲明過的變量,如下圖 isDecl是用來返回前邊的node是不是一個聲明。那么body的membervariable返回了所有的包涵指定類型變量得語句(包括 變量付值、聲明、判斷等)那么這個圖被理解為,所有不是聲明得語句內(nèi)使用的變量的集合。沒有被聲明的變量,如下圖。 這里的意思是所有作為聲明語句的變量的集合。
那么通常情況下,A集合和B集合應該是相等的,也就是說所有被聲明過的變量(B集合內(nèi)容)應該都被使用/賦值/判斷(A集合的內(nèi)容)。 Node Set:Node對Node集合的處理。分為Union(合并)、Intersection(交叉)、Difference(差值,左差/右差)、Xor(異或)。如下圖: 如果 滿足這個規(guī)則,那么輸出相應得警告信息。Output:如果滿足check的條件,向用戶返回一個消息(箭頭表示) 2.5 導入已制作的規(guī)則 選擇已制作規(guī)則的文件夾,添加完畢后啟用 2.6 運行已制作的規(guī)則
當導入制作好的規(guī)則后,點擊toolbar上的運行button(三角形的按鈕)即可對工程進行靜態(tài)測試. 運行完畢后,出現(xiàn)出錯信息,并且出錯的行號和出錯的文件也被指明出來了 以上是針對規(guī)則全局常量命名必須大寫: 3 使用Python制作復雜規(guī)則
Python作為時下流行的腳本語言之一,以其超強的適應性,超大的功能性,超凡的擴容性,超常的簡易性,超強的功能性等著稱。它幾乎無所不能。內(nèi)核小巧,但卻擁有足夠的基本程序塊用于設計大部分應用軟件。而且在某些情況下該程序語言還可以擴充與 C,C++ 和 Java 語言并用,因此沒有它編不了的程序。 Python 解釋器還帶有極為強大的補充模塊庫,用于擴充語言能力,進行網(wǎng)絡通訊、文本處理和規(guī)則表達式匹配。
C++ Test結合其對的Python腳本的支持,所以可擴展性非常強大。至于Python語言的語法本身,本文就不過多闡述,請參看《Python編程金典》等Python相關書籍。3.1 C++Test添加Python腳本有兩種方式
1. 作為輸出組件添加(右鍵單擊Node,點Create Output> Method),這種方式主要用于一些規(guī)則中需要輸出特殊的變量,而用RuleWizard中的Create Output>Display無法實現(xiàn)。例如要輸出某個Node的名字,只能通過添加Python腳本來實現(xiàn): 2. 作為單獨組件添加(右鍵單擊Node,點Create Method> Node or Create Method> Boolean),這種方式可以控制整個規(guī)則的行為,返回值0代表有效值,返回值1代表出錯的情況。3.2 Python Method
C++Test創(chuàng)建的Python Method可以有0個,1個或者2個參數(shù),第一個參數(shù)的類型是NodeProvider,第二個參數(shù)的類型是RuleContext ,以下Python Method是符合規(guī)范的:
當一個規(guī)則被創(chuàng)建時,它會匹配源文件的上下文語法解釋Tree,上面說的Node的參數(shù)NodeProvider,也就是對語法解釋Tree包裝出來的一個對象,我們就可以通過它來訪問語法解釋Tree的任何屬性。 而上面所說的RuleContext,你可以存儲一些數(shù)據(jù)在它里面,而其他規(guī)則也可以訪問這些數(shù)據(jù),這意味著幾條規(guī)則之間有一塊共享區(qū)域,彼此之間可以通信。例如有些規(guī)
范一條規(guī)則不能實現(xiàn),需要多條規(guī)則結合起來才能實現(xiàn),那么就要用到RuleContext。Python 腳本書寫的規(guī)則還有一下性質(zhì): 1. Python Method的名字沒有限制 2. Boolean methods的返回值0代表有效,1代表無效 3. Python Method的語法必須符合Python規(guī)范,如果創(chuàng)建的Output Method的語法有錯誤,則它的輸出箭頭會變?yōu)榧t色。 4. Python Method修改后實時生效3.3 主要API模塊 為了使用Python腳本,C++Test提供了一系列的API,主要分為三大模塊: 1. NodeProvider,對Python上下文語法解釋Tree的封裝 2. RuleContext,可以對當前規(guī)則的上下文進行訪問。如: a. 訪問上下文中的容器,當前規(guī)則上下文中有List A時,任何時候,我們都可以用context.getList ("A"),對集合A進行訪問。 b. 生成出錯信息,我們可以用context.report ("Violation detected"),生成出錯信息,改信息顯示在C++Test的Message視窗中。 3. EnforcerContext,跨規(guī)則的訪問上下文,可以多條規(guī)則聯(lián)合起來實現(xiàn)更強大的功能。以下Python腳本示例跨規(guī)則的訪問:
主要用到函數(shù)executeRule(),該函數(shù)返回1代表RuleEnforcerContext檢測當指定文件名的規(guī)則,返回0代表沒有檢測到指定文件名的規(guī)則。 Python腳本的具體用法請參照Parasoft\C++Test\manuals\rulewizard\python_scripting_api.htm
3.4 示例 以上用python腳本創(chuàng)建函數(shù)ConpareVarName 來避免函數(shù)內(nèi)有僅有以大小寫區(qū)分的變量名,即:不允許出現(xiàn)僅依靠大小寫進行區(qū)分的標識符。【理由】避免混淆,產(chǎn)生對程序理解和維護的困難。【事例】不正確的命名INT32 i32ExtAttr = 0;INT32 i32Extattr = 0;4 總結
Powered by: C++博客 Copyright © 唐風