Pclint作业指导书.docx
- 文档编号:27073844
- 上传时间:2023-06-26
- 格式:DOCX
- 页数:64
- 大小:1,016.76KB
Pclint作业指导书.docx
《Pclint作业指导书.docx》由会员分享,可在线阅读,更多相关《Pclint作业指导书.docx(64页珍藏版)》请在冰豆网上搜索。
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*
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Pclint 作业 指导书