常用的C/c++代码检查工具有PC-Lint和LogiSCOPE下面主要介绍PC-Lint。
PC-Lint是C/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.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
根据错误提示修改后的程序如下:
#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项目中包含多个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检查程序了。
参考:http://blog.csdn.net/ehui928/archive/2006/05/20/746548.aspx