Pclint作业指导书.docx

上传人:b****3 文档编号:27073844 上传时间:2023-06-26 格式:DOCX 页数:64 大小:1,016.76KB
下载 相关 举报
Pclint作业指导书.docx_第1页
第1页 / 共64页
Pclint作业指导书.docx_第2页
第2页 / 共64页
Pclint作业指导书.docx_第3页
第3页 / 共64页
Pclint作业指导书.docx_第4页
第4页 / 共64页
Pclint作业指导书.docx_第5页
第5页 / 共64页
点击查看更多>>
下载资源
资源描述

Pclint作业指导书.docx

《Pclint作业指导书.docx》由会员分享,可在线阅读,更多相关《Pclint作业指导书.docx(64页珍藏版)》请在冰豆网上搜索。

Pclint作业指导书.docx

Pclint作业指导书

Pclint作业指导书

-----------陈XXX

目录

Pclint作业指导书1

目录1

1、序言2

2、Pclint介绍2

3、Pclint使用介绍2

3.1:

Pclint的安装2

3.2:

Pclint的配置3

3.3:

Pclint的初步使用(使用命令行方式)15

3.4:

Pclint的初步使用(与配置环境集成)16

3.5:

Pclint配置文件介绍18

3.6:

PC-Lint常用选项19

4.PC-Lint常见告警分析及解决措施21

40变量未定义22

550变量未被访问23

420访问超出范围的内存24

506固定的布尔值25

616switch控制流错误26

527无法执行到的语句28

661数组越界29

520for循环的第一个表达式30

521for循环的第三个表达式31

522指针自加33

525未正确缩进35

529变量未被引用36

433为指针分配的空间不够38

530变量未初始化39

429指针存储空间未释放或返回41

603变量未初始化41

534忽略函数的返回值43

539缩排格式错误44

545&的可疑使用45

605增强的指针46

613可能使用了空指针49

650比较数值时,常量的范围超过了变量范围50

734丢失精度52

737无符号变/常量和有符号变/常量存在于同一个表达式中54

573除法运算中同时出现有符号和无符号变量55

744在switch语句中没有default56

774Boolean表达式始终返回真/假58

5.经验分享59

5.1实际项目经验分享59

5.2、pclint使用注意事项60

6.项目实践60

1、序言

C/C++语言的语法拥有其它语言没有的灵活性,这种灵活性带来了代码效率的提升,但相应也使得代码编写具有很大的随意性。

另外绝大多数C/C++编译器不进行强制类型检查,也不做任何边界检查,这就增加了代码中存在隐患的可能性。

如果能够在代码提交测试之前发现这些潜在的错误,就能够极大地减轻测试人员的压力,减少软件项目的除错成本。

2、Pclint介绍

目前有很多的C/C++静态代码检查工具,而pclint则是这些工具中的佼佼者。

PC-Lint是GIMPELSOFTWARE公司研发的C/C++软件代码静态分析工具,他的全称是PC-Lint/FlexeLintforC/C++。

PC-Lint能够在Windows、MS-DOS和OS/2平台上使用,以二进制可执行文档的形式发布,而FlexeLint运行于其他平台,以源代码的形式发布。

PC-lint在全球拥有广泛的客户群,许多大型的软件研发组织都把PC-Lint检查作为代码走查的第一道工序。

PC-Lint不但能够对程式进行全局分析,识别没有被适当检验的数组下标,报告未被初始化的变量,警告使用空指针连同冗余的代码,还能够有效地提出许多程序在空间利用、运行效率上的改进点。

3、Pclint使用介绍

3.1:

Pclint的安装

Pclint安装包一般以压缩包的形式提供,运行压缩包内的安装文件,选择安装目标位置。

安装完成后,在安装目录会生成以下文件:

lint-nt.exe――PC-lint可执行文件;

config.exe――PC-lint的配置文件;

readme.txt――手册的附录;

pc-lint.pdf――轻便数据格式的操作手册;

pr.exe――一个方便的打印工具;

msg.txt――我们消息描述的ASCII翻译;

unwise.exe――一个卸载程序;

install.log――一个安装日志;

Lnt\――一个子目录,包含...

co-....lnt――对特定编译器的编译选项文件;

co.lnt――一个通用的编译器选项文件;

sl-....c――对non-ANSI编译器的标准库模块;

sl.c――对non-ANSI编译器的通用的标准库模块;

env-....lnt――对不同环境下(包括Microsoft'sVisualStudio和不同的编辑器)的选项文件;

lib-....lnt――对特别的库的选项文件;

au-....lnt――对作者推荐的检查的选项文件;

Test\――一个包含不同的测试文件的子目录。

安装后,你将得到信息“IwanttostarttheCONFIG.exefilenow”.如果你回到“Yes”,则马上配置你对编译器和库合适的选项。

如果回答“No”,则安装结束(若下一次你要对其进行配置,可手动运行目录下的config.exe进行配置)。

3.2:

Pclint的配置

配置程序(config.exe),也就是我们谈到的配置wizard,有两个基本的操作模式:

(i)作为一个wizard帮助你对你的编译器、库和个人的参数选择合适的选项。

这个模式在初始化安装后使用,也可以在后来当配置变化时使用;

(ii)作为一个程序以后运行,允许你方便的在以前的配置间切换。

在此处,我们选择直接运行config.exe来进行对其的配置。

运行config.exe后出现如下图所示的界面

点击“下一步”,进入配置信息说明界面

直接点击“下一步”按钮,进入配置向导界面

在该界面中有两个选择,一个是创建一个新的配置文件;一个是选择已有的配置文件,在此我们选择创建一个新的STD.LNT项,点击”下一步”,进入编译器配置文件选择界面

在此处,我们选择vc6编译器。

注:

如果不知道当前的编译器类型,可以默认选择GenericCompilers(co.lnt)项。

点击“下一步”按钮,进入内存模式选择界面

可以根据自己程序区和数据区的实际大小选择一个恰当的内存模型,内存模型的选项会体现在STD.LNT文件或新创建的配置文件中。

因为我们目前的开发环境是32位的,所以在此选择“32-bitFlatModel”,然后点击“下一步”安装选择所要的支持库的配置信息。

Pclint对一些常用的库都提供了配置信息支持,选择这些定制信息库,有助于开发人员将更多精力倾注于自己的代码上。

选择的支持库配置将被引入到STD.LNT文件或新创建的STD_x.LNT文件中。

注:

在选择库支持,通常选择目前项目所用到的库,适合就好。

点击“下一步”,进入选择编程规则建议界面。

如果选择某某的建议,那么他提出的编程建议方面的选项将被打开,通常情况下建议全部选择,点击“下一步”按钮。

 

接下来是选择用何种方式设置包含文件目录,如果选择使用-i方式协助设置包含文件选项,下一步就会要求输入一个或多个包含路径。

也可以跳过这一步,以后手工修改配置文件,-i选项体现在STD.LNT文件或新创建的STD_x.LNT文件中,每个目录前以-i引导,目录间以空格分隔,如果目录名中有长文件名或包含空格,使用时要加上双引号,如-i“C:

\ProgramFiles\MicrosoftVisual

C++\VC98\Indlue”。

这里我们选择用-i方式协助我们来设置,然后点击“下一

步”按钮:

这一步就是在下面的文本框里可手工输入文件包含路径,用分号“;”或用

ctrl+Enter换行来分割多个包含路径,或者可以点中Brows,在目录树中直接

选择。

填完后点击“下一步”按钮:

点击“确定”,弹出下图所示界面

在这里我们选择“否”。

接下来将会准备产生一个控制全局编译信息显示情况的选项文件OPTIONS.LNT,该文件的产生方式有两种,一种是安装程序对几个核心选项逐一解释并提问你是否取消该选项,如果你选择取消,则会体现在OPTIONS.LNT文件中,具体体现方式是在该类信息编码前加-e,后面有一系列逐一选择核心选项的过程。

如果选择第二种选择方式,安装文件会先生成一个空的

OPTIONS.LNT文件,等你以后在实际应用时加入必要的选项。

这里选择“No”

选项,即不取消这些选项,然后单击“下一步”:

接着选择所支持的集成开发环境选项,可选多个或一个也不选,PC-Lint提供了

集成在多种开发环境中工作的功能,例如可集成在VC、BC、SourceInsight

中。

这里我们选择MicrosiftVisualC++6.0,这样env-v6.lnt就会被拷贝

到配置路径中。

在此我们选择vc6后单击“下一步”按钮,进入选择LIB.BAT文件的使用方式界面:

建议选择第一种方法,

指定的目录为当前PC-Lint的安装目录。

我们选择第一种方式:

“copyLIN.BAT

tooneofmyPATHdirectory”,然后单击“下一步”输入PATH目录:

输入安装目录C:

\APP\pcliint作为PATH目录,然后单击“下一步”按钮进入最后的确认窗口:

到此就完成了PC-Lint的安装配置工作,单击“完成”按钮就可以使用PC-Lint

了。

以上配置过程中在配置路径下产生的多个*.lnt文件,除了std.lnt、

std_x.lnt和option.lnt为配置向导所生成,其它co-xxx.lnt、lib-xxx.lnt、

env-xxx.lnt均是从原始安装目录中拷贝出来的,在这个目录下还有其它

PCLint所支持的编译器、库及集成开发环境的lnt配置文件,所有的lnt文件均为文本文件。

3.3:

Pclint的初步使用(使用命令行方式)

3.3.1;PC-Lint是一个命令行工具,因此使用方式是命令行带参数方式使用。

一般的使用格式为:

lint-nt.exe[Option]file1file2…

如:

lint-nt.exe-u-id:

\lintstd.lntsample.c

在这里-u表示只对本单元进行检查

-id:

\lint是表示会在d:

\lint目录下搜索文件

std.lnt是表示要使用的配置文件

sample.c表示要检查的源文件

3.3.2:

如果要检查一个目录下的所有源文件,可以使用下面的方法:

如:

lint-nt.exe-u-id:

\lintstd.lntd:

\osp\vos\*.cpp

跟前面不同的是这里将sample.c变成了d:

\osp\vos\*.cpp,使用*.cpp的意思是它会检查d:

\osp\vos目录下的所有.cpp文件,但是它不能检查子目录下的文件

3.3.3:

要检查所有包括子目录的文件可以使用以下方法:

lint-nt-id:

\lintstd.lntAllSource.lnt

在AllSource.lnt文件中可以放置如下:

Moudule1-Dir\*.cpp

Moudule2-Dir\*.cpp

Moudule3-Dir\*.cpp

...

当检查所有文件时不需要使用-u选项

3.4:

Pclint的初步使用(与配置环境集成)

PC-Lint在各种环境中的集成方法原理都是一样的,只要掌握前面讲的基本用法,知道如何用命令行来检测单个文件,一个目录下的所有文件,许多目录下的所有文件等,然后再结合各种环境的具体设置,就可以很方便地将PC-Lint集成到各种应用环境中了。

下面将以VC6,SourceInsight四种环境为例讲述如何集成PC-Lint

3.4.1:

在vc环境中集成

在VC的Tools菜单中,按Customize…

会出现下一页出现的对话框

–先在上面的列表框里增加一个条目,里面填上PC-Lint80,文本内容可以是其他的,由你自己决定。

–然后在Command:

这一栏中输入PC-Lint的执行文件名,要带上目录

–再在Arguments:

一栏里填上

-u-iC:

\Lintstd.lnt$(FileName)

这里$(FileName)表示VC窗口里当前打开的文件名

你也可以将它改成$(FileDir)\*.cpp表示检查当前打开文件同一目录下的所有.cpp文件,通常用于检查一个模块

还可以改成AllSource.lnt,象前面讲过的一样,AllSource.lnt是一个放置有所有文件的配置文件,这时要将-u去掉。

再在InitialDirectory一栏里填上$(FileDir)

最后再将useoutputwindow打上勾就完成了将PC-Lint集成到VC环境中

•3.4.2:

在SourceInsight3.1中的集成

在SourceInsight3.1中集成PC-Lint过程如下:

1)从Options菜单中选择“CustomCommands”命令项。

2)点Add键会出现下面的AddNewCustomCommand对话框

在Newcommandname:

栏中输入“PC-lint80”,原则上这个名称可以随便起,只要你能搞清楚它的含义就可以了,然后按OK按钮。

3)在Run栏中输入“d:

\lint\lint-nt-u-ic:

\lintstd.lntenv-si%f”其中d:

\lint是你PC-LINT的安装目录,%f是表示当前打开的文件。

如果要Lint多个文件则需要使用配置文件,在配置文件里包含多个文件,将%f改成你自己的配置文件即可。

4)在Output栏中选择“IconicWindow”、“CaptureOutput”。

5)在Control栏中选择“SaveFilesFirst”、将缺省打了勾选上的“PauseWhenDone”改成不选择。

6)在SourceLinksinOutput栏中选择“ParseLinksinOutput”、“File,thenLine”。

7)在Pattern栏中将缺省设置改成^\([^]*\)\([0-9]+\)就大功告成了。

8)如果需要Lint当前打开文件的同一目录下所有文件,可以将%f改成%d\*.cpp

如下图:

3.5:

Pclint配置文件介绍

PC-Lint使用哪个配置文件是由命令行参数决定的,一般地都使用std.lnt文件,std.lnt文件中可以包含各种配置选项,还可以包含其他的配置文件,有点类似C的头文件,里面可以include许多其他头文件,不过PC-Lint配置文件包含其他配置文件不需要写include,直接写文件名就可以了。

每个配置文件里都可以包含配置选项,这些配置选项也可以放在命令行中,一般为使用方便,命令行中不要放很多选项,尽量都将选项放到配置文件中

以下是VC下的配置文件样例

//Microtec32-bit,-si4-sp4,lib-w32.lnt

//Standardlintoptions

co-msc60.lnt//PC-Lint提供的对VC6的告警屏蔽文件

lib-w32.lnt//PC-Lint提供的对VC6库头文件的告警屏蔽文件

options.lnt-si4-sp4//用户自定义的选项文件

env-vc6.lnt//用户用来设置编辑环境的配置文件

-id:

\vc6\vc98\include//include目录

-id:

\vc6\vc98\mfc\include//include目录

一般来说,PC-Lint经常会有一些误报,为了消除这些误报,不得不将程序风格改动来规避,但有时候怎么改写程序都有告警,比如说你定义了两个宏,前面那个宏里有一半大括号{,后面那个宏里有另一半大括号},这时候一定会有告警,你不得不使用一些PC-Lint选项来屏蔽这些告警。

一般情况下,我们都将自己要写的选项放在Options.lnt文件中

另外还有关于编辑环境的问题,如果把PC-Lint集成到某个编辑环境中,那么他输入的格式必须和对应环境吻合才能保证在鼠标点击(或双击)错误消息条目时可以自动定位到对应源代码行,一般来说这类配置都放置在env-xxx.lnt文件中,如VC6的时env-vc6.lnt,SourceInsight的是env-si.lnt

PC-Lint本身提供了对各种编译器及对应库头文件的告警屏蔽文件,如co-msc60.lnt是对vc6的,lib-w32.lnt是对Win32库头文件告警的屏蔽配置文件

3.6:

PC-Lint常用选项

-i选项

这个选项主要是用来设置include路径的

如:

-iD:

\VC6\VC98\Include

-e#选项

这个选项主要是用来屏蔽告警号为#的告警

如:

-e818表示不显示告警号为818的告警

-esym(#,符号名)选项

这个选项主要是用来屏蔽告警号为#的某个符号的告警,

如-esym(39,std)

-emacro(#,宏名称)选项

这个选项主要是用来屏蔽告警号为#的某个宏的告警

-dname[=value]

这个选项主要是用来定义一个宏的

如:

-dWIN32,-dalpha=0

-sp#

表示指针的尺寸大小是#字节

如:

-sp4表示指针是4个字节大小

-si#

表示int的尺寸大小是字节

如:

-si4表示int型是4个字节大小

-t#

设置Tab键的大小为#个空格,缺省是8

-sem选项

这个选项主要是用来消除一些语义上的告警

比如说在一个函数A里面分配了内存,这时调用了另一个函数AddNode将分配的内存保存起来了,因此在函数A里面没有释放内存,如果使用PC-Lint检查会有内存泄漏方面的告警,因为PC-Lint不知道函数AddNode将分配的内存保存起来了,要消除这个告警就要用到-sem选项了。

假设AddNode的第2个参数是用来保存分配内存,用法如下

-sem(AddNode,custodial

(2))

这里custodial关键字是表示保存的意思,2是表示第2个参数。

-sem选项还有些其他用法,大家可以看PC-Lint自带的pc-lint.pdf文件,里面有详细的解析

-function(function0,function1,…)选项

这个选项一般情况下主要是用来表示function1及后面省略掉的函数和function0有类似的行为。

如:

-function(malloc,mymalloc1,mymalloc2)表示mymalloc1,mymalloc2和malloc有类似的行为,因为malloc是用来分配内存的,所以pc-lint在检查mymalloc1和mymalloc2时也会想检查malloc一样看是否有释放掉

象上一页里已经定义了AddNode为保存内存的函数,如果碰到还有一个函数AddEvent也是有保存内存的功能,我们除了可以使用-sem(AddEvent,custodial

(2))外,也可以使用-function(AddNode,AddEvent),效果是一样的。

不过要注意的是AddEvent保存内存的参数也要和AddNode一样是第2个。

-format选项

这个选项主要是用来设置输出告警消息格式的,以便于可以和编辑环境格式一样,便于自动定位到告警对应的源代码

如对SourceInsight,-format选项的使用如下:

-"format=%f%l%t%n:

%m“

这里%f表示文件名

%l表示代码行号

%t表示告警类型,如warning,error等

%n表示PC-Lint的告警号

%m表示PC-Lint输出的告警文本信息

-fallthrough

这个选项主要是用在switchcase中没有使用break的情况

可以在代码中使用//lint–fallthrough来消除没有使用break的告警

-save

保存错误抑制状态

如:

在代码中使用//lint–save–e429则表示从这行开始之后的代码抑制429告警的出现,直到使用//lint–restore来进行恢复后才会重新出现429告警

-restore

重新设置错误抑制状态,使用-save选项抑制的告警将重新恢复,在使用了-save选项后一定要记住使用-restore进行恢复,否则可能有许多告警就被屏蔽调不出现了。

其他一些常用选项还有

-elib抑制库头文件的告警

-elibsym抑制库头文件中某个符号的告警

-wlevel设置告警级别

-efile用来抑制一个或多个文件里的告警

-efunc用来抑制一个或多个函数里的告警

+rw设置保留关键字

等等。

象-efile,-wlevel这些告警不要轻易使用

这些选项的具体用法请看pc-lint.pdf文件

4.PC-Lint常见告警分析及解决措施

•PC-Lint的告警级别定义如下:

C

C++

WarningLevel

SyntaxErrors

1-199

1001-1199

1

InternalErrors

200-299

0

FatalErrors

300-399

0

Warnings

400-699

1400-1699

2

Informational

700-899

1700-1899

3

ElectiveNotes

900-999

1900-1999

4

PC-Lint告警分为0~4级,其中0级是内部错误或致命错误,1级告警是句法错误,2级告警是警告,3级是信息,4级是可选的,4级缺省是不打开的。

0级告警是不允许出现的,1级告警一般也是不允许出现的,如果出现,说明可能PC-Lint配置上可能有问题,或者程序根本编译不过,2级告警一般也是不能屏蔽的,2级告警很多是内存资源没有释放,指针越界一类的警告,会产生严重问题,3级告警有些告警也是非常重要的,会引起严重问题,有些告警属于提示信息,问题不是很大,所以3级告警里要分情况对待。

0~2级告警都不能使用-e选项进行屏蔽,只能使用-esym,-emacro,-sem之类的选项进行屏蔽;3级告警要根据具体情况,有些可以使用-e选项进行屏蔽,有些不可以。

40变量未定义

例:

inta;

a=b;

PC-lintforC/C++(NT)Ver.8.00e,CopyrightGimpelSoftware1985-2001

---Module:

D:

\PC-Lint\MyTest\Test1\Test1.cpp

a=b;

D:

\PC-Lint\MyTest\Test1\Test1.cpp(9):

error40:

(Error--Undeclaredidentifier'b')

}

D:

\PC-Lint\MyTest\Test1\Test1.cpp(13):

error550:

(Warning--Symbol'a'(line8)notaccessed)

---GlobalWrap-up

error900:

(Note--Successfulcompletion,2messagesproduced)

Toolreturnedcode:

2

550变量未被访问

例:

#include"stdafx.h"

/*returns100*

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 表格类模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1