• <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>

            天秤座的唐風(fēng)

            總會(huì)有一個(gè)人需要你的分享~!- 唐風(fēng) -

              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              13 隨筆 :: 0 文章 :: 69 評(píng)論 :: 0 Trackbacks

            C++Test代碼靜態(tài)檢查規(guī)則制作方法

            作者:orangeRed3Stones
            唐風(fēng)
            m.shnenglu.com/liyiwen
            轉(zhuǎn)載請注明出處

            1  前言

                在一個(gè)團(tuán)隊(duì)進(jìn)行軟件開發(fā)的過程中,一般都會(huì)制定一個(gè)大家共同遵守的編碼規(guī)范,程序員遵循良好的編碼規(guī)范寫程序有很多好處:

                1.有助于程序的維護(hù),降低軟件生命周期成本,符合項(xiàng)目管理的規(guī)律;
                2.使團(tuán)隊(duì)中相關(guān)人員的流動(dòng)對(duì)項(xiàng)目的影響盡可能小,有利于項(xiàng)目的控制與管理
                3.提高程序的可讀性,有利于相關(guān)設(shè)計(jì)人員交流,提高軟件質(zhì)量
                4.有利于形成可管理,可重用的團(tuán)隊(duì)后備資源
                5.有利于軟件工程相關(guān)產(chǎn)品元素的SCM

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

                如果對(duì)編碼規(guī)范進(jìn)行人肉檢查,無疑是非常費(fèi)時(shí)費(fèi)力,效果不好。使用自動(dòng)化的工作來進(jìn)行檢查顯然是一個(gè)更好的執(zhí)行方法。為了這個(gè)目標(biāo),我們就研究了下使用C++ Test進(jìn)行代碼靜態(tài)檢查。

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


            2. 定制規(guī)則

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

            2.1 C++Test的基本設(shè)置

            首先使用C++Test靜態(tài)規(guī)則集檢查必須要進(jìn)行一些簡單的設(shè)置

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

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


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

            2.2 默認(rèn)規(guī)則


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

            2.3 制作規(guī)則

                首先介紹一下基本規(guī)則的制作方法

             


               
                在出現(xiàn)的對(duì)話框中Dictionary選擇C,C++,還有一個(gè)選項(xiàng)是C++Test一般用于C++文本規(guī)則的制作,Rule Creation選擇By Node,Auto-Create用于手動(dòng)書寫代碼而自動(dòng)生成規(guī)則,但是自動(dòng)生成的規(guī)則往往不盡人意,所以一般不用。Node Selections選擇if,因?yàn)榇舜螘鴮懙囊?guī)則跟if有關(guān),完成了點(diǎn)擊ok。



                以上制作的規(guī)則是在邏輯表達(dá)式中常量應(yīng)該放==號(hào)的左邊,這樣可以避免漏寫一個(gè)“=”號(hào)后造成分支判斷出現(xiàn)永真或者永假式即:

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


                以上條件判斷永遠(yuǎn)只會(huì)走 return (ERROR)這個(gè)分支。

            2.4  Rulewizard定義的基本組成部分

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

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


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


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

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


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




             
            2.5  導(dǎo)入已制作的規(guī)則


             


            選擇已制作規(guī)則的文件夾,添加完畢后啟用
             
            2.6  運(yùn)行已制作的規(guī)則

                當(dāng)導(dǎo)入制作好的規(guī)則后,點(diǎn)擊toolbar上的運(yùn)行button(三角形的按鈕)即可對(duì)工程進(jìn)行靜態(tài)測試.
                運(yùn)行完畢后,出現(xiàn)出錯(cuò)信息,并且出錯(cuò)的行號(hào)和出錯(cuò)的文件也被指明出來了



                以上是針對(duì)規(guī)則全局常量命名必須大寫:


             

            3 使用Python制作復(fù)雜規(guī)則

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

                C++ Test結(jié)合其對(duì)的Python腳本的支持,所以可擴(kuò)展性非常強(qiáng)大。至于Python語言的語法本身,本文就不過多闡述,請參看《Python編程金典》等Python相關(guān)書籍。

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

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


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

            3.2 Python Method

                C++Test創(chuàng)建的Python Method可以有0個(gè),1個(gè)或者2個(gè)參數(shù),第一個(gè)參數(shù)的類型是NodeProvider,第二個(gè)參數(shù)的類型是RuleContext ,以下Python Method是符合規(guī)范的:

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


                當(dāng)一個(gè)規(guī)則被創(chuàng)建時(shí),它會(huì)匹配源文件的上下文語法解釋Tree,上面說的Node的參數(shù)NodeProvider,也就是對(duì)語法解釋Tree包裝出來的一個(gè)對(duì)象,我們就可以通過它來訪問語法解釋Tree的任何屬性。
                而上面所說的RuleContext,你可以存儲(chǔ)一些數(shù)據(jù)在它里面,而其他規(guī)則也可以訪問這些數(shù)據(jù),這意味著幾條規(guī)則之間有一塊共享區(qū)域,彼此之間可以通信。例如有些規(guī)

                范一條規(guī)則不能實(shí)現(xiàn),需要多條規(guī)則結(jié)合起來才能實(shí)現(xiàn),那么就要用到RuleContext。Python 腳本書寫的規(guī)則還有一下性質(zhì):
                1. Python Method的名字沒有限制
                2. Boolean methods的返回值0代表有效,1代表無效
                3. Python Method的語法必須符合Python規(guī)范,如果創(chuàng)建的Output Method的語法有錯(cuò)誤,則它的輸出箭頭會(huì)變?yōu)榧t色。
                4. Python Method修改后實(shí)時(shí)生效

            3.3 主要API模塊

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

            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 
               # 


                主要用到函數(shù)executeRule(),該函數(shù)返回1代表RuleEnforcerContext檢測當(dāng)指定文件名的規(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)僅依靠大小寫進(jìn)行區(qū)分的標(biāo)識(shí)符。
            【理由】
            避免混淆,產(chǎn)生對(duì)程序理解和維護(hù)的困難。
            【事例】
            不正確的命名
            INT32 i32ExtAttr = 0;
            INT32 i32Extattr = 0;


            4 總結(jié)

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



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


            posted on 2009-07-12 18:41 唐風(fēng) 閱讀(3703) 評(píng)論(3)  編輯 收藏 引用 所屬分類: 語言技術(shù)

            評(píng)論

            # re: C++Test代碼靜態(tài)檢查規(guī)則制作方法 2009-07-14 09:04 上帝之手
            不錯(cuò),C++test確實(shí)功能強(qiáng)大,有些功能還待發(fā)覺,python腳本小巧精悍,可以嵌入到很多語言中。  回復(fù)  更多評(píng)論
              

            # re: C++Test代碼靜態(tài)檢查規(guī)則制作方法 2009-10-19 19:19 一帆風(fēng)順
            感謝此文作者 提供如此寶貴的知識(shí)經(jīng)驗(yàn)  回復(fù)  更多評(píng)論
              

            # re: C++Test代碼靜態(tài)檢查規(guī)則制作方法 2014-08-14 16:45 hello
            感謝分享  回復(fù)  更多評(píng)論
              

            国产精品久久久久久| 久久久久久国产精品免费免费| 日韩人妻无码一区二区三区久久99| 青青草原综合久久大伊人导航| 久久婷婷五月综合国产尤物app| 久久亚洲AV无码精品色午夜麻豆 | 99久久精品久久久久久清纯 | 狠狠色丁香久久婷婷综合五月| 青草影院天堂男人久久| 久久亚洲精品无码VA大香大香| 国产精品久久成人影院| 欧美一区二区久久精品| 色综合久久久久网| 久久久国产乱子伦精品作者| 欧美久久天天综合香蕉伊| 精品无码久久久久久午夜| 久久婷婷五月综合色奶水99啪| 99久久综合国产精品二区| 欧美黑人激情性久久| 久久天天躁夜夜躁狠狠| 无码精品久久一区二区三区| 久久免费视频网站| 69久久精品无码一区二区| 久久久精品国产免大香伊| 青青青青久久精品国产h久久精品五福影院1421 | 成人久久久观看免费毛片| 亚洲va久久久噜噜噜久久 | 久久久久久亚洲精品成人| 久久无码专区国产精品发布| 久久综合九色综合欧美就去吻| 久久精品国产免费| 国产日产久久高清欧美一区| 久久亚洲欧美国产精品 | 久久国产乱子精品免费女| 久久精品麻豆日日躁夜夜躁| 日韩久久久久久中文人妻| 99精品久久精品一区二区| 亚洲av成人无码久久精品 | 亚洲国产成人久久综合野外| 久久91精品综合国产首页| 精品久久久久久久中文字幕|