转载自:http://blog.csdn.net/feng_ma_niu/article/details/40631521。也进行了一些修改
1 PCLint简介
首先,提供一下PCLint的相关链接:
官网:http://www.gimpel.com/html/index.htm
最新9.0L安装包:http://download.csdn.net/detail/winking324/8162819
百度网盘:http://pan.baidu.com/s/1i3tIqLv
接下来,简单介绍一下PCLint到底是一个什么样的工具。
PCLint是GIMPELSOFTWARE公司研发的C/C++软件代码静态分析工具,可以说,PCLint是一种更加严格的编译器。其主要分为PCLint和FlexeLint,PCLint主要应用于Windows平台,以二进制可执行文件提供,而FlexeLint应用于其他平台,例如Linux,以源代码形式发布。
PCLint在全球拥有广泛的客户群,许多大型的软件研发组织都把PCLint检查作为代码走查的第一道工序。PCLint不但能够对程式进行全局分析,识别没有被适当检验的数组下标,报告未被初始化的变量,警告使用空指针连同冗余的代码,还能够有效地提出许多程序在空间利用、运行效率上的改进点。
总结下来,PCLint就是不通过执行程序进行代码分析,发现代码中潜在的Bug。通过个人实践来看,PCLint可以发现非逻辑上的80%左右的Bug,绝对是C++开发以及测试人员一个强大的助手。
2 PCLint安装及初步配置
安装包主要包含如下两部分:
第一个 Update 为升级包,第二个 Gimpel_PC_Lint_9.zip 为 PCLint 的安装包。
1. 解压 PCLint 的安装包,并进行安装,直接 Next 到最后一步,选择执行配置程序,并点击 Finish 。如果这里没有选择执行配置程序,可以通过执行安装目录下的 CONFIG.exe 来执行配置程序。
2. 接下来弹出 PCLint 的配置程序,点击下一步开始配置。
3. 说明执行完 PCLint 配置后,会生成执行脚本以及 PCLint 的配置文件( *.lnt ),继续下一步。
4. 选择生成路径,安装路径即可,以及文件名称,然后下一步。
5. 选择编译器, VisualStudio 现在最高只有 2008 ,所以只好选择这个了,选择后点击下一步。
6. 选择平台,根据自己的需要,选择对应的平台,这里选择 32bit ,点击下一步。
7. 选择依赖的库,对于 VisualStudio 开发来说,主要包括 Active Template Library(ATL) , Microsoft FoundationClass Library , Standard Template Library , Windows 32-bit 这四部分,选择后下一步。
8. 选择一些特殊的优化建议,例如说代码安全性和效率上的。这里按照最大原则进行选择,有: Scott Meyers(Effective C++ More Effective C++ and Effective C++ 3rdEdition) , Dan Saks , MISRA 2004 ,然后下一步( PS : Effective C++ 这两本巨作真心的给力, C++ 入门必读经典)。
9. 指定当前使用库的头文件所在位置,选择 Create –i options ,并下一步,否则执行 PCLint 时会因为找不到头文件而失败。
10. 选择头文件路径,以分号或者换行( Ctrl + Enter )区分,这里仅添加 Visual Studio 的标准头文件。由于不同的公司或者组织,其文件组织方式可能不一样,又或者包含了其他的各种库,所以有需要可以在这里进行添加,或者执行 PCLint 时出现错误,修改 *.lnt 文件添加即可。
11. 提示是否打开新的配置,选择否。
12. 创建 OPTIONS.LNT 文件,就是简单几个问题,由于我这边显示内容不全,所以选择 No ,然后下一步,如果显示全的话可以分别看一下,就是一些实例代码,然后选择一下即可。
13. 选择对应的开发环境,这里最高只有 VC9 ,所以对应选择这个即可。
14. 添加 PCLint 到系统环境变量中。
15. 经过漫长的配置设定,总算完成了。
3 PCLint更新
经过上面复杂的安装及配置后,接着就需要更新一下 PCLint 程序,使其支持更多的 C++ 检查项等。
1. 解压压缩包中 Update 目录下所有文件到 PCLint 的安装路径,例如我的 PCLint 安装在 D 盘,则对应文件路径应该为:
D:\lint\l9-a-b.lp
…
D:\lint\lpatch.exe
D:\lint\Update.bat
2. 双击 Update.bat ,进行 PCLint 的更新,更新成功后的结果如图。
最后一行,版本号应该为 9.00L 。如果不正确,请进行路径或者文件是否正确的检查。
另外,说明一下更新的方法,首先,要确定当前 PCLint 的版本号,方法为使用 cmd 定位在 PCLint 的安装路径下,执行 lint-nt.exe–v 即可。其次,去官网上下载最新的更新程序 lpatch.exe 以及更新包(例如 l9-a-b.lp 等),将其拷贝到安装路径下,执行命令lpatch.exe l9-a-b.lp 即可。
4 PCLint的命令行
PCLint主要使用命令行模式来进行文件的解析,这个GCC的编译器过程非常相似。其命令行格式为:
lint options file1 [ file2 file3... ]
既然将PCLint可以当做一个编译器,则options即为编译选项,file即为要编译的文件,对于C++来说,主要是*.cpp文件,由于*.h作为包含文件,是不会进行单独进行编译的,所以这一点需要注意。
如果对一个工程的文件进行检查时,则需要生成文件列表来进行,类似于Makefile文件,所以需要注意一下。
接下来是各个工具的具体配置方法,具体详细的各个参数的信息,还请查阅安装目录下的手册。
5 VisualStudio配置
5.1 扫描并创建cpp文件列表
这个过程就是上面说到的生成文件列表,在Visual Studio中,主要按照工程(或目录)来进行创建。
1. 选择工具,然后创建外部扩展工具。
2. 新建一个外部扩展工具,名称PCLintCreation。
参数如下:
Title:PCLintCreation
Command:安装路径\lint-nt.exe
Arguments:-v -os("$(TargetName).lnt") "$(ProjectFileName)"
Initial directory: $(ProjectDir)
注意: $(ProjectDir)这些宏是vs自定义的,如果需要查看vs中自定义了哪些这种宏,可以打开msdn,然后输入一个常见的宏,比如ProjectName,就可以很方便地查询到定义了哪些宏。
3. 同样,可以根据前文SourceMonitor配置时,进行快捷键的分配。
4. 执行添加的PCLintCreation,会在对应的工程文件路径下,生成一个对应的*.lnt文件,内容如下:
5. 需要注意的是 ,当该工程下文件发生变化时,需要重新执行此任务,保证文件列表的正确性。
5.2 对工程下所有文件进行检查
根据上一步扫描的文件,进行PCLint检查。
1. 选择工具,然后创建外部扩展工具,这个跟上部分的第一步相同。
2. 新建外部工具,名称PCLintCheck。
参数如下:
Title:PCLintCheck
Command:D:\lint\lint-nt.exe
Arguments:-i"D:\lint"std.lnt env-vc12.lnt "$(TargetName).lnt"
Initial directory:$(ProjectDir)
需要注意的有几点 ,第一,由于PCLint对于C++11的支持可能没有Visual Studio 2013支持的那么广泛,所以会检测失败,所以不建议在Visual Studio 2013及以上版本进行使用。第二,第一个lint文件,std.lnt即为上篇文章中配置生成的文件,env-vc12.lnt为VC12(Visual Studio 2013)对应的配置文件,"$(TargetName).lnt"为上一步对工程扫描的文件列表。第三,如果提示缺少*.lnt文件,则将对应的文件拷贝到PCLint安装路径下即可。
注意如果是vs2008,那么需要使用env-vc9.lnt,env-vc9.lnt文件就是普通的文本文件,使用文本编辑工具即可查看它的内容。
如果出现类似Error 307: Can't open indirect file 'env-vc9.lnt'的错误,只需要到安装目录D:\lint下看看有没有‘env-vc9.lnt'文件,如果没有一般在D:\lint\lnt下是一定有的,大家只需要将该文件拷贝一份到D:\lint目录下即可。还可以重启vs试试看。
3. 执行PCLint,会在Output窗口中输出对应的Info,Warn,Error和Fatal等信息,这样根据信息查看对应的代码,并进行改正。
5.3 对单个文件进行检查
如果仅仅是对单个文件进行检查,则不需要配置前两步即可,但这个步骤仅对于单个文件执行检查是有效的,不方便配置到Ant任务中。但是相对于整个工程的检查,效率比较高,所以适合快速检查文件,并修改问题,具体配置如下。
1. 选择工具,然后创建外部扩展工具,这个跟前面相同。
2. 新建外部工具,名称PCLintCheckItem。
参数如下:
Title:PCLintCheckItem
Command:D:\lint\lint-nt.exe
Arguments:-i"D:\lint"std.lnt env-vc12.lnt "$(ItemFileName)$(ItemExt)"
Initial directory:$(ItemDir)
3. 执行PCLint,会对当前文件进行检查,并输出结果到Output窗口中,例如:
6 env-vc9.Int文件
第五歩中配置参数时都使用到了 env-vc12.lnt这个文件,由于这篇文章是转载的,而作者是以vs2013为例写的教程,所以他使用的是env-vc12.lnt这个文件,而我的编译工具是vs2008,所以使用的是env-vc9.lnt。至于具体某个版本的vs到底应该用哪个版本的env-vc.Int文件,方法很简单,打开env-vc.Int,文件的第一行就是这个Int文件是给哪个版本的vs使用的。
这个env-vc9.lnt文件内其实就是上面第五歩配置的过程,下面是这个文件的内容。