静态代码检查工具PC-Lint(一)
摘要:C/C++语言的语法拥有其它语言所没有的灵活性,这种灵活性带来了代码效率的提升,但相应增加了代码中存在隐患的可能性。静态代码检查工具PC-Lint则偏重于代码的逻辑分析,它能够发现代码中潜在的错误,比如数组访问越界、内存泄漏、使用未初始化变量等。本文将介绍如何安装和配置PC-Lint代码检查工具以及如何将PC-Lint与常见的代码编辑软件集成。
关键词:代码检查 PC-Lint 规则 选项
目 录
摘 要
1 引 言
2 PC-Lint介绍
3 PC-Lint的代码检查功能
3.1 强类型检查
3.2 变量值跟踪
3.3 赋值顺序检查
3.4 弱定义检查
3.5 格式检查
3.6 缩进检查
3.7 const变量检查
3.8 volatile变量检查
4 PC-Lint软件使用方法
4.1 安装与配置
4.2 PC-Lint与常用开发工具的集成(Visual C++,Source Insight,UEdit)
scanf返回值被忽略是怎么回事5 总结
参考文献
附录一 PC-Lint 重要文件说明
附录二 错误信息禁止选项说明
附录三 PC-Lint检测中的常见错误
一 引言
C/C++语言的语法拥有其它语言所没有的灵活性,这种灵活性带来了代码效率的提升,但相应也使得代码编写具有很大的随意性,另外C/C++编译器不进行强制类型检查,也不做任何边界检查,这就增加了代码中存在隐患的可能性。如果能够在代码提交测试之前发现这些潜在的错误,就能够极大地减轻测试人员的压力,减少软件项目的除错成本,可是传统的C/C++编译器对此已经无能为力,这个任务只能由专用的代码检查工具完成。目前有很多C/C++静态代码检查工具,其中Logiscope RuleChecker和PC-Lint是目前应用比较广泛的两
个工具。这两个检查工具各有特,Logiscope RuleChecker倾向于代码编码规范的检查,比如代码缩进格式、case语句书写规范、函数声明和布尔表达式的编写规则等,而PC-Lint则偏重于代码的逻辑分析,它能够发现代码中潜在的错误,比如数组访问越界、内存泄漏、使用未初始化变量等。本文将介绍如何安装和配置PC-Lint代码检查工具以及将PC-Lint与常见的代码编辑软件,如Visual C++,Source Insight集成的方法,同时还将简要介绍一些PC-Lint常用的代码检查选项。
二 PC-Lint介绍
PC-Lint是GIMPEL SOFTWARE公司开发的C/C++软件代码静态分析工具,它的全称是PC-Lint/FlexeLint for C/C++,PC-Lint能够在Windows、MS-DOS和OS/2平台上使用,以二进制可执行文件的形式发布,而FlexeLint 运行于其它平台,以源代码的形式发布。PC-lint在全球拥有广泛的客户,许多大型的软件开发组织都把PC-Lint检查作为代码走查的第一道工序。 PC-Lint不仅能够对程序进行全局分析,识别没有被适当检验的数组下标,报告未被初始化的变量,警告使用空指针以及冗余的代码,还能够有效地帮你提出许多程序在空间利用、运行效率上的改进点。
通过下面的例子就可以看出PC-Lint工具的强大功能:
1:
2:char *report( int m, int n, char *p )
3:{
4: int result;
5: char *temp;
6: long nm;
7: int i, k, kk;
8: char name[11] = "Joe Jakeson";
9:
10: nm = n * m;
11: temp = p == "" ? "null" : p;
12: for( i = 0; i<m; I++ ) {
14: k++;
15: kk = i;
16: }
17:
18: if( k== 1 ) result = nm;
19: else if( kk > 0 ) result = 1;
20: else if( kk < 0 ) result = -1;
21:
22: if( m == result ) return( temp );
23: else return( name );
24:}
这是一段C代码,可以通过大多数常见的C语言编译器的检查,但是PC-Lint能够发现其中的错误和潜在的问题:第8行向name数组赋值时丢掉了结尾的 nul字符,第10行的乘法精度会失准,即使考虑到long比int的字长更长,由于符号位的原因仍然会造成精度失准,第11行的比较有问题,第14行的变量k没有初始化,第15行的kk可能没有被初始化,第22行的result也有可能没有被初始化,第23行返回的是一个局部对象的地址。
随着C++语言的出现,C/C++编译器有了更严格的语法检查,但是仍然不能避免出现有BUG的程序。C++的类型检查依然不如Pascal那么严格。对于一个小程序,多数程序员都能够及时发现上面出现的错误,但是从一个拥有成千上万行代码的大型软件中出这些瑕疵将是一项烦琐的工作,而且没有人可以保证能出所有的这类问题。如果使用PC-Lint,只需通过一次简单的编译就可以检查出这些错误,这将节省了大量的开发时间。从某种意义上说。PC- Lint是一种更加严格的编译器,它除了可以检查出一般的语法错误外,还可以检查出那些虽然符合语法要求,但很可能是潜在的、不易发现的错误。
三 PC-Lint的代码检查功能
PC-Lint能够检查出很多语法错误和语法上正确的逻辑错误,PC-Lint为大部分错误消息都分配了一个错误号,编号小于1000的错误号是分配给C 语言的,编号大于1000的错误号则用来说明C++的错误消息。表 1 列出了PC-Lint告警消息的详细分类:
表 1 列出了PC-Lint告警消息分类 | |||
错误说明 | C | C++ | 告警级别 |
语法错误 | 1-199 | 1001-1199 | 1 |
内部错误 | 200-299 | 0 | |
致命错误 | 300-399 | 0 | |
告警 | 400-699 | 1400-1699 | 2 |
消息 | 700-800 | 1700-1899 | 3 |
可选信息 | 900-999 | 1900-1999 | 4 |
以C 语言为例,其中的编号1-199指的是一般编译器也会产生的语法错误;编号200-299是PC-Lint程序内部的错误,这类错误不会出现在代码中的;编号300-399指的是由于内存限制等导致的系统致命错误。编号400-999中出现的提示信息,是根据隐藏代码问题的可能性进行分类的:其中编号 400-699指的是被检查代码中很可能存在问题而产生的告警信息;编号700-899中出现的信息,产生错误的可能性相比告警信息来说级别要低,但仍然可能是因为代码问题导致的问题。编号900-999是可选信息,他们不会被默认检查,除非你在选项中指定检查他们。
PC-Lint/FelexLint提供了和许多编译器类似的告警级别设置选项-wLevel,它的告警级别分为以下几个级别,缺省告警级别为3级:
-w0 不产生信息(除了遇到致命的错误)
-w1 只生成错误信息 -- 没有告警信息和其它提示信息
-w2 只有错误和告警信息
-w3 生成错误、告警和其它提示信息(这是默认设置)
-w4 生成所有信息
PC-Lint/FelexLint还提供了用于处理函数库的头文件的告警级别设置选项-wlib(Level),这个选项不会影响处理C/C++源代码模块的告警级别。它有和-wLevel相同的告警级别,缺省告警级别为3级:
-wlib(0) 不生成任何库信息
-wlib(1) 只生成错误信息(当处理库的源代码时)
-wlib(2) 生成错误和告警信息
-
wlib(3) 生成错误、告警和其它信息(这是默认设置)
-wlib(4) 产生所有信息
PC-Lint的检查分很多种类,有强类型检查、变量值跟踪、语义信息、赋值顺序检查、弱定义检查、格式检查、缩进检查、const变量检查和 volatile变量检查等等。对每一种检查类型,PC-Lint都有很多详细的选项,用以控制PC-Lint的检查效果。PC-Lint的选项有300 多种,这些选项可以放在注释中(以注释的形式插入代码中),例如:
/*lint option1 option2 ... optional commentary */ 选项可以有多行
//lint option1 option2 ... optional commentary 选项仅为一行(适用于C++)
选项间要以空格分开,lint命令一定要小写,并且紧跟在/*或//后面,不能有空格。如果选项由类似于操作符和操作数的部分组成,例如-esym (534, printf, scanf, operator new),其中最后一个选项是operator new,那么在operator和new中间只能有一个空格。PC-Lint的选项还可以放在宏定义中,当宏被展开时选项才生效。例如:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论