静态代码检测⼯具:PC-Lint(forcc++)
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的步骤.
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 内容可为空,为定制内容,以后需要时再添加。
error parse new
准备⼯作做完了,下⼀步就是要将pclint集成到VC6中去,先配置lint使之能对单个C或C++⽂件进⾏检查。
1.打开VC6,tools--->customize-->tools 新建⼀个名为PC-Lint的项,在下⾯填⼊
command: C:/
arguments: -u c:/pclint/std.lnt c:/pclint/env-vc6.lnt "$(FilePath)"
Use Output Window 打上勾
close 完成。 这个在你VC窗⼝tools菜单下应该多了⼀个PC-Lint选项,可以⽤它来运⾏lint程序,对你的c/c++代码进⾏静态检查了。
(⾃⼰注1:将pclint放在任何⽬录都是可以的,但是,如果是放在例如:Program Files这样的⽬录中,由于该⽬录中间有空格,所以,解析时常常会出错,需要在绝对路径外⾯加上引号,例如:"H:/Program Files/"
⾃⼰注2:其实,更简单的⽅法使pc-lint的安装路径设置到系统地path环境变量中,那么就完全可以使⽤相对路径了。
⾃⼰注3:运⾏时,会提⽰PC-lint for C/C++ (NT) Ver. 8.00e, Copyright Gimpel Software 1985-2001
c:/pclint/co-msc60.lnt(214) : Error 307: Can't open indirect file 'lib-ole.lnt'
Tool returned code: 2 这个错误,打开co-msc60.lnt,我们可以看到该⽂件最后⼀⾏对'lib-ole.lnt' 的调⽤,简单的处理直接注释掉就⾏了,如需⽤到OLE, 请设置lib-ole.lnt的绝对路径,并请参考下pclint的相关⽂档)
现在就可以⽤个⼩程序测试⼀下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条警告信息,有些还是很有⽤处的提⽰,这⾥就不⼀⼀分析了。
运⾏后出现的提⽰如下:
PC-lint for C/C++ (NT) Ver. 8.00e, Copyright Gimpel Software 1985-2001
--- Module: F:/C++ Test/lintRun.cpp
{ p = new int[20]; }
F:/C++ Test/lintRun.cpp(8): error 1732: (Info -- new in constructor for class 'X' which has no assignment operator)
F:/C++ Test/lintRun.cpp(8): error 1733: (Info -- new in constructor for class 'X' which has no copy constructor)
{ memset( p, 20, 'a' ); }
F:/C++ Test/lintRun.cpp(10): error 669: (Warning -- Possible data overrun for function 'memset(void *, int, unsigned int)', argument 3 (size=97) exceeds argument 1 (size=80) [Reference: file F:/C++ Test/lintRun.cpp: lines 8, 10])
F:/C++ Test/lintRun.cpp(8): error 831: (Info -- Reference cited in prior message)
F:/C++ Test/lintRun.cpp(10): error 831: (Info -- Reference cited in prior message)
{ delete p; }
F:/C++ Test/lintRun.cpp(12): error 424: (Warning -- Inappropriate deallocation (delete) for 'new[]' data)
--- Wrap-up for Module: F:/C++ Test/lintRun.cpp
F:/C++ Test/lintRun.cpp(3): error 753: (Info -- local class 'X' (line 3, file F:/C++ Test/lintRun.cpp) not referenced)
--- Global Wrap-up
error 900: (Note -- Successful completion, 7 messages produced)
Tool returned code: 7
2.通常⼀个VC项⽬中包含多个C或C++⽂件,有时需要同时对这⼀系列的⽂件进⾏lint检查,我们可以通过配置⼀个pclint_project来达到⽬的。
以下部分我还没有⽤到,留置。
(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/
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 (⾃⼰注4:这⾥有⼀个⼩错误,如果不将pc-lint的安装路径写⼊系统path环境变量,那么上⾯设置后,在运⾏时会有错误:
C:/unix/usr/local/wbin/xargs: cannot fork Tool returned code: 1
原因,就在于上⾯的设置中,lint-nt使⽤了相对路径,执⾏时不到资源,所以改为绝对路径,⼀切就ok了)
(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/ %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++⽂件进⾏静态检查。
本⽂主要对pclint集成到VC及SourceInsight环境中的⽅法根据本⼈安装和使⽤⼼得做了较详细介绍,希望对以前没使⽤过pclint的朋友们能有所帮助,不⾜之处还请多指正!
注: 关于库⽂件函数的实现与模块使⽤的⼀致性检查、 ⽬前验证可以通过以下⽅式进⾏:
⽅法⼀:
将库⽂件(*.cpp/*.h)均复制到引⽤该库的模块的路径下。
⽅法⼆:
1、建⽴⼀个lnt⽂件,名为files.lnt⽂件中保存的内容就是该模块,及其使⽤的库的所有⽂件的全路经列表。例如:
E:/funtestC/fun.c
E:/funtestC/main.c
E:/libC/libMain.c
E:/libC/libC.h
(这个⽂件列表的创建可以写⼀段⼩程序实现,必要的信息都可以从mak⽂件中获取。)
2、将files.lnt的绝对路经写⼊std.lnt⽂件的末尾。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论