代碼走查工PCLintNew_第1頁(yè)
代碼走查工PCLintNew_第2頁(yè)
代碼走查工PCLintNew_第3頁(yè)
代碼走查工PCLintNew_第4頁(yè)
代碼走查工PCLintNew_第5頁(yè)
已閱讀5頁(yè),還剩66頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、代碼走查工具代碼走查工具pclint目 錄pc-lint簡(jiǎn)介pc-lint基本使用方法pc-lint常用選項(xiàng)pc-lint在各種環(huán)境中的集成pc-lint常見告警分析及解決措施pc-lint簡(jiǎn)介pc-lint是gimpel software公司開發(fā)的一個(gè)一個(gè)c/c+靜態(tài)語法檢查工具,它不是一個(gè)free 軟件。一般來說,軟件在編譯連接通過后就可以使用pc-lint做靜態(tài)檢查。pc-lint是一個(gè)命令行工具,在8.0版本里提供了300多個(gè)選項(xiàng),1000多個(gè)告警。本篇培訓(xùn)材料旨在引導(dǎo)讀者入門,學(xué)會(huì)pc-lint的基本使用方法,一些常見選項(xiàng)的使用,常見告警的分析及規(guī)避措施,希望可以起拋磚引玉的作用,為

2、讀者深入掌握pc-lint的使用打下基礎(chǔ)。本篇材料主要是以pc-lint8.0在windows上的使用為基礎(chǔ)來做的。pc-lint基本使用方法pc-lint8.0主要由以下一些文件組成:lint-nt.exe windows下的執(zhí)行文件msg.txt 全部選項(xiàng)幫助說明文件pc-lint.pdf pc-lint的幫助文件config.exe 配置程序std.lnt 標(biāo)準(zhǔn)配置文件options.lnt選項(xiàng)配置文件.lnt子目錄下的各種開發(fā)編譯環(huán)境的配置文件其他一些文件pc-lint基本使用方法pc-lint是一個(gè)命令行工具,因此使用方式是命令行帶參數(shù)方式使用。一般的使用格式為: lint-nt.e

3、xe option file1 file2 如:lint-nt.exe -u -id:lint std.lnt sample.c在這里-u 表示只對(duì)本單元進(jìn)行檢查-id:lint 是表示會(huì)在d:lint目錄下搜索文件std.lnt 是表示要使用的配置文件sample.c 表示要檢查的源文件pc-lint基本使用方法檢查一個(gè)目錄下的所有源文件可以使用以下方法:如:lint-nt.exe -u -id:lint std.lnt d:ospvos*.cpp跟前面不同的是這里將sample.c變成了d:ospvos*.cpp,使用*.cpp的意思是它會(huì)檢查d:ospvos目錄下的所有.cpp文件,但是

4、它不能檢查子目錄下的文件pc-lint基本使用方法要檢查所有包括子目錄的文件可以使用以下方法:lint-nt -id:lint std.lnt allsource.lnt 在allsource.lnt文件中可以放置如下: moudule1-dir*.cpp moudule2-dir*.cpp moudule3-dir*.cpp .當(dāng)檢查所有文件時(shí)不需要使用-u選項(xiàng)pc-lint基本使用方法pc-lint配置文件介紹配置文件介紹pc-lint使用那個(gè)配置文件是由命令行參數(shù)決定的,一般地都使用std.lnt文件,std.lnt文件中可以包含各種配置選項(xiàng),還可以包含其他的配置文件,有點(diǎn)類似c的頭文件

5、,里面可以include許多其他頭文件,不過pc-lint配置文件包含其他配置文件不需要寫include,直接寫文件名就可以了。每個(gè)配置文件里都可以包含配置選項(xiàng),這些配置選項(xiàng)也可以放在命令行中,一般為使用方便,命令行中不要放很多選項(xiàng),盡量都將選項(xiàng)放到配置文件中pc-lint基本使用方法以下是vc下的配置文件樣例/ microtec 32-bit, -si4 -sp4, lib-w32.lnt/ standard lint optionsco-msc60.lnt /pc-lint提供的對(duì)vc6的告警屏蔽文件lib-w32.lnt /pc-lint提供的對(duì)vc6庫(kù)頭文件的告警屏蔽文件options

6、.lnt -si4 -sp4 /用戶自定義的選項(xiàng)文件env-vc6.lnt /用戶用來設(shè)置編輯環(huán)境的配置文件-id:vc6vc98include /include 目錄-id:vc6vc98mfcinclude /include 目錄pc-lint基本使用方法一般來說,pc-lint經(jīng)常會(huì)有一些誤報(bào),為了消除這些誤報(bào),不得不將程序風(fēng)格改動(dòng)來規(guī)避,但有時(shí)候怎么改寫程序都有告警,比如說你定義了兩個(gè)宏,前面那個(gè)宏里有一半大括號(hào), 后面那個(gè)宏里有另一半大括號(hào), 這時(shí)候一定會(huì)有告警,你不得不使用一些pc-lint選項(xiàng)來屏蔽這些告警。一般情況下,我們都將自己要寫的選項(xiàng)放在options.lnt文件中pc-

7、lint基本使用方法另外還有關(guān)于編輯環(huán)境的問題,如果把pc-lint集成到某個(gè)編輯環(huán)境中,那么他輸入的格式必須和對(duì)應(yīng)環(huán)境吻合才能保證在鼠標(biāo)點(diǎn)擊(或雙擊)錯(cuò)誤消息條目時(shí)可以自動(dòng)定位到對(duì)應(yīng)源代碼行,一般來說這類配置都放置在env-xxx.lnt文件中,如vc6的時(shí)env-vc6.lnt, sourceinsight的是env-si.lntpc-lint本身提供了對(duì)各種編譯器及對(duì)應(yīng)庫(kù)頭文件的告警屏蔽文件,如co-msc60.lnt是對(duì)vc6的,lib-w32.lnt是對(duì)win32庫(kù)頭文件告警的屏蔽配置文件pc-lint常用選項(xiàng)-i選項(xiàng)這個(gè)選項(xiàng)主要是用來設(shè)置include路徑的如:-id:vc6vc9

8、8include-e#選項(xiàng)這個(gè)選項(xiàng)主要是用來屏蔽告警號(hào)為#的告警如:-e818 表示不顯示告警號(hào)為818的告警-esym(#, 符號(hào)名)選項(xiàng)這個(gè)選項(xiàng)主要是用來屏蔽告警號(hào)為#的某個(gè)符號(hào)的告警,如-esym(39, std)-emacro(#,宏名稱)選項(xiàng)這個(gè)選項(xiàng)主要是用來屏蔽告警號(hào)為#的某個(gè)宏的告警pc-lint常用選項(xiàng)-dname=value這個(gè)選項(xiàng)主要是用來定義一個(gè)宏的如:-dwin32, -dalpha=0-sp#表示指針的尺寸大小是#字節(jié)如:-sp4表示指針是4個(gè)字節(jié)大小-si#表示int的尺寸大小是字節(jié)如:-si4表示int型是4個(gè)字節(jié)大小-t#設(shè)置tab鍵的大小為#個(gè)空格,缺省是8p

9、c-lint常用選項(xiàng)-sem選項(xiàng)這個(gè)選項(xiàng)主要是用來消除一些語義上的告警比如說在一個(gè)函數(shù)a里面分配了內(nèi)存,這時(shí)調(diào)用了另一個(gè)函數(shù)addnode將分配的內(nèi)存保存起來了,因此在函數(shù)a里面沒有釋放內(nèi)存,如果使用pc-lint檢查會(huì)有內(nèi)存泄漏方面的告警,因?yàn)閜c-lint不知道函數(shù)addnode將分配的內(nèi)存保存起來了,要消除這個(gè)告警就要用到-sem選項(xiàng)了。假設(shè)addnode的第2個(gè)參數(shù)是用來保存分配內(nèi)存,用法如下-sem(addnode, custodial(2) 這里custodial關(guān)鍵字是表示保存的意思,2是表示第2個(gè)參數(shù)。-sem選項(xiàng)還有些其他用法,大家可以看pc-lint自帶的pc-lint.p

10、df文件,里面有詳細(xì)的解析pc-lint常用選項(xiàng)-function(function0, function1, )選項(xiàng)這個(gè)選項(xiàng)一般情況下主要是用來表示function1及后面省略掉的函數(shù)和function0有類似的行為。如:-function(malloc, mymalloc1, mymalloc2)表示mymalloc1, mymalloc2和malloc有類似的行為,因?yàn)閙alloc是用來分配內(nèi)存的,所以pc-lint在檢查mymalloc1和mymalloc2時(shí)也會(huì)想檢查malloc一樣看是否有釋放掉象上一頁(yè)里已經(jīng)定義了addnode為保存內(nèi)存的函數(shù),如果碰到還有一個(gè)函數(shù)addevent

11、也是有保存內(nèi)存的功能,我們除了可以使用-sem(addevent, custodial(2)外,也可以使用-function(addnode, addevent), 效果是一樣的。不過要注意的是addevent保存內(nèi)存的參數(shù)也要和addnode一樣是第2個(gè)。pc-lint常用選項(xiàng)-format選項(xiàng)這個(gè)選項(xiàng)主要是用來設(shè)置輸出告警消息格式的,以便于可以和編輯環(huán)境格式一樣,便于自動(dòng)定位到告警對(duì)應(yīng)的源代碼如對(duì)sourceinsight, -format選項(xiàng)的使用如下:-format=%f %l %t %n: %m“這里%f表示文件名%l表示代碼行號(hào)%t表示告警類型,如warning, error等%n

12、表示pc-lint的告警號(hào)%m表示pc-lint輸出的告警文本信息pc-lint常用選項(xiàng)-fallthrough這個(gè)選項(xiàng)主要是用在switch case中沒有使用break的情況可以在代碼中使用/lint fallthrough來消除沒有使用break的告警-save保存錯(cuò)誤抑制狀態(tài)如:在代碼中使用 /lint save e429則表示從這行開始之后的代碼抑制429告警的出現(xiàn),直到使用/lint restore來進(jìn)行恢復(fù)后才會(huì)重新出現(xiàn)429告警-restore重新設(shè)置錯(cuò)誤抑制狀態(tài),使用-save選項(xiàng)抑制的告警將重新恢復(fù),在使用了-save選項(xiàng)后一定要記住使用-restore進(jìn)行恢復(fù),否則可能有

13、許多告警就被屏蔽調(diào)不出現(xiàn)了。pc-lint常用選項(xiàng)其他一些常用選項(xiàng)還有-elib 抑制庫(kù)頭文件的告警-elibsym 抑制庫(kù)頭文件中某個(gè)符號(hào)的告警-wlevel 設(shè)置告警級(jí)別-efile 用來抑制一個(gè)或多個(gè)文件里的告警-efunc 用來抑制一個(gè)或多個(gè)函數(shù)里的告警+rw 設(shè)置保留關(guān)鍵字等等。象-efile, -wlevel這些告警不要輕易使用這些選項(xiàng)的具體用法請(qǐng)看pc-lint.pdf文件pc-lint在各種環(huán)境中的集成pc-lint在各種環(huán)境中的集成方法原理都是一樣的,只要掌握前面講的基本用法,知道如何用命令行來檢測(cè)單個(gè)文件,一個(gè)目錄下的所有文件,許多目錄下的所有文件等,然后再結(jié)合各種環(huán)境的具

14、體設(shè)置,就可以很方便地將pc-lint集成到各種應(yīng)用環(huán)境中了。下面將以vc6, sourceinsight, ultraedit, tornado四種環(huán)境為例講述如何集成pc-lintpc-lint在各種環(huán)境中的集成在vc環(huán)境中集成在vc的tools 菜單中, 按 customize會(huì)出現(xiàn)下一頁(yè)出現(xiàn)的對(duì)話框先在上面的列表框里增加一個(gè)條目,里面填上pc-lint80, 文本內(nèi)容可以是其他的,由你自己決定。然后在command:這一欄中輸入pc-lint的執(zhí)行文件名,要帶上目錄再在arguments:一欄里填上-u -ic:lint std.lnt $(filename)這里$(filename)

15、表示vc窗口里當(dāng)前打開的文件名你也可以將它改成$(filedir)*.cpp表示檢查當(dāng)前打開文件同一目錄下的所有.cpp文件,通常用于檢查一個(gè)模塊還可以改成allsource.lnt, 象前面講過的一樣,allsource.lnt是一個(gè)放置有所有文件的配置文件,這時(shí)要將-u去掉。pc-lint在各種環(huán)境中的集成pc-lint在各種環(huán)境中的集成再在initial directory一欄里填上$(filedir) 最后再將use output window打上勾就完成了將pc-lint集成到vc環(huán)境中pc-lint在各種環(huán)境中的集成在sourceinsight3.1中的集成在sourceinsig

16、ht3.1中集成pc-lint過程如下:1)從options菜單中選擇“custom commands”命令項(xiàng)。2)點(diǎn)add鍵會(huì)出現(xiàn)下面的add new custom command對(duì)話框在new command name:欄中輸入“pc-lint80 ”,原則上這個(gè)名稱可以隨便起,只要你能搞清楚它的含義就可以了,然后按ok按鈕。pc-lint在各種環(huán)境中的集成3)在run欄中輸入“d:lintlint-nt -u -ic:lint std.lnt env-si %f”其中d:lint是你pc-lint的安裝目錄, %f是表示當(dāng)前打開的文件。如果要lint多個(gè)文件則需要使用配置文件,在配置文件

17、里包含多個(gè)文件,將%f改成你自己的配置文件即可。4)在output欄中選擇“iconic window”、“capture output”。5)在control欄中選擇“save files first”、將缺省打了勾選上的“pause when done”改成不選擇。6)在source links in output欄中選擇“parse links in output”、“file,then line”。7)在pattern欄中將缺省設(shè)置改成( *) (0-9+)就大功告成了。8)如果需要lint當(dāng)前打開文件的同一目錄下所有文件,可以將%f改成%d*.cpp如下圖:pc-lint在各種環(huán)境中

18、的集成pc-lint在各種環(huán)境中的集成在tornado2.0環(huán)境中集成在tornado2.0的tools菜單中點(diǎn)customize后會(huì)出現(xiàn)如下一頁(yè)的對(duì)話框。先在對(duì)話框中按add按鈕在menu text一欄中輸入pc-lint80在tool command:一欄中輸入 d:lintlint-nt.exe -id:lint std.lnt $filename 你也可以象前面講過vc中集成一樣,將$filename改成$filedir*.cpp 或allsource.lnt在working一欄中輸入$filedir再將redirect to child wind選上,按ok就可以了pc-lint在各

19、種環(huán)境中的集成pc-lint在各種環(huán)境中的集成在ultraedit環(huán)境中集成在advanced菜單中選tool configuration . , 顯示圖如下一頁(yè)所示在command line:中填寫:d:lintlint-nt id:lint std.lnt %f在menu item中填寫:pc-lint80在command output中選擇: (x) output to list box 和 (x) capture output5)按insert 按鈕再按ok按鈕就可以了pc-lint在各種環(huán)境中的集成pc-lint常見告警分析及解決措施pc-lint的告警級(jí)別定義如下: c c+ wa

20、rning level syntax errors 1 - 199 1001 - 1199 1internal errors 200 - 299 0fatal errors 300 - 399 0warnings 400 - 699 1400 - 1699 2informational 700 - 899 1700 - 1899 3elective notes 900 - 999 1900 - 1999 4pc-lint常見告警分析及解決措施pc-lint告警分為04級(jí),其中0級(jí)是內(nèi)部錯(cuò)誤或致命錯(cuò)誤,1級(jí)告警是句法錯(cuò)誤,2級(jí)告警是警告,3級(jí)是信息,4級(jí)是可選的,4級(jí)缺省是不打開的。0級(jí)告警是不

21、允許出現(xiàn)的,1級(jí)告警一般也是不允許出現(xiàn)的,如果出現(xiàn),說明可能pc-lint配置上可能有問題,或者程序根本編譯不過,2級(jí)告警一般也是不能屏蔽的,2級(jí)告警很多是內(nèi)存資源沒有釋放,指針越界一類的警告,會(huì)產(chǎn)生嚴(yán)重問題,3級(jí)告警有些告警也是非常重要的,會(huì)引起嚴(yán)重問題,有些告警屬于提示信息,問題不是很大,所以3級(jí)告警里要分情況對(duì)待。02級(jí)告警都不能使用-e選項(xiàng)進(jìn)行屏蔽,只能使用-esym,-emacro, -sem之類的選項(xiàng)進(jìn)行屏蔽;3級(jí)告警要根據(jù)具體情況,有些可以使用-e選項(xiàng)進(jìn)行屏蔽,有些不可以。下面就對(duì)經(jīng)常遇到的一些告警進(jìn)行詳細(xì)的分析及討論解決措施。pc-lint常見告警分析及解決措施告警號(hào)告警號(hào):3

22、9 告警等級(jí)告警等級(jí):1告警消息樣例告警消息樣例:stl_type_traits.h(279): error 39: (error - redefinition of symbol _type_traits conflicts with line 271)分析及解決措施分析及解決措施: 可以使用-esym(39,符號(hào)名)來消除此告警,在這里可以使用 -esym(39, _type_traitspc-lint常見告警分析及解決措施告警號(hào)告警號(hào):402 告警等級(jí)告警等級(jí):2告警消息樣例告警消息樣例:xxx.cpp(77): error 402: (warning - static function

23、 vos_getfixedstackdepth(void) (line 77)分析及解決措施分析及解決措施:主要是函數(shù)原型申明為靜態(tài)的,但函數(shù)實(shí)體確漏寫了static造成pc-lint常見告警分析及解決措施告警號(hào)告警號(hào):413 告警等級(jí)告警等級(jí):2告警消息樣例告警消息樣例:xxx.cpp(1118): error 413: (warning - likely use of null pointer unknown-name in argument to operator unary *分析及解決措施分析及解決措施:指針未校驗(yàn)引起,如果確認(rèn)指針可以由外部保證則可以使用assert來消除此告警pc

24、-lint常見告警分析及解決措施告警號(hào)告警號(hào):429 告警等級(jí)告警等級(jí):2告警消息樣例告警消息樣例:xxx.cpp(2474): error 429: (warning - custodial pointer pevent (line 2459) has not been freed or returned) 分析及解決措施分析及解決措施:addevent將指針pevent保存起來,解決辦法是使用-sem(isystem:addevent,1p,custodial(1)來屏蔽此告警,這里1p是表示第1個(gè)參數(shù),custodial(1)是表示第1個(gè)參數(shù)被保留起來了。 另外還有函數(shù)遞歸調(diào)用時(shí),如果遞

25、歸調(diào)用時(shí)使用的參數(shù)和函數(shù)參數(shù)同名也會(huì)出現(xiàn)此告警,遞歸調(diào)用時(shí)必須將參數(shù)改名。還有一種情況是在父函數(shù)里分配了內(nèi)存,傳遞到子函數(shù)后,由于子函數(shù)里有return語句有時(shí)也會(huì)產(chǎn)生429告警,這種行為非常奇怪,目前沒有找到好的消除辦法,盡量將程序結(jié)構(gòu)改成把return語句去掉就沒有這個(gè)告警了。pc-lint常見告警分析及解決措施告警號(hào)告警號(hào):522 告警等級(jí)告警等級(jí):2告警消息樣例告警消息樣例:error 522: (warning - expected void type, assignment, increment or decrement)分析及解決措施分析及解決措施:?jiǎn)为?dú)的*p+型可以改寫成(*p

26、)+可以避免此告警,如果是*(p+)就沒有必要了,直接寫成p+就可以了。*p+型作為右值的話一般不會(huì)有此告警,另外函數(shù)返回值未處理有時(shí)也有此告警pc-lint常見告警分析及解決措施告警號(hào)告警號(hào):525 告警等級(jí)告警等級(jí):2告警消息樣例告警消息樣例:warning 525: negative indentation from line 312分析及解決措施分析及解決措施:如果確定程序沒有問題的話,可以檢查告警 525的產(chǎn)生是否由于程序中有tab鍵或者程序排版沒有對(duì)齊造成的,將tab刪掉,改成空格,將排版格式對(duì)齊就可以了pc-lint常見告警分析及解決措施告警號(hào)告警號(hào):534 告警等級(jí)告警等級(jí):2

27、告警消息樣例告警消息樣例:xxx.cpp(1694): error 534: (warning - ignoring return value of function yyy(unsigned long) (compare with line 180分析及解決措施分析及解決措施:一般都是由于沒有處理函數(shù)返回值造成,如果確信函數(shù)返回值可以不處理的話,只要在不需要處理函數(shù)返回值的函數(shù)前加上(void)就可以了。pc-lint常見告警分析及解決措施告警號(hào)告警號(hào):539 告警等級(jí)告警等級(jí):2告警消息樣例告警消息樣例:warning 539: did not expect positive indent

28、ation from line 210分析及解決措施分析及解決措施:除了左邊所說的問題外,如果程序中有tab鍵,且不是8個(gè)空格的話,有時(shí)也會(huì)引起告警539的產(chǎn)生,如果消除掉左邊所說的問題還有539告警的話,則估計(jì)是由于程序中有tab鍵造成的,將tab刪掉,改成空格,并且排版格式要對(duì)齊就可以了。pc-lint常見告警分析及解決措施告警號(hào)告警號(hào):613 告警等級(jí)告警等級(jí):2告警消息樣例告警消息樣例:xxx.cpp(374): error 613: (warning - possible use of null pointer matrix in left argument to operator

29、ptr+int 分析及解決措施分析及解決措施:通常是由于指針和整數(shù)相加造成的問題bool *matrix =(bool *)new bool(size_t)(len * len); bool *dep = matrix + row * len;可以改寫成先將地址轉(zhuǎn)換成整數(shù)形式,再相加后,再將整數(shù)形式的地址轉(zhuǎn)換為指針可以消除此告警。 另外還有指針在其他函數(shù)校驗(yàn)了,但在本函數(shù)內(nèi)沒有校驗(yàn)也會(huì)有此告警,象組建中,因?yàn)橛衖nitialize()函數(shù)里保證那些組件指針的合法性,因此在其他函數(shù)里不再需要對(duì)這些指針做校驗(yàn),此種情況可以使用assert()來消除此告警,其他情況請(qǐng)使用指針校驗(yàn)來消除此告警。pc-

30、lint常見告警分析及解決措施告警號(hào)告警號(hào):616 告警等級(jí)告警等級(jí):2告警消息樣例告警消息樣例:xxx.cpp(162): error 616: (warning - control flows into case/default)分析及解決措施分析及解決措施:case沒有break;語句的問題,使用/lint -fallthrough 來屏蔽pc-lint常見告警分析及解決措施告警號(hào)告警號(hào):661 告警等級(jí)告警等級(jí):2告警消息樣例告警消息樣例:xxx.cpp(2560): error 661: (warning - possible access of out-of-bounds poin

31、ter (1 beyond end of data) by operator unary *分析及解決措施分析及解決措施:內(nèi)存越界問題,如果由調(diào)用方保證,可以使用assert來消除此告警,否則應(yīng)該對(duì)輸入?yún)?shù)進(jìn)行校驗(yàn)pc-lint常見告警分析及解決措施告警號(hào)告警號(hào):668 告警等級(jí)告警等級(jí):2告警消息樣例告警消息樣例:xxx.cpp(1211): error 668: (warning - possibly passing a null pointer to function memset(void *, int, unsigned int), arg. no. 1 分析及解決措施分析及解決措施

32、:指針可能為null,一般都是由于沒有進(jìn)行校驗(yàn)引起,如果指針由外部可以保證的話,可以使用assert消除這個(gè)告警pc-lint常見告警分析及解決措施告警號(hào)告警號(hào):672 告警等級(jí)告警等級(jí):2告警消息樣例告警消息樣例:xxx.cpp(353): error 672: (warning - possible memory leak in assignment to pointer cmpfactory:m_plibrary) 分析及解決措施分析及解決措施:一個(gè)函數(shù)中申請(qǐng)了內(nèi)存在本函數(shù)中沒有釋放,在其他函數(shù)中釋放會(huì)引起這個(gè)告警可以使用-esym或-sem來消除pc-lint常見告警分析及解決措施告警

33、號(hào)告警號(hào):685 告警等級(jí)告警等級(jí):2告警消息樣例告警消息樣例:xxx.cpp(2346): error 685: (warning - relational operator = always evaluates to true)分析及解決措施分析及解決措施:簡(jiǎn)單問題,通常是代碼里判斷條件錯(cuò)誤造成,修改代碼即可 比如定義一個(gè)char類型變量,條件判斷 讓它hashdestroy(); if (m_pnametable != null) delete m_pnametable; m_pnametable = null; 明顯應(yīng)該將hashdestroy放到if判斷里面,并且要?jiǎng)h除掉assert

34、那一行pc-lint常見告警分析及解決措施告警號(hào)告警號(hào):785 告警等級(jí)告警等級(jí):2告警消息樣例告警消息樣例: xxx.cpp(639): error 785: (info - too few initializers for aggregate)分析及解決措施分析及解決措施: 通常時(shí)給數(shù)組初始化賦值時(shí)沒有給所有的賦值造成,可以將其他的也賦值完來消除這個(gè)問題。這個(gè)告警目前在平臺(tái)中非常多,即使使用-e參數(shù)屏蔽也屏蔽不了,還是會(huì)出現(xiàn),這就要求編碼時(shí)養(yǎng)成良好的習(xí)慣。pc-lint常見告警分析及解決措施告警號(hào)告警號(hào):786 告警等級(jí)告警等級(jí):2告警消息樣例告警消息樣例: xxx.cpp(2451):

35、error 786: (info - string concatenation within initializer)分析及解決措施分析及解決措施: 同一個(gè)字符串分成多行書寫時(shí),使用雙引號(hào)進(jìn)行連接出的告警,此告警主要是提示是否多個(gè)字符串在中間忘了用標(biāo)點(diǎn)符號(hào)格開,有時(shí)候有些字符串很長(zhǎng),需要分成多行書寫時(shí)也會(huì)使用多個(gè)雙引號(hào),這時(shí)可以使用/lint save -786, /lint restore來屏蔽pc-lint常見告警分析及解決措施告警號(hào)告警號(hào):794 告警等級(jí)告警等級(jí):2告警消息樣例告警消息樣例: xxx.cpp(934): error 794: (info - conceivable us

36、e of null pointer p in left argument to operator ptr-ptr分析及解決措施分析及解決措施: 同告警613一樣,指針未校驗(yàn)引起,如果校驗(yàn)是在函數(shù)外部保證的,可以使用assert來避免此告警pc-lint常見告警分析及解決措施告警號(hào)告警號(hào):796 告警等級(jí)告警等級(jí):2告警消息樣例告警消息樣例: xxx.cpp(396): error 796: (info - conceivable access of out-of-bounds pointer (1 beyond end of data) by operator unary *)分析及解決措施分

37、析及解決措施: 指針有可能越界的問題,通常是由于沒有校驗(yàn)分配空間長(zhǎng)度引起pc-lint常見告警分析及解決措施告警號(hào)告警號(hào):797 告警等級(jí)告警等級(jí):2告警消息樣例告警消息樣例: xxx.cpp(396): error 797: (info - conceivable creation of out-of-bounds pointer (2 beyond end of data) by operator + 分析及解決措施分析及解決措施: 指針未做校驗(yàn)有可能引起越界,比如定義一個(gè)指針指向字符串,但是在使用p+操作時(shí)沒有先判斷指針是否會(huì)越界 如可以判斷*p != 0或校驗(yàn)指針和起點(diǎn)地址差是否超過預(yù)

38、先分配的空間長(zhǎng)度。pc-lint常見告警分析及解決措施告警號(hào)告警號(hào):801 告警等級(jí)告警等級(jí):3告警消息樣例告警消息樣例: xxx.cpp(340): error 801: (info - use of goto is deprecated) 分析及解決措施分析及解決措施: 使用了goto語句造成,有些人使用goto語句不規(guī)范,如果屏蔽會(huì)引發(fā)其他程序結(jié)構(gòu)不合理的問題,所以在程序中還是不要使用goto語句。pc-lint常見告警分析及解決措施告警號(hào)告警號(hào):818 告警等級(jí)告警等級(jí):3告警消息樣例告警消息樣例: xxx.c(323) : info 818: pointer parameter pg

39、raph (line 206) could be declared as pointing to const分析及解決措施分析及解決措施: 這個(gè)問題產(chǎn)生主要是因?yàn)楹瘮?shù)參數(shù)在函數(shù)中為只讀的,可以申明為const類型,但是如果使用以下形式:typdef struct point_t int x; int y; point, *lppoint; int insertpoint(lppoint ppoint); 如果使用lppoint類型的指針類型來定義參數(shù)的話,即使改為const lppoint ppoint也仍然會(huì)有告警. 必須改為 const point *ppoint才能消除此告警pc-lin

40、t常見告警分析及解決措施告警號(hào)告警號(hào):825 告警等級(jí)告警等級(jí):3告警消息樣例告警消息樣例: xxx.cpp(2243): error 825: (info - control flows into case/default without -fallthrough comment)分析及解決措施分析及解決措施: 使用/lint -fallthrough在代碼里進(jìn)行注釋可以消除此告警pc-lint常見告警分析及解決措施告警號(hào)告警號(hào):826 告警等級(jí)告警等級(jí):3告警消息樣例告警消息樣例: xxx.cpp(290): error 826: (info - suspicious pointer-to

41、-pointer conversion (area too small)分析及解決措施分析及解決措施: 這個(gè)問題的產(chǎn)生通常是由于內(nèi)存越界造成或?qū)⒁粋€(gè)空間小的指針轉(zhuǎn)換為一個(gè)空間大的指針造成,xxx.cpp中的代碼為: ptailcheck = (dword *)(char *)pbuf + pptinfo-bufsize - vos_pt_buf_tail_len); 實(shí)際上是將 char *轉(zhuǎn)換為dword *造成的。 可以在本行前使用注釋/*lint -save -e826 */屏蔽,在本行后再使用/*lint -restore */恢復(fù)的辦法pc-lint常見告警分析及解決措施告警號(hào)告警號(hào)

42、:834 告警等級(jí)告警等級(jí):3告警消息樣例告警消息樣例: int x = (rect.width() - cxicon + 1) / 2; xxx.cpp(178) : info 834: operator - followed by operator + is confusing. use parentheses.分析及解決措施分析及解決措施: 這個(gè)告警很簡(jiǎn)單,主要是需要使用括號(hào)將表達(dá)式按運(yùn)算優(yōu)先順序括起來以方便閱讀pc-lint常見告警分析及解決措施告警號(hào)告警號(hào):1065 告警等級(jí)告警等級(jí):3告警消息樣例告警消息樣例: xxx.cpp(657): error 1065: (error -

43、symbol vos_terminatehandle(void) not declared as c conflicts with line 510)分析及解決措施分析及解決措施: 在頭文件里被申明為extern c,但在cpp文件里函數(shù)前沒有加上extern c關(guān)鍵字造成pc-lint常見告警分析及解決措施告警號(hào)告警號(hào):1540 告警等級(jí)告警等級(jí):3告警消息樣例告警消息樣例: xxx.cpp(495): error 1540: (warning - pointer member cxxxobject:m_pcrc4fecses (line 76, xxxp.h, module yyy.cpp

44、) neither freed nor zeroed by destructor)分析及解決措施分析及解決措施: 析構(gòu)函數(shù)中沒有對(duì)成員指針變量進(jìn)行內(nèi)存釋放或清零操作, 修改代碼即可pc-lint常見告警分析及解決措施告警號(hào)告警號(hào):1732 告警等級(jí)告警等級(jí):3告警消息樣例告警消息樣例: xxx.cpp(48): error 1732: (info - new in constructor for class fec_current_data which has no assignment operator)分析及解決措施分析及解決措施: 在構(gòu)造函數(shù)中調(diào)用new造成,所以在構(gòu)造函數(shù)中盡量不要分配內(nèi)存pc-lint常見告警分析及解決措施告警號(hào)告警號(hào):1733 告警等級(jí)告警等級(jí):3告警消息樣例告警消息樣例: xxx.cpp(11): error 1733: (info - new in constructor f

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論