常用的C/c++代码检查工具有PC-LintLogiSCOPE下面主要介绍PC-Lint

    PC-LintC/C++软件代码静态分析工具,你可以把它看作是一种更加严格的编译器。它不仅可以检查出一般的语法错误,还可以检查出那些虽然符合语法要求但不易发现的潜在错误。

    使用PC-Lint在代码走读和单元测试之前进行检查,可以提前发现程序隐藏错误,提高代码质量,节省测试时间。并提供编码规则检查,规范软件人员的编码行为。

    下面主要介绍了将PC-Lint集成到VC++6.0的方法和步骤。

    (一)首先, 当然要下载软件,正版软件要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.lntenv-vc6.lntco-msc60.lnt拷贝至c:\pclint下, 再在安装目录下创建std.lntoptions.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使之能对单个CC++文件进行检查。

1.打开VC6tools--->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

 

根据错误提示修改后的程序如下:

#include <string.h>

class X

{

 int *p;

public:

 X() //构造函数

 {

  p = NULL;

 }

 X (const X &x)  //拷贝构造函数

 {

  p = new  int[20];

  memcpy(p, x.p, 20*sizeof(int));

 }

 

 X & operator= (const X &x)  //赋值操作符

 {

  //检查自赋值

  if (this == &x)

  {

   return *this;

  }

  int *temp = new int[20];

  memcpy(temp, x.p, 20*sizeof(int)); //复制指针指向内容

  delete []p; //删除原有指针(将删除操作符放在后面,避免X=X特殊情况下,内容的丢失)

  p=temp; //建立新指向

  return *this;

 }

 

 void init()

 { 

  if (NULL == p) return; // 判断指针是否为空

  memset( p, 'a', 20*sizeof(int));

 }

 ~X()

 {

  delete []p; 

 }

};

 

注意: 为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符(可参考effective_c++2e 条款11

 

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

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

接着按下列步骤进行:

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

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

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检查程序了。

 

参考:http://blog.csdn.net/ehui928/archive/2006/05/20/746548.aspx