青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天秤座的唐風

總會有一個人需要你的分享~!- 唐風 -

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  13 隨筆 :: 0 文章 :: 69 評論 :: 0 Trackbacks

C++Test代碼靜態檢查規則制作方法

作者:orangeRed3Stones
唐風
www.shnenglu.com/liyiwen
轉載請注明出處

1  前言

    在一個團隊進行軟件開發的過程中,一般都會制定一個大家共同遵守的編碼規范,程序員遵循良好的編碼規范寫程序有很多好處:

    1.有助于程序的維護,降低軟件生命周期成本,符合項目管理的規律;
    2.使團隊中相關人員的流動對項目的影響盡可能小,有利于項目的控制與管理
    3.提高程序的可讀性,有利于相關設計人員交流,提高軟件質量
    4.有利于形成可管理,可重用的團隊后備資源
    5.有利于軟件工程相關產品元素的SCM

    并且,通過建立代碼編寫規范,可以提高程序的可靠性、可讀性、可修改性、可維護性、一致性,保證程序代碼的質量,繼續軟件開發成果,充分利用資源。提高程序的可繼續性,使開發人員之間的工作成果可以共享。這是遵守規范進行代碼編寫是程序員的基本素質。

    如果對編碼規范進行人肉檢查,無疑是非常費時費力,效果不好。使用自動化的工作來進行檢查顯然是一個更好的執行方法。為了這個目標,我們就研究了下使用C++ Test進行代碼靜態檢查。

    C++Test是一個C/C++自動單元測試工具,自動測試C/C++類、函數或部件,自動生成測試用例、測試驅動程序或樁調用,無需手工編寫。C++Test能夠自動測試代碼構造(白盒測試)、測試代碼的功能性(黑盒測試)和維護代碼的完整性(回歸測試),并提供自動覆蓋率測試。同時C++Test還是一個C/C++編程規范自動檢查工具,它內置了800多條業界規則,同時可以圖形化地定制自己的規則,C++ Test進行靜態測試(自動編程規范檢查)有以下優點:
    1.Pattern Matching(自動代碼走查)
    2.內置800多條業界有名的C/C++規則(大量規則來自于多家世界著名電信公司的編程規范,以及世界權威的編程規范資料),可實現自動的圖形化代碼編程規范檢查
    3.使用RuleWizard圖形化建立自定義代碼規則的功能。客戶可以很方便建立并保存一整套自己的代碼編程規范(團隊經驗),從而保證團隊經驗不會因為人員變動而流失。與此同時避免了編程人員為了保存團隊的代碼編程規范而浪費大量時間人工編寫script
Bug Detective(Flow Analysis)
    4.Hot Spot技術(“熱點”技術)。C++Test通過自帶的“熱點”包,用回溯的方式自動模擬運行程序中的執行路徑,從而精確高速地找到程序存在問題的位置;例如,我們不允許程序中存在“/0”的運算部分,由此凡是程序中“/var”的部分都有可能因為var是0而造成程序邏輯錯誤(其中“/var”的型態就稱為程序中的“熱點”),此時,C++Test會自動搜索程序中所有“/var”的運算型態,并回溯運行程序中的執行路徑,找到所有致使var變成0的路徑,從而精確地找到程序中的錯誤。


2. 定制規則

        C++ Test內置了300多個靜態測試項,一般的情況下其實也就夠用了。但是如果有特殊的測試要求,動輒幾十K的代碼,用眼睛看,腦子想,太辛苦,也不“安全”。如果我們用C++Test圖形化的RuleWizard,結合公司的編碼規范來制定規則,一來方便,高效,二來可以節約人工檢查所帶來的不必要的成本。Rule的創建有2種方式,一種是手工寫規則,讓RuleWizard去幫你生成規則(最好別用autocreate,因為C++Test的智能化還很欠缺)。我這里主要重點放在自己寫規則方面,下面介紹基本步驟:

2.1 C++Test的基本設置

首先使用C++Test靜態規則集檢查必須要進行一些簡單的設置

新建工程:選擇VS6.0或者VS.NET工程文件,或者打開一個已有的工程(是原來已經建立的C++Test工程,后綴名為*.cpf)

配置工程,引入需要包含的頭文件文件夾 。


測試選項的篩選,Enable Coding Standards(靜態測試),Enable Unit Testing(單元測試),選擇靜態測試,去掉單元測試的選項。

2.2 默認規則


   
    C++Test內置了800多條規則包括Effective C++,Security等各個方面的C++規則,應該能夠滿足大多數公司編碼規范,啟用某某規則只要勾選checkbox即可。另外,如果不會寫規則的話,也可以參看默認的規則和C++Test的manual在\Parasoft\C++Test\manuals\rulewizard文件夾下。

2.3 制作規則

    首先介紹一下基本規則的制作方法

 


   
    在出現的對話框中Dictionary選擇C,C++,還有一個選項是C++Test一般用于C++文本規則的制作,Rule Creation選擇By Node,Auto-Create用于手動書寫代碼而自動生成規則,但是自動生成的規則往往不盡人意,所以一般不用。Node Selections選擇if,因為此次書寫的規則跟if有關,完成了點擊ok。



    以上制作的規則是在邏輯表達式中常量應該放==號的左邊,這樣可以避免漏寫一個“=”號后造成分支判斷出現永真或者永假式即:

void foo() 
{
    
if(nFlag = 0)        /* Violation */ 
    {
        
return (Ok);
    }
    
else
    {
        
return (ERROR);
    } 
}


    以上條件判斷永遠只會走 return (ERROR)這個分支。

2.4  Rulewizard定義的基本組成部分

 
Node:規則的基本組成部分,通過Node你可以很清楚的知道它的功能。比如表達式a=b、變量的類型測試分為:
parentNode:規則中的主分支Node或者次分支的主Node。內容可以是表達式、變量、函數等
childNode:規則的組成單元。
Commands:用來在Node和Nodes之間建立關聯關系。形象一點就是點中一個Node然后右鍵顯示出的快捷菜單的上半部分。如下圖:

 
介紹一下主要的Command
    Collector:集合。這個概念更像數學中的集合而不是Java中的廣義集合。滿足一定條件的數據或者方法或者變量的全體。比如,所有被聲明過的變量,如下圖


 
    isDecl是用來返回前邊的node是不是一個聲明。那么body的membervariable返回了所有的包涵指定類型變量得語句(包括 變量付值、聲明、判斷等)那么這個圖被理解為,所有不是聲明得語句內使用的變量的集合。
沒有被聲明的變量,如下圖。


 
    這里的意思是所有作為聲明語句的變量的集合。

    那么通常情況下,A集合和B集合應該是相等的,也就是說所有被聲明過的變量(B集合內容)應該都被使用/賦值/判斷(A集合的內容)。
    Node Set:Node對Node集合的處理。分為Union(合并)、Intersection(交叉)、Difference(差值,左差/右差)、Xor(異或)。如下圖:


 
如果 滿足這個規則,那么輸出相應得警告信息。
Output:如果滿足check的條件,向用戶返回一個消息(箭頭表示)




 
2.5  導入已制作的規則


 


選擇已制作規則的文件夾,添加完畢后啟用
 
2.6  運行已制作的規則

    當導入制作好的規則后,點擊toolbar上的運行button(三角形的按鈕)即可對工程進行靜態測試.
    運行完畢后,出現出錯信息,并且出錯的行號和出錯的文件也被指明出來了



    以上是針對規則全局常量命名必須大寫:


 

3 使用Python制作復雜規則

    Python作為時下流行的腳本語言之一,以其超強的適應性,超大的功能性,超凡的擴容性,超常的簡易性,超強的功能性等著稱。它幾乎無所不能。內核小巧,但卻擁有足夠的基本程序塊用于設計大部分應用軟件。而且在某些情況下該程序語言還可以擴充與 C,C++ 和 Java 語言并用,因此沒有它編不了的程序。 Python 解釋器還帶有極為強大的補充模塊庫,用于擴充語言能力,進行網絡通訊、文本處理和規則表達式匹配。

    C++ Test結合其對的Python腳本的支持,所以可擴展性非常強大。至于Python語言的語法本身,本文就不過多闡述,請參看《Python編程金典》等Python相關書籍。

3.1 C++Test添加Python腳本有兩種方式

    1. 作為輸出組件添加(右鍵單擊Node,點Create Output> Method),這種方式主要用于一些規則中需要輸出特殊的變量,而用RuleWizard中的Create Output>Display無法實現。例如要輸出某個Node的名字,只能通過添加Python腳本來實現:


 
    2. 作為單獨組件添加(右鍵單擊Node,點Create Method> Node or Create Method> Boolean),這種方式可以控制整個規則的行為,返回值0代表有效值,返回值1代表出錯的情況。

3.2 Python Method

    C++Test創建的Python Method可以有0個,1個或者2個參數,第一個參數的類型是NodeProvider,第二個參數的類型是RuleContext ,以下Python Method是符合規范的:

def function(node, context): 
def function(node): 
def function(): 


    當一個規則被創建時,它會匹配源文件的上下文語法解釋Tree,上面說的Node的參數NodeProvider,也就是對語法解釋Tree包裝出來的一個對象,我們就可以通過它來訪問語法解釋Tree的任何屬性。
    而上面所說的RuleContext,你可以存儲一些數據在它里面,而其他規則也可以訪問這些數據,這意味著幾條規則之間有一塊共享區域,彼此之間可以通信。例如有些規

    范一條規則不能實現,需要多條規則結合起來才能實現,那么就要用到RuleContext。Python 腳本書寫的規則還有一下性質:
    1. Python Method的名字沒有限制
    2. Boolean methods的返回值0代表有效,1代表無效
    3. Python Method的語法必須符合Python規范,如果創建的Output Method的語法有錯誤,則它的輸出箭頭會變為紅色。
    4. Python Method修改后實時生效

3.3 主要API模塊

    為了使用Python腳本,C++Test提供了一系列的API,主要分為三大模塊:
    1. NodeProvider,對Python上下文語法解釋Tree的封裝
    2. RuleContext,可以對當前規則的上下文進行訪問。如:
        a. 訪問上下文中的容器,當前規則上下文中有List A時,任何時候,我們都可以用context.getList ("A"),對集合A進行訪問。
        b. 生成出錯信息,我們可以用context.report ("Violation detected"),生成出錯信息,改信息顯示在C++Test的Message視窗中。
    3. EnforcerContext,跨規則的訪問上下文,可以多條規則聯合起來實現更強大的功能。以下Python腳本示例跨規則的訪問:

def somePythonMethod(node, context): 
   
#  
   # invoke here the "lower lever" text rule: 
   parent = context.getParentContext() 
   result 
= parent.executeRule("./my_text.rule", node) 
   
# my_text.rule was executed and the result 
   # specifies whether any violation was detected 
   if 1 == result: 
     
# my_text.rule reported violation 
   else
     
# my_text.rule did not detect any violations 
   # 


    主要用到函數executeRule(),該函數返回1代表RuleEnforcerContext檢測當指定文件名的規則,返回0代表沒有檢測到指定文件名的規則。
    Python腳本的具體用法請參照Parasoft\C++Test\manuals\rulewizard\python_scripting_api.htm

3.4 示例
 



 
    以上用python腳本創建函數ConpareVarName

 

來避免函數內有僅有以大小寫區分的變量名,即:
不允許出現僅依靠大小寫進行區分的標識符。
【理由】
避免混淆,產生對程序理解和維護的困難。
【事例】
不正確的命名
INT32 i32ExtAttr = 0;
INT32 i32Extattr = 0;


4 總結

    使用自動工具進行編碼規范的檢查效率很高,而且能保證質量。C++ Test 的靜態代碼規則制作也比較容易,功能也很強大。唯一的不足可能就是,C++ Test本身的運行速度稍微有點慢,而且比較占內存。(貌似是Java寫的,呵呵)。總的來講還是很不錯的,值得推廣和。



聲明:
    此文為好友orangeRed3stones所作,現在orangeRed3stones對這些內容做了辛苦的整理,但并無發表意圖,很是可惜。加之去年我也相關的學習上與他一起參與了大量工作(真是值得懷念的時光),故發表在自己的Blog上了。特此聲明。


posted on 2009-07-12 18:41 唐風 閱讀(3735) 評論(3)  編輯 收藏 引用 所屬分類: 語言技術

評論

# re: C++Test代碼靜態檢查規則制作方法 2009-07-14 09:04 上帝之手
不錯,C++test確實功能強大,有些功能還待發覺,python腳本小巧精悍,可以嵌入到很多語言中。  回復  更多評論
  

# re: C++Test代碼靜態檢查規則制作方法 2009-10-19 19:19 一帆風順
感謝此文作者 提供如此寶貴的知識經驗  回復  更多評論
  

# re: C++Test代碼靜態檢查規則制作方法 2014-08-14 16:45 hello
感謝分享  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲夫妻自拍| 亚洲欧美一区二区激情| 久久久一本精品99久久精品66| av成人天堂| 国产精品亚洲综合天堂夜夜| 午夜一区在线| 久久狠狠亚洲综合| 亚洲大片av| 亚洲精品中文字幕有码专区| 欧美三级在线视频| 久久福利毛片| 久久免费视频一区| 亚洲视频www| 欧美在线啊v一区| 亚洲国产专区校园欧美| 亚洲精品久久久久久下一站| 欧美日韩免费看| 久久国产福利国产秒拍| 蜜桃伊人久久| 欧美一区在线直播| 久久综合伊人77777蜜臀| 99热在这里有精品免费| 一本色道久久综合亚洲91| 国产乱人伦精品一区二区| 欧美成人免费播放| 国产精品视频yy9099| 另类天堂视频在线观看| 欧美日韩免费高清| 美女诱惑黄网站一区| 欧美网站在线| 亚洲第一精品在线| 国产日韩欧美在线视频观看| 欧美激情在线| 国产在线精品二区| 日韩午夜黄色| 亚洲国产日本| 欧美亚洲一区| 亚洲男同1069视频| 欧美国产日韩精品免费观看| 久久久噜噜噜久久狠狠50岁| 欧美日韩一区二区三区免费看| 国产精品sss| 亚洲精品久久7777| 欧美一区二区三区视频| 亚洲午夜一二三区视频| 久久三级视频| 久久裸体艺术| 国产日韩亚洲欧美精品| 一区二区精品| 一本色道久久| 欧美激情综合| 亚洲国产专区校园欧美| 一区二区视频免费在线观看| 亚洲午夜羞羞片| 一区二区三区日韩精品视频| 麻豆精品精品国产自在97香蕉| 欧美在线观看一区二区| 欧美午夜寂寞影院| 99国产精品久久久久久久成人热| 亚洲乱码国产乱码精品精天堂 | 亚洲第一网站免费视频| 午夜精品成人在线视频| 亚洲欧美日韩区| 国产精品久久久久免费a∨| 中文有码久久| 亚洲欧美一区二区原创| 国产精品久久久久三级| 亚洲私拍自拍| 欧美在线国产精品| 国产一区二区三区网站| 久久精品欧洲| 亚洲成人在线网站| 亚洲剧情一区二区| 欧美日韩亚洲三区| 亚洲在线视频一区| 久久精品国产免费观看| 一区二区在线观看av| 久久久久久香蕉网| 亚洲精品乱码久久久久久蜜桃麻豆 | 夜夜嗨av一区二区三区中文字幕| 亚洲无限av看| 国产欧美日韩不卡免费| 欧美在线观看视频| 欧美成人xxx| 一区二区三区视频在线观看| 国产精品久久久久久久久久免费| 亚洲一区二区视频在线观看| 久久精品人人做人人爽| 在线免费不卡视频| 欧美日韩在线不卡一区| 亚洲欧美日韩国产成人| 欧美成人免费全部| 亚洲欧美另类综合偷拍| 国产亚洲一区在线播放| 欧美国产日韩a欧美在线观看| av成人黄色| 麻豆精品视频在线观看| 亚洲精品一二三区| 国产精品视频专区| 榴莲视频成人在线观看| 一区二区三区精品视频在线观看| 久久五月天婷婷| av成人激情| 国产伊人精品| 欧美三区在线视频| 久久精品在线播放| 正在播放日韩| 亚洲国产精品一区二区www在线 | 性欧美长视频| 午夜欧美精品| 亚洲理伦电影| 韩国精品在线观看| 欧美视频手机在线| 蜜桃av综合| 久久成人这里只有精品| 日韩一区二区免费高清| 免费观看成人鲁鲁鲁鲁鲁视频| 国产精品99久久久久久有的能看| 一区二区视频在线观看| 国产精品一区二区三区观看| 欧美大片在线影院| 久久精品在线免费观看| 亚洲欧美日韩综合aⅴ视频| 亚洲六月丁香色婷婷综合久久| 欧美.日韩.国产.一区.二区| 午夜视频一区在线观看| 亚洲小说欧美另类社区| 亚洲激情在线| 亚洲国产一区在线观看| 在线播放日韩欧美| 狠狠久久综合婷婷不卡| 国产精品久久久久久久午夜| 欧美日韩免费精品| 欧美日本精品| 欧美大片在线影院| 免费试看一区| 暖暖成人免费视频| 欧美jizzhd精品欧美巨大免费| 久久精品日韩| 亚洲欧美视频一区| 欧美精品18+| 久久综合亚洲社区| 裸体歌舞表演一区二区| 亚洲摸下面视频| 一区二区三区免费观看| 亚洲美女中出| 夜夜爽av福利精品导航| 99视频一区二区| 在线一区二区三区四区五区| 一区二区高清视频在线观看| 亚洲精品日韩激情在线电影| 亚洲国产第一页| 亚洲日本va午夜在线电影| 亚洲精品久久视频| 999亚洲国产精| 亚洲尤物视频在线| 欧美在线你懂的| 久热精品视频在线观看| 欧美大片免费看| 欧美性色综合| 国产日韩欧美精品一区| 韩国视频理论视频久久| 亚洲激情影院| 亚洲综合三区| 鲁大师影院一区二区三区| 欧美日韩国产色视频| 欧美三级在线视频| 国产九九精品| 亚洲国产日韩欧美在线图片| 日韩一级免费| 性色一区二区三区| 欧美黑人一区二区三区| 99视频国产精品免费观看| 午夜精品短视频| 欧美黄色一级视频| 国产日韩欧美视频| 亚洲国产欧美精品| 亚洲免费人成在线视频观看| 久久精品久久99精品久久| 欧美激情导航| 亚洲午夜一区二区| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美日在线观看| 一区二区在线免费观看| 中文国产成人精品久久一| 久久久xxx| 欧美偷拍一区二区| 国产视频一区在线| 亚洲激情欧美激情| 久久久不卡网国产精品一区| 亚洲黄色av一区| 久久se精品一区精品二区| 欧美精品久久一区二区| 国产一区二区高清不卡| 亚洲少妇在线| 91久久中文字幕| 欧美制服丝袜第一页| 欧美视频在线一区| 亚洲日本免费| 欧美激情一区二区|