jinfeng_wang

          G-G-S,D-D-U!

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            400 Posts :: 0 Stories :: 296 Comments :: 0 Trackbacks

          2006-4-14 Lander 整理
          介紹:對(duì)于多個(gè)源程序文件且多個(gè)頭文件目錄的項(xiàng)目進(jìn)行PCLint語(yǔ)法檢查。

          1.安裝
           我使用的是PC.Lint.v8.00e,是不用安裝的版本。
           解開(kāi)到E:\PC.Lint.v8.00e目錄,可執(zhí)行文件為L(zhǎng)int.exe(lint-nt.exe與其相同,可能為NT平臺(tái)用的,在Win2000下都可運(yùn)行)。
           子目錄lnt內(nèi)是檢查的規(guī)則及選項(xiàng)文件,這兩種文件擴(kuò)展名全為.lnt。

          2.準(zhǔn)備自己工程的選項(xiàng)文件
           在E:\PC.Lint.v8.00e\lnt下新建MyProj.lnt文本文件,我們將自己工程的很多頭文件目錄,在其中一一列出來(lái),內(nèi)容如下:
           
           std.lnt/*注釋?zhuān)喊囊?guī)則和/或選項(xiàng)文件*/
           env-vc6.lnt
           /*下面為各頭文件目錄,可以在字串中不要雙引號(hào),可以有多行*/
           -i"C:\MyProj\IncludeA" -i"C:\MyProj\IncludeB" -iC:\MyProj\IncludeC
           -iC:\MyProj\IncludeD
           -e641//另一種注釋//這是省略#641錯(cuò)誤
           【注意】指明各頭文件目錄很重要。頭文件各目錄的名稱(chēng)可能在VC的Project\Project Settings\Project Options欄中:
            /I "../Include/PS",可供借鑒(相對(duì)路徑暫未測(cè)試)。
            當(dāng)后面運(yùn)行Lint時(shí)出現(xiàn)無(wú)法打開(kāi)某個(gè)頭文件時(shí),需要不斷添加頭文件所在目錄的名稱(chēng)到本選項(xiàng)文件中。

          3.在VC中運(yùn)行PCLint(針對(duì)單個(gè)文件但需包含多個(gè)頭文件目錄):
              A 點(diǎn)擊Tools/Customize/Tools出現(xiàn)定制窗口
              B 在Menu contents中雙擊下面的空白攔,輸入擬新增的Tool名稱(chēng):PCLint
              C 雙擊PClint項(xiàng),在Command中填入要調(diào)用的.exe文件名:lint
                Arguments:中填入:-i"E:\PC.Lint.v8.00e\lnt" MyProj.lnt $(FilePath)
                【注意】$(FilePath)這個(gè)字串是個(gè)宏名,也可以通過(guò)點(diǎn)擊右邊的三角箭頭選擇;可能為要檢查的本文件的路徑加文件名,而
                不能是$(FileName)!!!因?yàn)樗赡苤皇俏募粠窂?,將?dǎo)致使用時(shí)說(shuō)無(wú)法發(fā)現(xiàn)!
                另外,MyProj.lnt這個(gè)選項(xiàng)文件必須在$(FilePath)之前。
                Initial Directory項(xiàng):在Arguments項(xiàng)中若缺少-i"E:\PC.Lint.v8.00e\lnt"時(shí)將報(bào)無(wú)法找到各個(gè).lnt文件,可在此
                欄填E:\PC.Lint.v8.00e\lnt來(lái)指定。
                選中"Use Output Window" (這將使PCLint運(yùn)行的結(jié)果在VC下方Output窗口中,雙擊行號(hào)還可以跳到指定行)
              D 打開(kāi)一個(gè)項(xiàng)目,讓焦點(diǎn)位于某個(gè)源程序編輯窗口,點(diǎn)擊Tools/pclint菜單即可

          【注意】直到VC Output窗口中出現(xiàn)Tool returned code: ,才算Tool運(yùn)行完,若未運(yùn)行完,可能在再點(diǎn)擊PCLint時(shí)報(bào)錯(cuò)。

          4.網(wǎng)上搜到的VC環(huán)境多個(gè)文件同時(shí)Lint的方法,大致為找到各個(gè).c文件,將各文件名經(jīng)xargs傳給lint來(lái)實(shí)現(xiàn)。但需要find,xargs等
          命令,似乎需要模擬unix環(huán)境的軟件支持中才有,我裝的Cygwin的環(huán)境中對(duì)find命令后的格式有問(wèn)題,無(wú)法支持unix中的
          find . -name *.c,故無(wú)法由此找到各個(gè).c文件名。但可以用Cygwin的ls命令來(lái)代替find。
           【原方法如下:】
             A 點(diǎn)擊Tools/Customize/Tools出現(xiàn)定制窗口
            B 在Menu contents中雙擊空白攔,輸入:PCLint-project
            C 雙擊PCLint-project項(xiàng),在Command:中填入:find
                Arguments:中填入:$(FileDir) -name *.c | xargs pclint -i"c:\unix\usr" -u std.lnt env-vc6.lnt
                選中"Use Output Window"
            D 打開(kāi)一個(gè)項(xiàng)目,讓焦點(diǎn)位于最項(xiàng)層目前的一個(gè)Source Window中,點(diǎn)擊Tools/PCLint-project菜單即可

           【方法1如下:】
            A 點(diǎn)擊Tools/Customize/Tools出現(xiàn)定制窗口
            B 在Menu contents中雙擊空白攔,輸入:PCLint-Proj
            C 雙擊PCLint-Proj項(xiàng),在Command:中填入:ls
                Arguments:中填入:*.c |xargs lint -i"E:\PC.Lint.v8.00e\lnt" MyProj.lnt
                Initial Directory項(xiàng):本欄填寫(xiě)工程的一個(gè)源文件子目錄(保證在Arguments項(xiàng)中有-i"E:\PC.Lint.v8.00e\lnt")
                選中"Use Output Window"
            D 打開(kāi)一個(gè)項(xiàng)目,讓焦點(diǎn)位于最頂層目前的一個(gè)Source Window中,點(diǎn)擊Tools/PCLint-Proj菜單即可

           【最簡(jiǎn)單的方法如下:】
            A 在MyProj.lnt末尾添加一行 *.c (即目標(biāo)為本目錄下所有.c文件)
            B 點(diǎn)擊Tools/Customize/Tools出現(xiàn)定制窗口
            C 在Menu contents中雙擊空白攔,輸入:PCLint-Proj
            D 雙擊PCLint-Proj項(xiàng),在Command:中填入:lint
                Arguments:中填入:-i"E:\PC.Lint.v8.00e\lnt" MyProj.lnt
                Initial Directory項(xiàng):本欄填寫(xiě)工程的一個(gè)源文件子目錄(保證在Arguments項(xiàng)中有-i"E:\PC.Lint.v8.00e\lnt")
                選中"Use Output Window"
            E 打開(kāi)一個(gè)項(xiàng)目,讓焦點(diǎn)位于最項(xiàng)層目前的一個(gè)Source Window中,點(diǎn)擊Tools/PCLint-Proj菜單即可

          【注意】上述方法中的ls,xargs等命令位于Cygwin的目錄中,需要將路徑添加到系統(tǒng)的PATH中:
            "我的電腦"(右擊鼠標(biāo))->"屬性"->"高級(jí)"->"環(huán)境變量"->"系統(tǒng)變量"->"Path"
              加入"C:\cygwin\bin"重啟生效。
           ls *.c將同時(shí)找到.c文件和.cpp文件,但是也會(huì)將非工程所需的.c文件編譯進(jìn)來(lái),需要手工把文件轉(zhuǎn)走。
           另外,這種方法一次只能Lint一個(gè)目錄,每完成一個(gè)目錄就要重新設(shè)置Initial Directory項(xiàng)為新的要檢查的目錄。

          5.在DOS窗口中對(duì)一個(gè)目錄多個(gè)文件進(jìn)行Lint
          1)基于Cygwin
          cd C:\MyProj\SrcA\
          ls *.c | xargs lint -i"E:\PC.Lint.v8.00e\lnt" MyProj.lnt >> LintOutput.txt
          【注意】ls *.c 也可以用DOS命令dir *.c/B來(lái)替換,/B的意思是僅列出各文件名。>>LintOutput.txt的意思是將Lint結(jié)果輸出到
          LintOutput.txt文件中。
          2)無(wú)Cygwin支持
          cd C:\MyProj\SrcA\
          dir *.c /B
          將所有列出的.c文件名稱(chēng)復(fù)制到E:\PC.Lint.v8.00e\lnt\MyProj.lnt中,內(nèi)容如下:
           std.lnt/*注釋?zhuān)喊囊?guī)則和/或選項(xiàng)文件*/
           env-vc6.lnt
           /*下面為各頭文件目錄,可以在字串中不要雙引號(hào),可以有多行*/
           -i"C:\MyProj\IncludeA" -i"C:\MyProj\IncludeB" -iC:\MyProj\IncludeC
           -iC:\MyProj\IncludeD
           -e641//另一種注釋//這是省略#641錯(cuò)誤
           a.c //指定要Lint的文件
           b.c
           c.c
           最后幾行指定的要Lint之文件也可以用通配符,如:
           *.c
          然后直接運(yùn)行 lint -i"E:\PC.Lint.v8.00e\lnt" MyProj.lnt >> LintOutput.txt





          ===================================

          LINT工具是一種軟件質(zhì)量保證工具,許多國(guó)外的大型專(zhuān)業(yè)軟件公司,如微軟公司,都 
          把它作為程序檢查工具,在程序合入正試版本或交付測(cè)試之前一定要保證通過(guò)了LINT檢查 
          ,他們要求軟件工程師在使用LINT時(shí)要打開(kāi)所有的編譯開(kāi)關(guān),如果一定要關(guān)閉某些開(kāi)關(guān), 
          那么要給出關(guān)閉這些開(kāi)關(guān)的正當(dāng)理由。 

            可想而知,如果從我們編碼后第一次編譯程序時(shí)就使用LINT來(lái)檢查程序,并且保證消 
          除所有的LINT告警,我們就不會(huì)遇到象今天這么多的告警信息。即使在今天,我們?nèi)绻?nbsp;
          抽出一定的精力來(lái)消除程序中的LINT告警,以后再維持這種無(wú)告警狀態(tài)就是很容易的了。 
          我們程序質(zhì)量的提高也是不言而喻的。 

            PC-LINT是GIMPEL SOFTWARE公司的產(chǎn)品,其中的內(nèi)容是非常廣泛的,光是選項(xiàng)就有30 
          0多個(gè),涉及到程序編譯及語(yǔ)法使用中的方方面面。本篇培訓(xùn)材料旨在引導(dǎo)讀者入門(mén),學(xué)會(huì) 
          PC-LINT的基本使用方法,起拋磚引玉的作用,能讓讀者從這里起步繼續(xù)去研究如何嫻熟地 
          使用PC-LINT的各種選項(xiàng),能讓它充分為我們的開(kāi)發(fā)工作服務(wù)。 

          1.概述 
            如果要給LINT工具下一個(gè)形象點(diǎn)的定義,那就是:一種更加嚴(yán)格的編譯器。它不僅可 
          以象普通編譯器那樣檢查出一般的語(yǔ)法錯(cuò)誤,還可以檢查出那些雖然完全合乎語(yǔ)法要求, 
          但很可能是潛在的、不易發(fā)現(xiàn)的錯(cuò)誤。請(qǐng)看下面的例子: 
          1: 
          2:char *report( int m, int n, char *p ) 
          3:{ 
          4: int result; 
          5: char *temp; 
          6: long nm; 
          7: int i, k, kk; 
          8: char name[11] = "Joe Jakeson"; 
          9: 
          10: nm = n * m; 
          11: temp = p == "" ? "null" : p; 
          12: for( i = 0; i 13: { 
          14: k++; 
          15: kk = i; 
          16: } 
          17: 
          18: if( k== 1 ) result = nm; 
          19: else if( kk > 0 ) result = 1; 
          20: else if( kk < 0 ) result = -1; 
          21: 
          22: if( m == result ) return( temp ); 
          23: else return( name ); 
          24:} 
            上面的代碼用一般的編譯器編譯是一段有效的代碼,但是用PC-LINT編譯就會(huì)有幾個(gè)告 
          警。首先第8行向name數(shù)組賦值時(shí)丟掉了nul字符,第10行的乘法精度會(huì)失準(zhǔn),第11行的比 
          較有問(wèn)題,第14行的變量k沒(méi)有初始化,第15行的kk可能沒(méi)有被初始化,第22行的result也 
          有可能沒(méi)有被初始化,第23行返回的是一個(gè)局部對(duì)象的地址。這段代碼在大部分編譯器下 
          是可以順利編譯通過(guò)的,繼續(xù)查找其中的錯(cuò)誤就要靠人工調(diào)試程序,如果程序很大,這將 
          是一項(xiàng)煩瑣的工作,沒(méi)有人可以保證能找出所有的這類(lèi)問(wèn)題,但PC-LINT只通過(guò)一次簡(jiǎn)單的 
          編譯就可做到,顯然為我們節(jié)省了大量的開(kāi)發(fā)時(shí)間。 

            下面就讓我們看看如何安裝使用PC-LINT。 
          2.如何安裝PC-LINT 
            PC-LINT的軟件的安裝過(guò)程比較復(fù)雜,選項(xiàng)較多,下面根據(jù)安裝過(guò)程,逐條說(shuō)明每一步 
          的含義。 
          0)如果是zip文件,將ZIP安裝文件展開(kāi)到目錄C:\lint.ins下,進(jìn)入COMMAND PROMPT,先 
          進(jìn)行目錄映射 subst g: c:\lint.ins,然后轉(zhuǎn)到G: , 執(zhí)行install。其他步驟和下面的從 
          軟盤(pán)安裝是一樣的。 

          1)在A:驅(qū)插入PC-LINT安裝盤(pán),輸入A:\>install命令,進(jìn)入開(kāi)始安裝欄,按任意鍵繼續(xù), 
          進(jìn)入PC-LINT介紹欄,再按任意鍵繼續(xù)。 
          2)進(jìn)入環(huán)境選擇欄,這一欄中有三個(gè)選項(xiàng): 
          Windows NT/Windows 95 
          MS-DOS(DOS extended) 
          OS/2(32bit) 
          如果計(jì)算機(jī)安裝了WIN95、WIN97、WIN98或WINNT要選擇Windows NT/Windows 95,如果 
          只有DOS則選擇DOS。 
          3)進(jìn)入安裝目錄選擇欄,它推薦的是C:\>LINT,如不想安裝在這個(gè)目錄下,可輸入自己想 
          要安裝的目錄,然后按回車(chē)確認(rèn),如果要安裝的目錄不存在,它會(huì)提示為你建立這個(gè)目錄 
          。我們這里選C:\>LINT 
          4)選擇安裝盤(pán)所在的磁盤(pán)驅(qū)動(dòng)器,我們這里選A: 
          5)判斷是否要選擇多種編譯器或編譯庫(kù)的配置,如果要對(duì)不同編譯環(huán)境下的程序進(jìn)行L 

          INT,則選YES,否則選NO。然后回車(chē)確認(rèn)。 
          6)這時(shí)看到一個(gè)編譯器列表,在這個(gè)表中選擇自己使用的編譯器,如果表中沒(méi)有自己使用 
          的編譯器,可選擇通用編譯器:Generic Compilers。按回車(chē)確認(rèn)。這個(gè)選項(xiàng)會(huì)體現(xiàn)在co- 
          xxx.lnt文件中。 
          7)接著安裝程序會(huì)讓你選擇一個(gè)的內(nèi)存模型,可以根據(jù)自己程序區(qū)和數(shù)據(jù)區(qū)的實(shí)際大小選 
          擇一個(gè)恰當(dāng)?shù)膬?nèi)存模型。如果CPU為32位68K系列,則要選擇:32-bit Flat Module。 
          內(nèi)存模型的選項(xiàng)會(huì)體現(xiàn)在STD.LNT文件中。 
          8)選完內(nèi)存模型后,會(huì)看到一個(gè)庫(kù)類(lèi)型的列表,在這里選擇一個(gè)或多個(gè)編譯時(shí)使用的庫(kù)。 
          這個(gè)選項(xiàng)會(huì)體現(xiàn)在LIB-xxx.LNT文件中。 
          9)接著是讓你選擇為使用C++編程提出過(guò)重要建議的作者,選擇的某作者后,他提出的編 
          程建議方面的選項(xiàng)將被打開(kāi)。與作者選擇有關(guān)的選項(xiàng)會(huì)體現(xiàn)在AU-xxx.LNT文件中。 
          10)下一步是設(shè)置包含文件目錄。有兩種選項(xiàng),第一種是使用環(huán)境變量INCLUDE,環(huán)境變量 
          在批處理文件中設(shè)置,環(huán)境變量后每個(gè)目錄用分號(hào)隔開(kāi),例如可設(shè)成“INCLUDE=C:\MRI\M 
          CC68K;D:\LAP\SRC\INC”。第二種選項(xiàng)是使用-i選項(xiàng),-i選項(xiàng)體現(xiàn)在STD.LNT文件中,每個(gè) 
          目錄前以-I引導(dǎo),目錄間以空格分隔,例如可設(shè)成“-IC:\MRI\MCC68K -ID:\LAP\SRC\INC 
          ”。如果選擇使用-I選項(xiàng),安裝程序會(huì)接著讓你輸入包含文件所在的目錄。 
          11) 如果前面選擇了使用多個(gè)編譯環(huán)境,這里將會(huì)問(wèn)你是否選擇更多的編譯環(huán)境,如果選 
          YES,將會(huì)從第6步開(kāi)使重復(fù)。如果選NO則會(huì)結(jié)束編譯器選擇。 
          12)接下來(lái)將會(huì)準(zhǔn)備產(chǎn)生一個(gè) 反映全局編譯信息顯示情況的選項(xiàng)文件OPTIONS.LNT,該文 
          件的產(chǎn)生方式有兩種,一種是安裝程序?qū)讉€(gè)核心選項(xiàng)逐一解釋并提問(wèn)你是否取消該選項(xiàng) 
          ,如果你選擇取消,則會(huì)體現(xiàn)在OPTIONS.LNT文件中,具體體現(xiàn)方式是在該類(lèi)信息編碼前加 
          -e,后面第13~18步是逐一選擇核心選項(xiàng)的過(guò)程。如果選擇第二種選擇方式,安裝文件會(huì)先 
          生成一個(gè)空的OPTIONS.LNT文件,等你以后在實(shí)際應(yīng)用時(shí)加入必要的選項(xiàng)。 
          13)是否關(guān)閉賦值時(shí)的布爾測(cè)試告警,如:if(a=f()){... 
          14)是否關(guān)閉賦值時(shí)的有符號(hào)量和無(wú)符號(hào)量間的不匹配告警,通常情況下,這種賦值不會(huì) 
          帶來(lái)問(wèn)題,選擇關(guān)閉該告警信息的同時(shí),其他類(lèi)型的有符號(hào)量和無(wú)符號(hào)量間混合操作的告 
          警仍然是打開(kāi)的。 
          15)當(dāng)把一個(gè)整形量賦值給一個(gè)比它短的量時(shí),后者會(huì)丟失精度,例如把一個(gè)INT量賦值給 
          給一個(gè)CHAR量。本步是讓你選擇是否關(guān)閉該類(lèi)告警。 
          16)是否關(guān)閉左移帶符號(hào)量的告警。通常PC-LINT會(huì)對(duì)所有帶符號(hào)量的移動(dòng)產(chǎn)生告警,但右 
          移一般是由不同的CPU來(lái)確定是否將符號(hào)位移入,左移一般是不會(huì)產(chǎn)生什么問(wèn)題的,所以可 
          以選擇關(guān)閉該告警。 
          17)在一個(gè)C函數(shù)被定義或聲明前調(diào)用它,并不總是會(huì)產(chǎn)生錯(cuò)誤,在這里可以選擇是否關(guān)閉 
          該告警選項(xiàng)。該選項(xiàng)對(duì)C++程序不起作用。 
          18)是否關(guān)閉“調(diào)用不存在的函數(shù)原型”告警。有些程序員不愿遵守嚴(yán)格的函數(shù)原形定義 
          約定,但PC-LINT會(huì)在調(diào)用一個(gè)沒(méi)有定義的函數(shù)原型時(shí)產(chǎn)生一個(gè)告警,在這里可以選擇關(guān)閉 
          該告警。 
          19)通過(guò)上面的步驟確定OPTIONS.LNT文件的形式后,接著是選擇編譯環(huán)境。PC-LINT提供 
          了集成在多種開(kāi)發(fā)環(huán)境中工作的功能,例如可集成在VC、BC、Source Insight中。假如我 
          們?cè)谶@里選擇Source Insight。選擇后安裝程序會(huì)繼續(xù)問(wèn)你是否還選擇其它的環(huán)境,可根 
          據(jù)自己應(yīng)用的實(shí)際情況選擇一種或多種開(kāi)發(fā)環(huán)境。開(kāi)發(fā)環(huán)境的選擇情況記錄在env-xxx.ln 
          t文件中。 
          20)安裝程序會(huì)生成一個(gè)LIN.BAT文件,該文件是運(yùn)行PC-LINT的批處理文件,為了使該文 
          件能在任何路徑下運(yùn)行,安裝程序提供了兩種方法供你選擇。第一種方法是讓你選擇把LI 
          N.BAT拷貝到任何一個(gè)PATH目錄下,在安裝結(jié)束運(yùn)行LCOPY.BAT文件時(shí),會(huì)把LIN.BAT拷貝到 
          你指定的目錄。第二種方法是生成一個(gè)LSET.BAT文件,在每次使用PC-LINT前先運(yùn)行它來(lái)設(shè) 
          置路徑,或者把LSET.BAT文件的內(nèi)容拷貝到AUTOEXEC.BAT文件中。 
          21)在安裝程序執(zhí)行完后第一件事是在你安裝的目錄下執(zhí)行LCOPY.BAT文件。它會(huì)從安裝盤(pán) 
          拷貝將一些文件拷貝到安裝目錄下,并根據(jù)你在安裝過(guò)程中的選擇來(lái)設(shè)置文件中的參數(shù)。 

          3.LINT 一個(gè)C文件 
          3.1用命令行方式進(jìn)行LINT 
          如果使用LIN.BAT批處理文件進(jìn)行LINT,在LINT前要先看一下該批處理文件中的內(nèi)容,里面 
          包含了LINT-NT命令和命令選項(xiàng),可以根據(jù)自己的要求來(lái)修改、增減選項(xiàng)。我們看到,在這 
          個(gè)批命令中嵌套了一個(gè)std.lnt文件,在std.lnt文件中還嵌套了co.lnt、options.lnt和l 
          ib-stl.lnt文件,原則上*.lnt文件是可以無(wú)限制嵌套,該類(lèi)文件中一般都是了LINT的選項(xiàng) 
          ,可通過(guò)修改這些文件來(lái)修改LINT選項(xiàng),選項(xiàng)是按照從左到右的順序執(zhí)行的。可執(zhí)行下面 
          命令行: 
          C:\abc\src>lin alpha.c beta.c gamma.c 
          通常對(duì)于由多個(gè)C模塊組成的程序,最好先分別對(duì)每個(gè)C模塊單元進(jìn)行LINT檢查,做單元LI 
          NT時(shí)可如下運(yùn)行: 
          C:\abs\src>lin -u alpha.c 
          其中-u是單元選項(xiàng),使用-u后可以關(guān)閉一些檢查多模塊時(shí)會(huì)產(chǎn)生的告警,例如“函數(shù)未被 
          使用”或“函數(shù)沒(méi)有定義”等。 
          也可以不使用LIN.BAT批處理文件,而直接使用LINT命令。在DOS環(huán)境下LINT命令為L(zhǎng)INT.E 
          XE,在Windows95/NT環(huán)境下為L(zhǎng)INT-NT.EXE,在OS2環(huán)境下為L(zhǎng)INT-OS2.EXE。直接使用LINT 
          命令要注意的一點(diǎn)是要在使用前預(yù)先設(shè)置LINT目錄所在路徑,最好的方法是把該路徑加在 
          AUTOEXEC.BAT文件中。其它的使用方法與使用批處理文件相同。例如: 
          C:\abs\src>lint-nt -ic:\lint\ std.lnt -os(_lint.tmp) *.c 
          3.2用開(kāi)發(fā)環(huán)境進(jìn)行LINT 
          也可以使用開(kāi)發(fā)環(huán)境來(lái)執(zhí)行LINT操作,一般開(kāi)發(fā)環(huán)境都支持運(yùn)行可執(zhí)行文件,但不一定支 
          持運(yùn)行批處理文件,下面用Source Insight , Ultra Edit, MSVC 6.0 來(lái)舉例說(shuō)明如何在 
          開(kāi)發(fā)環(huán)境下進(jìn)行LINT。 
          3.2.1 在Source Insight中集成 
          如果你在安裝過(guò)程中選定了使用某個(gè)開(kāi)發(fā)環(huán)境,安裝程序會(huì)在你安裝的目錄下生成一個(gè)en 
          v-xxx.lnt的文件,例如選擇了Source Insight就會(huì)有一個(gè)env-si.lnt文件。用編輯器打開(kāi) 
          該文件,在該文件開(kāi)始的注釋中說(shuō)明了如何將PC-LINT功能集成在開(kāi)發(fā)環(huán)境中,集成在Sou 
          rce Insight中的過(guò)程如下: 
          1)從Options菜單中選擇“Custom Commands”命令項(xiàng)。 
          2)在Name欄中輸入“PC-lint ”,原則上這個(gè)名稱(chēng)可以隨便起,只要你能搞清楚它的含義 
          就可以了。 
          3)在Run欄中輸入“c:\lint\lint-nt -u -ic:\lint std env-si %f”其中c:\lint是你P 
          C-LINT的安裝目錄。 
          4)在Output欄中選擇“Iconic Window”、“Capture Output”。 
          5)在Control欄中選擇“Save Files First”。 
          6)在Source Links in Output欄中選擇“Parse Links in Output”、“File,then Lin 
          e”。 
          7)在Pattern欄中輸入“^\([^ ]*\) \([0-9]+\)”。 
          8)點(diǎn)Add鍵加入該命令。如下圖: 
          9)使用時(shí),在Source Insight下打開(kāi)要LINT的文件,打開(kāi)Options菜單中的“Custom Com 
          mands”命令項(xiàng),在“Command”欄中選擇“PC-lint unit check”命令運(yùn)行即可。 
          注意到我的Run一欄的參數(shù)和上面的提示不一樣,其實(shí)我的其他古怪參數(shù)都放到c:\lint\s 
          td.lnt中了。請(qǐng)注意,不論你怎樣配置參數(shù)一定不要忘記了將si-env.lnt包含在你的配置 
          文件里,否則就無(wú)法進(jìn)行錯(cuò)誤信息和程序的自動(dòng)對(duì)應(yīng)了。 
          為了使用方便,你還可以配置一下Menu按鈕,將它加到系統(tǒng)菜0單里,這屬于一般性的 
          Source Insight應(yīng)用,筆者就不在此贅述了。 
          第二筆者在NT中使用Source Insight時(shí),好象集成不了,原因暫時(shí)不明了。上面的例子在 
          WIN 95下測(cè)試成功。 
          如果要修改LINT選項(xiàng),可直接在Run欄中修改,也可專(zhuān)門(mén)編輯一個(gè)*.lnt文件放在c:\lint目 
          錄下,并將該文件名加入Run欄中,和命令行方式是一樣的。 
          3.2.2在Ultra Editor中集成 
          選取 Menu | Advanced | Tool Configuration ... , 顯示如下圖: 
          1)點(diǎn)按“Insert", 
          2)在command line:中填寫(xiě):c:\lint\lint-nt c:\lint\std.lnt %f 
          3)在Menu Item中填寫(xiě):PC-LINT 
          4)在Command Output中選擇: (x) Output to List Box 和 (x) Capture Output 
          5)點(diǎn)按"OK" 
          如圖所示的配置筆者在UE6.0 / NT 4.0 下測(cè)試成功。 
          3.2.3 在MSVC 6.0中集成 

          //這個(gè)好使過(guò)
          基本原理是一樣的: 
          1)選取 menu | tools | customize..... 
          2)選取 Tools Tab: 
          3)點(diǎn)按主對(duì)話(huà)框上方的虛線(xiàn)小方框 New a tool item 
          4)輸入 name: PC-LINT 
          5)輸入 Command: c:\lint\lint-nt.exe 
          6)輸入 Arguments: c:\lint\std.lnt $(FilePath)  //注:替std.lnt為lnt\env-vc6.lnt
          7) 選擇 (x) Use Output Window 
          8)Close 
          完成后,在tools菜單下就會(huì)有一項(xiàng)PC-LINT選項(xiàng)。 
          下面是筆者在VC6 / Win NT 4.0 的情況下的TOOL配置圖: 
          3.3LINT選項(xiàng) 
          LINT選項(xiàng)可以放在注釋中,例如: 
          /*lint option1 option2 ... optional commentary */ 
          //lint option1 option2 ... optional commentary 
          選項(xiàng)間要以空格分開(kāi),lint命令一定要小寫(xiě),并且緊跟在/*或//后面,不能有空格。如果 
          選項(xiàng)由類(lèi)似于操作符和操作數(shù)的部分組成,例如-esym(534, printf, scanf, operat or 
          new),其中最后一個(gè)選項(xiàng)是operator new,那么在operator和new中間只能有一個(gè)空 
          格。 
          選項(xiàng)還可以放在宏定義中,例如: 
          #define DIVZERO(x) /*lint -save -e54 */ ((x) /o) /*lint -restore */ 
          LINT的選項(xiàng)很多共有300多種,大體可分為以下幾類(lèi): 
          1)錯(cuò)誤信息禁止選項(xiàng) 
          該類(lèi)選項(xiàng)是用于禁止生成某類(lèi)錯(cuò)誤信息的選項(xiàng),最常用的是-e和+e,-e是禁止生成某類(lèi)錯(cuò) 
          誤信息,+e是恢復(fù)生成某類(lèi)錯(cuò)誤信息。運(yùn)行l(wèi)int目錄下的msg.exe可以得到msg.txt文件, 
          這個(gè)長(zhǎng)達(dá)5000行的文件包含了所有的錯(cuò)誤信息號(hào)和解釋。 
          -w 對(duì)于所有大于級(jí)別的告警信息都不顯示。 
          -wlib()對(duì)于所有大于級(jí)別的關(guān)于庫(kù)函數(shù)數(shù)的告警信息都不顯示。我們可以用-wlib(0)來(lái)屏 
          蔽所有的庫(kù)函數(shù)的告警信息,-wlib(1)只顯示庫(kù)函數(shù)中的句法錯(cuò)誤。 
          -esym(#,) 可以屏蔽對(duì)于特定符號(hào)的某告警信息。 
          2)變量類(lèi)型大小選項(xiàng) 
          不同的目標(biāo)機(jī)、編譯系統(tǒng)變量類(lèi)型的的大小(如短整形變量、整形變量等)會(huì)有所不同, 
          該類(lèi)選項(xiàng)用于為目標(biāo)機(jī)設(shè)置變量類(lèi)型的大小。由于默認(rèn)的設(shè)置與大部分的編譯器是匹配的 
          ,這些專(zhuān)門(mén)的設(shè)置通常情況下是不需要的,只在特別的目標(biāo)機(jī)結(jié)構(gòu)中才用。例如一個(gè)M680 
          00目標(biāo)機(jī),它的int類(lèi)型和指針類(lèi)型通常是32bit的,這時(shí)你應(yīng)該使用選項(xiàng):-si4 
          -sp4。這些尺寸參數(shù)的當(dāng)前值可以通過(guò)help屏來(lái)獲得,例如可以輸入以下命令行: 
          lin -si4 -sp4 ? 
          3)冗長(zhǎng)信息選項(xiàng) 
          冗長(zhǎng)信息指的是LINT過(guò)程中產(chǎn)生的一些與編譯過(guò)程有關(guān)的信息,而不是真正的告警信息、 
          錯(cuò)誤信息等。是否生成這些信息可以通過(guò)-v和+v選項(xiàng)來(lái)決定。+v是生成這些信息,-v是關(guān) 
          閉這些信息,這組選項(xiàng)中除+v外,其它所有選項(xiàng)都可以關(guān)閉+v選項(xiàng)。 
          4)標(biāo)記選項(xiàng) 
          以+f、++f、-f和--f開(kāi)頭的選項(xiàng)是標(biāo)記選項(xiàng)。他們的邏輯含義分別如下: 
          +f...:通過(guò)把標(biāo)志置為1而把它置為ON 
          -f...:通過(guò)把標(biāo)志置為0而把它置為OFF 
          ++f...:標(biāo)志增1 
          --f...:標(biāo)志減1 
          后面兩個(gè)用于你想在局部把一個(gè)標(biāo)志置為ON的情況,而不影響全局設(shè)置。例如你可以這樣 
          使用: 
          /*lint ++flb */ 
          int printf( ); 
          /*lint --flb */ 
          標(biāo)記選項(xiàng)的種類(lèi)很多,基本含義是用于打開(kāi)或關(guān)閉某類(lèi)語(yǔ)法情況使用,例如允許使用縮寫(xiě) 
          結(jié)構(gòu)體名稱(chēng),允許使用無(wú)名聯(lián)合體,把所有模塊當(dāng)作C++編譯等。 
          5)消息顯示選項(xiàng) 
          消息顯示選項(xiàng)用于定義消息輸出格式。主要有消息高度選項(xiàng)、消息寬度選項(xiàng)、消息格式選 
          項(xiàng)等。 
          6)其它選項(xiàng) 
          其它選項(xiàng)中的種類(lèi)很多,各種類(lèi)間差異很大,在這里就不一一介紹了,建議大家看一看《 
          PC-LINT》一書(shū),第五章有對(duì)每種選項(xiàng)的詳細(xì)說(shuō)明。lint本身也有一些說(shuō)明信息, lint-n 
          t 2> lint.txt 然后狂按幾個(gè)回車(chē)就可以生成一個(gè)lint選項(xiàng)的說(shuō)明文件。 
          4.LINT一個(gè)工程下的多個(gè)C文件 
          4.1為何要LINT多個(gè)C文件 
          在程序編碼初期,我們關(guān)心的可能只是單個(gè)C模塊種中的語(yǔ)法問(wèn)題,等到編程后期,對(duì)于由 
          多個(gè)C模塊組成的程序,我們希望了解當(dāng)把多個(gè)模塊連接在一起后是否還有存在于模塊間的 
          語(yǔ)法問(wèn)題。這時(shí)編譯器雖然能給出一些告警,但PC-LINT的連接能給出更多的告警。還有當(dāng) 
          我們能保證其中的幾個(gè)模塊相對(duì)穩(wěn)定,而另外幾個(gè)模塊仍有問(wèn)題時(shí)可以先將幾個(gè)穩(wěn)定的模 
          塊編譯連接成一個(gè)目標(biāo)文件,文件每次修改完成后先單獨(dú)編譯,然后連接入總的目標(biāo)文件 
          。 
          4.2如何LINT一個(gè)工程下的多個(gè)C文件 
          象我們平時(shí)使用的編譯工具一樣,PC-LINT在編譯連接多個(gè)C文件時(shí)也會(huì)先把每個(gè)C文件編譯 
          生成中間的目標(biāo)文件*.lob,然后再將所有的LOB文件連接在一起。LOB是Lint Object Mod 
          ule的縮寫(xiě)。這個(gè)文件中包含了一個(gè)C或C++模塊的所有外部信息。生成LOB文件時(shí)有三種選 
          項(xiàng)要注意:第一種是-u,如果要LINT生成LOB文件,就一定要加-u選項(xiàng);第二種是-zero或 
          -zero(500)選項(xiàng),為了保證LOB文件在模塊存在錯(cuò)誤的情況下也能生成,就一定要加這個(gè)選 
          項(xiàng);第三種是-oo[(filename)],filename是生成的LOB文件的名稱(chēng),在-oo后面,可加,也 
          可不加,如不加,則LOB文件名與原C模塊的名稱(chēng)相同,例如: 
          lint -u alpha.c -oo(a1) 
          生成的LOB文件名為:a1.lob 
          lint -u alpha.c -oo 
          生成的LOB文件名為:alpha.lob 
          LINT一個(gè)工程下的多個(gè)C模塊,在用戶(hù)的源程序目錄下一般需要三個(gè)文件: 一個(gè)選項(xiàng)文件 
          (*.lnt)、一個(gè)批處理文件(*.bat)和一個(gè)MAKEFILE文件(*.mak)。下面一一講述如何 
          制作這些文件。 
          1)選項(xiàng)文件(*.lnt) 
          選項(xiàng)文件在前面也提到過(guò),你可以把你LINT每個(gè)C文件時(shí)時(shí)用到的所有公共選項(xiàng)羅列在該文 
          件中,選項(xiàng)生效的順序按照從左到右,從上到下的原則。該類(lèi)文件可以層層嵌套,嵌套的 
          層數(shù)沒(méi)有限制。例如make.lnt文件: 
          -iC:\lint 
          std.lnt 
          +os(temp) 
          -e46 
          +vm 
          -zero 
          2)批處理文件(*.bat) 
          制作批處理文件時(shí)要注意要在該文件中調(diào)用TCMAKE.EXE文件和MAKEFILE文件,例如lintma 
          ke.mak文件: 
          @echo Lint Making 'makelap': 
          tcmake -flintmake.mak 
          @echo End of making 
          3)MAKEFILE文件(*.mak) 
          MAKEFILE使用的TCMAKE的語(yǔ)法,和我們平時(shí)開(kāi)發(fā)編譯時(shí)使用的MAKEFILE文件語(yǔ)法格式一樣 
          ,例如下面的lintmake.mak文件: 
          MCCPATH = c:\mcc68k 
          OPTION = -u make.lnt -oo 
          GLOBLE = os.h l2lap.h 
          mail_depend = $(GLOBLE) q931.h mail.h 
          lapmain_depend = $(GLOBLE) l1pubdef.h q931.h mail.h 
          lapos_depend = $(GLOBLE) 
          fhdlc1_depend = $(GLOBLE) cpuhdlc.h bd_prar.h q931.h 
          OBJ = mail.lob lapmain.lob lapos.lob fhdlc1.lob 
          project.lob : $(OBJ) 
          lint-nt make.lnt -e768 -e769 *.lob 
          mail.lob: mail.c $(mail_depend) 
          lint-nt $(OPTION) mail.c 
          lapmain.lob: lapmain.c $(lapmain_depend) 
          lint-nt $(OPTION) lapmain.c 
          lapos.lob: lapos.c $(lapos_depend) 
          lint-nt $(OPTION) lapos.c 
          fhdlc1.lob: fhdlc1.c $(fhdlc1_depend) 
          lint-nt $(OPTION) fhdlc1.c 
          4.3簡(jiǎn)單的LINT多個(gè)文件 
          假設(shè)我們的工程不復(fù)雜,我們可以負(fù)擔(dān)起每次都將所有的文件都lint一遍的開(kāi)銷(xiāo),也可以 
          不使用上面的正規(guī)用法。筆者在實(shí)踐中發(fā)現(xiàn),將所有的*.c文件放在一個(gè)lint命令中,同樣 
          能完成lint整個(gè)工程的目的。 
          如: 
          lint-nt c:\lint\std.lnt AllMySource.lnt 
          在AllMySource.lnt中包括你的工程中的所有源文件: 
          a1.c 
          a2.c 
          a3.c 
          需要注意的是,在std.lnt文件中就不需要-u選項(xiàng)了。因?yàn)槲覀円呀?jīng)提供了所有的信息 

          posted on 2007-05-24 10:46 jinfeng_wang 閱讀(3201) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): cppZZ

          評(píng)論

          # re: PCLint (zz ) 2009-07-31 10:02 szwatertek
          自動(dòng)代碼規(guī)則檢查工具QAC的功能

          QAC是自動(dòng)代碼規(guī)則及安全性檢查工具,自動(dòng)檢查軟件代碼對(duì)編程標(biāo)準(zhǔn)的符合性。QAC是唯一能夠完全支持國(guó)軍標(biāo)C語(yǔ)言編程規(guī)范的工具、唯一完全支持嵌入式C語(yǔ)言編程規(guī)范MISRA 2004的工具。QAC自有規(guī)則1300多條,涵蓋了C語(yǔ)言使用的各個(gè)方面,并且支持規(guī)則定制,能夠完全實(shí)現(xiàn)對(duì)各種C編程規(guī)范的支持。
          QAC從代碼安全性、可移植性、可維護(hù)性、可測(cè)試性等方面檢查軟件代碼,切實(shí)提高軟件代碼的質(zhì)量。QAC的規(guī)則都有詳細(xì)的解釋和代碼示例,通過(guò)QAC施行代碼規(guī)則檢查能夠加深提高編程人員對(duì)語(yǔ)言的理解,從根本上提高軟件開(kāi)發(fā)質(zhì)量和軟件代碼質(zhì)量。
          自動(dòng)生成符合國(guó)軍標(biāo)的中文測(cè)試報(bào)告。圖形顯示函數(shù)結(jié)構(gòu)、調(diào)用關(guān)系,方便快速理解代碼。自動(dòng)統(tǒng)計(jì)超過(guò)40種代碼質(zhì)量度量,圖形化地分析管理軟件質(zhì)量。
          QAC使用簡(jiǎn)單,分析速度快,占用資源少,90秒分析萬(wàn)行代碼。

          歡迎來(lái)電咨詢(xún) 0755-26727508 深圳旋極  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 虹口区| 中方县| 伊通| 石屏县| 诏安县| 江城| 邵武市| 井冈山市| 嫩江县| 遂溪县| 斗六市| 信阳市| 万源市| 荥经县| 罗山县| 清苑县| 迭部县| 沙田区| 建平县| 疏附县| 普格县| 科技| 金阳县| 海伦市| 叙永县| 苏尼特右旗| 盱眙县| 河西区| 察隅县| 凤山县| 通道| 吉安市| 沧源| 喀喇| 商丘市| 甘洛县| 建昌县| 天门市| 阿坝县| 平山县| 新乐市|