现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

代码静态检查工具PC-LINT安装配置与使用

2013-08-09 23:18 工业·编程 ⁄ 共 3596字 ⁄ 字号 暂无评论

    常用的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了
[cpp] view plaincopy
//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.
接着按下列步骤进行:
解压UnxUtils.zip至c:/unix下, 可以看到C:/unix/usr/local/wbin有很多unix下的命令,等下会用到
打开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
       Use Output Window打上勾,close退出。
    好了,这时VC tools菜单下应该又多了一个pclint_project项了,你以后可以用它来对一个VC项目运行lint检查程序了。
 
注意:
VC的工程路径名中不能带有空格。用find.exe查找完之后,通过管道将查找的文件结果交给Lint去检查,如果存在空格,则LINT将无法工作。
如果出现c:/pclint/co-msc60.lnt(214) : Error 307: Can't open indirect file 'lib-ole.lnt' 错误,则可以通过修改co-msc60.lnt中的第214行(倒数第一行),可以将其注释或改成 C:/pclint/lnt/lib-ole.lnt

给我留言

留言无头像?