PCLint

来源:互联网 发布:阿里云服务器到期 编辑:程序博客网 时间:2024/04/20 23:17
        C-Lint是一个历史悠久,功能异常强劲的静态代码检 测工具。它的使用历史可以追溯到计算机编程的远古时代(30多年以前)。经过这么多年的发展,它不但能够监测出许多语法逻辑上的隐患,而且也能够有效地帮 你提出许多程序在空间利用、运行效率上的改进点,在很多专业级的软件公司,比如Microsoft, PC-Lint检查无错误无警告是代码首先要过的第一关,我个人觉得,对于小公司和个人开发而言,PC-Lint也非常重要,因为基于开发成本考虑,小公 司和个人往往不能拿出很多很全面的测试,这时候,PC-Lint的强劲功能 可以很好地提高软件的质量。

  功能

  1) PC-Lint是一种静态代码检测工具,可以说,PC-LINT是一种更加严格的编译器,不仅可以象普通编译器那样检查出一般的语法错误,还可以检查出那些虽然完全合乎语法要求,但很可能是潜在的、不易发现的错误。

        2) PC-lint不但可以检测单个文件,也可以从整个项目的角度来检测问题,因为C语言编译器固有的单个编译,这些问题在编译器环境下很难被检测,而PC-Lint在检查当前文件的同时还会检查所有与之相关的文件,可想而知,它会对我们有很大的帮助。

   3) PC-lint支持几乎所有流行的编辑环境和编译器,比如Borland C++从1.x到5.x各个版本、Borland C++ Build、GCC、VC,VC.net、watcom C/C++、Source insight、intel C/C++等等,也支持16/32/64的平台环境。

  4) 支持Scott Meyes的名著(Effective C++/More Effective C++)中说描述的各种提高效率和防止错误的方法。

  四步速成PC-Lint概述

   这么好的工具,当然是先拿起来用了再说,这里分为四步,保证你马上可以使用PC-Lint了,当然,如果你上手以后,想细致深入学习这个工具,可以在网 上查找相应的资料,另外在我的另一个系列文章《软件开发的七种武器》中有一篇是讲述 PC-Lint使用的,比这篇要深入细致一些,如有兴趣,也可以看看。

  第一步:安装&设置

  安装和通常的软件没有什么不同。

  安装结束后在PC-Lint安装目录下运行CONFIG.exe,各项设置简要解释如下:

  a) 第一步,给出PC-Lint的安装路径和选择设置的保存文件。

  b) 第二步,选择你所使用的C/C++编译器:比如Visual C++ 6.x。

  c) 第三步,选择内存模式:比如32 bit Flat Model。

  d) 第四步,选择所使用的库:比如MFC,OWL,等,可多选,在windows下开发的一般要选中windows 32 bit。

  e) 第五步,C++编程提出过重要建议的作者,选择某作者后,他提出的编程建议方面的选项将被打开:比如Scott Meyers,可不选。

  f) 第六步,头文件的设置:可在后面步骤中手工添加。

  第二步:整合PC-Lint到选定的编译环境

  当你在上述第二步中选择了编译器后,可以在PC-Lint目录下找到一个"env-选用的编辑环境.lnt"文件,比如对于Source insight 是env-si.lnt,对于vc6是env-vc6.lnt。

  打开此文件,根据上面的描述,配置你的编译器,下面以VC6为例:

  ·选取菜单 tools | customize.....

  ·选取 Tools 标签

  ·点按主对话框上方的虚线小方框 New

  ·输入 name: PC-LINT

  ·输入 Command: c:/lint/lint-nt.exe,假设安装到此路径

  ·输入 Arguments: c:/lint/std.lnt ?(FilePath)?7)选择 (x) Use Output Window

  ·Close

  ·完成后,在tools菜单下就会有一项PC-LINT选项。

    第三步:Lint单个C文件

  a) 打开一个C文件

  b) 运行第2)步集成上的PC-Lint菜单项

  c) LINT结果会在一两秒之内出来。告警的解释可参考LINT安装目录下MSG.TXT文件,打开文件,通过查找告警号码定位,就可以看到比较详细的说明。

  第四步:Lint多个C文件

   a) 在LINT软件目录下建立PRJLINT.LNT文件,文件的第一行是使用的LINT配置文件名,从第二行开始,列出想所有要LINT的*.C文件名,一 行一个。如果要把结果输出到文件,在前面加上一行"-os(文件名)"(例如:"-os(c:/lint/result.txt)")。样例: YF_Config.lnt

// 以下为自己想要进行Lint的.C文件,
G:/src/tt/tt1.c
G:/src/tt/tt2.c


  b) 用2)介绍的方法在Source Insight"中介绍的方法增加一条"PC-LINT PROJECT"命令,所有设置与"PC-LINT"设置相同,除了

   ①"Custom Commands"对话框中"RUN"编辑框的文字由"C:/LINT/LINT-NT.EXE filename.lnt %f"改为"C:/LINT/LINT-NT.EXE PRJLINT.LINT",也就是把配置文件名改为PRJLINT.LNT,并去掉未尾的"%f"

  ②设置的快捷键与PC-LINT要区别开来

  利用下面的DOS命令可以用来得到一堆*.C文件的清单。例如:

  ① 列出C:/SRC下所有*.C文件,并保存到C:/SRC/FILELIST.TXT:

DIR C:/SRC/*.C /B >C:/SRC/FILELIST.TXT

  ② 列出C:/SRC下,包括SRC的子目录下的所有的*.C文件,,并添加到C:/SRC/FILELIST.TXT的未尾:

DIR C:/SRC/*.C /S/B >>C:/SRC/FILELIST.TXT

  PC-Lint 重要文件说明

  Msg.txt :解释告警的内容。

  选用的.lnt :包含头文件的路径,-i选项。

  env-选用的编辑环境.lnt :讲述如何将PC-lint与对应的编辑环境结合起来。

  co-xxx.lnt :选定的编译器。

  STD.LNT :内存模型等全局性东西。

  LIB-xxx.LNT :库类型的列表,包括标准C/C++库,MFC库,OWL库等等。

  AU-xxx.LNT :C++编程提出过重要建议的作者,选择某作者后,他提出的编程建议方面的选项将被打开。

  OPTIONS.LNT :反映全局编译信息显示情况的选项文件。


        PC-Lint是C/C++软件代码静态分析工具,你可以把它看作是一种更加严格的编译器。它不仅可以检查出一般的语法错误,还可以检查出那些虽然符合语法要求但不易发现的潜在错误。
 C 语言的灵活性带来了代码效率的提升,但相应带来了代码编写的随意性,另外C编译器不进行强制类型检查,也带来了代码编写的隐患。PCLint识别并报告C 语言中的编程陷阱和格式缺陷的发生。它进行程序的全局分析,能识别没有被适当检验的数组下标,报告未被初始化的变量,警告使用空指针,冗余的代码,等等。 软件除错是软件项目开发成本和延误的主要因素。PClint能够帮你在程序动态测试之前发现编码错误。这样消除错误的成本更低。
 使用PC-Lint在代码走读和单元测试之前进行检查,可以提前发现程序隐藏错误,提高代码质量,节省测试时间。并提供编码规则检查,规范软件人员的编码行为。
由于PC-LINT对于一般程序员来说可能比较陌生,有好多人安装了也不知道怎样配置和使用。
 
 下面我就根据自己的安装和配置心得对PC-Lint的安装、配置及使用进行下详细说明.本人主要介绍了将PC-Lint集成到VC++6.0和SourceInsight的方法和步骤。

(一)Windows下C/C++开发工具中,VC6使用较为普遍,因此这里先讲下VC6.0环境中集成pclint的步骤.

首先, 当然要下载软件,正版软件要200多$呢,买不起!所以只好网上找免费的拉。从http://www.61ic.com/down/othe/pclint.rar处可以下载到一个8.0版本的pclint.

1.将pclint.rar解压至c:/, 这样lint文件就位与c:/pclint(安装目录)下了。
2.将c:/pclint/lnt 下的3个文件lib-w32.lnt,env-vc6.lnt,co-msc60.lnt拷贝至c:/pclint下, 再在安装目录下创建std.lnt和options.lnt两个文件,其中std.lnt的内容如下

// contents of std.lnt

c:/pclint/co-msc60.lnt
c:/pclint/lib-w32.lnt
c:/pclint/options.lnt  -si4 -sp4
-i"D:/Program Files;D:/Program Files/Microsoft Visual Studio/VC98/Include"

//end

其中-i后面的路径名为VC的安装路径和VC Include 文件路径,根据自己的修改便可。

options.lnt 内容可为空,为定制内容,以后需要时再添加。

准备工作做完了,下一步就是要将pclint集成到VC6中去,先配置lint使之能对单个C或C++文件进行检查。

1.打开VC6,tools--->customize-->tools 新建一个名为pclint的项,在下面填入
command:  C:/pclint/lint-nt.exe
arguments:  -u c:/pclint/std.lnt  c:/pclint/env-vc6.lnt  "$(FilePath)"

Use Output Window  打上勾
close 完成。 这个在你VC窗口tools菜单下应该多了一个pclint选项,可以用它来运行lint程序,对你的c/c++代码进行静态检查了。

现在就可以用个小程序测试一下pclint了

//test1.cpp
#include <string.h>
class X

{

int
*p;
public
:
X
()
{
p = new int[20]; }

void
init()
{
memset( p, 20, 'a'
); }

~
X
()
{
delete p
; }
};

编译这个文件,看下你的编译器给你多少警告,再运行下lint, 可以自己对比一下。
我的机器上,VC产生0 errors 0 warnings, 而lint程序产生了如下8条警告信息,有些还是很有用处的提示,这里就不一一分析了.

test.cpp(12): error 783: (Info -- Line does not end with new-line)
test.cpp(7): error 1732: (Info -- new in constructor for class 'X' which has no assignment operator)
test.cpp(7): error 1733: (Info -- new in constructor for class 'X' which has no copy constructor)
    { memset( p, 20, 'a'  ); }
test.cpp(9): error 669: (Warning -- Possible data overrun for function 'memset(void *, int, unsigned int)', argument 3 (size=97) exceeds argument 1 (size=80) [Reference: test.cpp: lines 7, 9])
test.cpp(7): error 831: (Info -- Reference cited in prior message)
test.cpp(9): error 831: (Info -- Reference cited in prior message)
    { delete p; }
test.cpp(11): error 424: (Warning -- Inappropriate deallocation (delete) for 'new[]' data)


 --- Wrap-up for Module: test.cpp

test.cpp(2): error 753: (Info -- local class 'X' (line 2, file test.cpp) not referenced)
Tool returned code: 8


2.通常一个VC项目中包含多个C或C++文件,有时需要同时对这一系列的文件进行lint检查,我们可以通过配置一个pclint_project来达到目的。

和前面第一步中的方法基本一样,不过这里我们需要用到unix中的find等命令来查找当前目录下的C和C++文件,然后再将它们送给lint程序处理,所以得先从http://www.weihenstephan.de/~syring/win32/UnxUtils.zip下载UnxUtils.zip.
接着按下列步骤进行:

(i)解压UnxUtils.zip至c:/unix下, 可以看到C:/unix/usr/local/wbin有很多unix下的命令,等下会用到

(ii)打开VC6,tools--->customize-->tools 新建一个名为pclint_project的项,只不过下面的commands和arguments内容不同。

commands: C:/unix/usr/local/wbin/find.exe
arguments: $(FileDir) -name *.c  -o -name *.cpp | C:/unix/usr/local/wbin/xargs lint-nt            -i"c:/unix/usr/local"  -u c:/pclint/std.lnt  c:/pclint/env-vc6.lnt

(iii)Use Output Window打上勾,close退出。好了,这时VC tools菜单下应该又多了一个pclint_project项了,你以后可以用它来对一个VC项目运行lint检查程序了.


(二)SourceInsight中集成pclint程序的方法.

Windows平台下也有好多人都喜欢用SourceInsight编辑C/C++程序,如果将pclint集成到 SourceInsight中,那就相当于给SourceInsight增加了一个C/C++编译器,而且它的检查更严格,能发现一些编译器发现不了的问 题,可以大大减少程序中潜伏的BUG。这样的话,相信更多人会喜欢SourceInsight这个工具了。

下面简要地介绍下pclint集成到SourceInsight中的方法

有了上面VC中集成pclint的经验, 下面的事情就应该比较轻松了,
(a)打开你的SourceInsight, 选择Options-->Custom Commands-->Add, 输入pclint(当然名字可以随便).

(b) Run中输入: c:/pclint/lint-nt  -u  c:/pclint/std.lnt  c:/pclint/env-vc6.lnt %f

(c)Dir留空,将Iconic Window, Capture Output, Parse Links in OutPut, File,then Line 四项前打上勾。

(d)然后点右侧 Menu--->Menu-->View--><end of menu>, 右侧Insert, OK.

(e)此时在SourceInsight中的View菜单下多了个pclint选项,可以用它来对单个C/C++文件进行静态检查。


用类似的方法可以配置对一个SourceInsight工程文件的lint检查。

(a)打开你的SourceInsight, 选择Options-->Custom Commands-->Add, 输入pclint_project(当然名字可以随便).

(b) Run中输入: C:/unix/usr/local/wbin/find.exe %d -name *.c  -o -name *.cpp  | C:/unix/usr/local/wbin/xargs lint-nt
-i"C:/unix/usr/local" -u c:/pclint/std.lnt  c:/pclint/env-vc6.lnt

(c)Dir留空,将Iconic Window, Capture Output, Parse Links in OutPut, File,then Line 四项前打上勾。

(d)然后点右侧 Menu--->Menu-->View--><end of menu>, 右侧Insert, OK.

(e)此时在SourceInsight中的View菜单下多了个pclint_project选项,可以用它来一个工程中的C/C++文件进行静态检查。


  在此,我提供了一个适合于VC++的PC-LINT的选项文件,适用于VC++,也适用于MFC工程。主要是去掉了很多无用的警告,以免用起来太费劲。
点击下载
特别注意,这个lnt文件还需要根据你自己的VC头文件目录修改一下里面的头文件目录。

在VC中,可以很方便的把PC-LINT集成进去,方法如下图:


在EDITPLUS中,也可以很方便的集成,方法如下图


集成之后,可以在打开文件后,直接点击工具进行检查,并对错误信息进行处理,使得用PC-LINT检查就像用编译器编译一样。

另外,我也做了vxworks下的lnt文件,使用了MISRA 2004嵌入式规范,也在此提供下载
吧,就不再另行说明了。

另外,
如果你没有PC-LINT的话,可以从这里下载8.0老版
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 乐扣密封条发霉怎么办 橡胶牙刷柄发霉怎么办 乐扣密封条发黑怎么办 喝了姜枣茶发热怎么办 老干妈盖子太紧打不开怎么办 酵素桶变色了怎么办 酵素比例没弄好怎么办 离合器弹不起来怎么办 货车打不上气干燥器漏气怎么办 排气阀一直漏气怎么办 五个月宝宝长牙怎么办 宝宝不喜欢吃粥怎么办 孕晚期严重贫血怎么办 小孩子特别瘦该怎么办 胃病越来越瘦该怎么办 宝宝不愿吃米粉怎么办 米粉吃凉了怎么办 夏季给宝宝断奶怎么办 宝宝长牙牙痒怎么办 宝宝不喜欢吃肉怎么办 孩子不喜欢吃肉怎么办 小孩不喜欢吃肉怎么办 戒奶第二天很痛怎么办 宝宝不吃磨牙棒怎么办 金毛急性肠炎怎么办 狗狗病毒性肠炎怎么办 狗呕吐白色泡沫怎么办 甲减引起水肿怎么办 猫咪呕吐加拉稀怎么办 猫一直吐白沫怎么办 小猫吐白沫拉稀怎么办 大鳄不吃泥鳅怎么办 六个月宝宝不消化怎么办 两周岁宝宝拉稀怎么办 三岁宝宝拉肚子怎么办 混合痔老是出血怎么办 宝宝大便黑色怎么办呢 婴儿大便有粘液怎么办? 十个半月宝宝拉肚子怎么办 宝宝拉青粑粑怎么办 婴儿拉肚子带血怎么办