PC-LINT使用说明(newest)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

PC-LINT使用说明
1.概述 (2)
2.如何安装PC-LINT (3)
3.LINT 一个C文件 (3)
3.1用命令行方式进行LINT (4)
3.2 在Source Insight中集成 (4)
3.3LINT选项 (6)
4.LINT一个工程下的多个C文件 (7)
4.1为何要LINT多个C文件 (7)
4.2如何LINT一个工程下的多个C文件 (8)
4.3简单的LINT多个文件 (9)
5. 通过准则 (10)
第一类:不能出现的警告信息 (10)
第二类:需要确认的警告 (10)
6. PC-LINT的配置 (11)
附一 Options.lnt (12)
附二 Std.lnt (14)
附三 Env-si.lnt (14)
LINT工具是一种软件质量保证工具,许多国外的大型专业软件公司,如微软公司,都把它作为程序检查工具,在程序合入正试版本或交付测试之前一定要保证通过了LINT检查,他们要求软件工程师在使用LINT时要打开所有的编译开关,如果一定要关闭某些开关,那么要给出关闭这些开关的正当理由。

可想而知,如果从我们编码后第一次编译程序时就使用LINT来检查程序,并且保证消除所有的LINT告警,我们就不会遇到象今天这么多的告警信息。

即使在今天,我们如果能抽出一定的精力来消除程序中的LINT告警,以后再维持这种无告警状态就是很容易的了。

我们程序质量的提高也是不言而喻的。

PC-LINT是GIMPEL SOFTWARE公司的产品,其中的内容是非常广泛的,光是选项就有300多个,涉及到程序编译及语法使用中的方方面面。

本篇培训材料旨在引导读者入门,学会PC-LINT的基本使用方法,起抛砖引玉的作用,能让读者从这里起步继续去研究如何娴熟地使用PC-LINT的各种选项,能让它充分为我们的开发工作服务。

1.概述
如果要给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++)
13:{
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:}
上面的代码用一般的编译器编译是一段有效的代码,但是用PC-LINT编译就会有几个告警。

首先第8行向name数组赋值时丢掉了nul字符,第10行的乘法精度会失准,第11行的比较有问题,第14行的变量k没有初始化,第15行的kk可能没有被初始化,第22行的result也有可能没有被初始化,第23行返回的是一个局部对象的地址。

这段代码在大部分编译器下是可以顺利编译通过的,继续查找其中的错误就要靠人工调试程序,如果程序很大,这将是一项烦琐的工作,没有人可以保证能找出所有的这类问题,但PC-LINT只通过一次简单的编译就可做到,显然为我们节省了大量的开发时间。

下面就让我们看看如何安装使用PC-LINT。

2.如何安装PC-LINT
安装PC-LINT比较烦琐,有很多选项。

但我们提供的是一个拷贝版本,只要把pclint.zip展开到一个目录就可以了。

建议大家都用c:\lint作为安装目录。

目录下有一些配置文件,可以根据情况修改:
std.lnt:编译参数文件,里面已经放了一些引用头文件和宏定义,内容就是编译FLEX时的设置。

大家可以根据需要修改。

如果你不是用FLEX版本的代码,建议从vxWorks的配置文件中拷贝出你现在编译代码所使用的设置。

options.lnt:编译选项文件。

现在里面的内容是关闭一些告警。

这些告警是我们认为要求过高的,允许忽略。

注意,原则上不允许开发人员随意在这个文件里增加要关闭的告警,以免PC-
LINT检查过于放松。

env-si.lnt:PC-LINT与SourceInsight集成时的环境参数设置。

不需要修改。

3.LINT 一个C文件
3.1用命令行方式进行LINT
如果使用LIN.BAT批处理文件进行LINT,在LINT前要先看一下该批处理文件中的内容,里面包含了LINT-NT命令和命令选项,可以根据自己的要求来修改、增减选项。

我们看到,在这个批命令中嵌套了一个std.lnt文件,在std.lnt文件中还嵌套了co.lnt、options.lnt和lib-stl.lnt文件,原则上*.lnt文件是可以无限制嵌套,该类文件中一般都是了LINT的选项,可通过修改这些文件来修改LINT选项,选项是按照从左到右的顺序执行的。

可执行下面命令行:
C:\abc\src>lin alpha.c beta.c gamma.c
通常对于由多个C模块组成的程序,最好先分别对每个C模块单元进行LINT检查,做单元LINT时可如下运行:
C:\abs\src>lin -u alpha.c
其中-u是单元选项,使用-u后可以关闭一些检查多模块时会产生的告警,例如“函数未被使用”或“函数没有定义”等。

也可以不使用LIN.BAT批处理文件,而直接使用LINT命令。

在DOS环境下LINT命令为LINT.EXE,在Windows95/NT环境下为LINT-NT.EXE,在OS2环境下为LINT-OS2.EXE。

直接使用LINT命令要注意的一点是要在使用前预先设置LINT目录所在路径,最好的方法是把该路径加在AUTOEXEC.BAT文件中。

其它的使用方法与使用批处理文件相同。

例如:
C:\abs\src>lint-nt -ic:\lint\ std.lnt -os(_lint.tmp) *.c
3.2 在Source Insight中集成
将PC-LINT集成到SourceInsight后,使用会变得十分方便。

集成的方式是:
1)从Options菜单中选择“Custom Commands”命令项。

2)点Add键增加一个定制功能。

3)在Name栏中输入“PC-lint ”,这个名称可以随便起,只要你能搞清楚它的含义就可以了。

4)在Run栏中输入“c:\lint\lint-nt -u -ic:\lint std env-si %f”其中c:\lint是你PC-LINT的安装目录。

5)在Output栏中选择“Iconic Window”、“Capture Output”。

6)在Control栏中选择“Save Files First”。

7)在Source Links in Output栏中选择“Parse Links in Output”、“File,then Line”。

8)在Pattern栏中输入“^\([^ ]*\) \([0-9]+\)”。

9)完成后如下图:
9)点Menu按钮,将它加到系统菜单,如图:
这样就安装完成了。

使用时,在Source Insight下打开要LINT的文件,再执行Project菜单中的“PC-LINT”命令即可。

检查完成后会出现一个警告文件,由于我们配置好了Source Insight参数,这些警告都带有索引,可以在Source Insight里跳转到源文件。

在NT中使用Source Insight时,好象集成不了,原因暂时不明了。

上面的例子在WIN 98下测试成功。

如果要修改LINT选项,可直接在Run栏中修改,也可专门编辑一个*.lnt文件放在c:\lint目录下,并将该文件名加入Run栏中,和命令行方式是一样的。

3.3LINT选项
LINT选项可以放在注释中,例如:
/*lint option1 option2 ... optional commentary */
//lint option1 option2 ... optional commentary
选项间要以空格分开,lint命令一定要小写,并且紧跟在/*或//后面,不能有空格。

如果选项由类似于操作符和操作数的部分组成,例如-esym(534, printf, scanf, operator new),其中最后一个选项是operator new,那么在operator和new中间只能有一个空格。

选项还可以放在宏定义中,例如:
#define DIVZERO(x) /*lint -save -e54 */ ((x) /o) /*lint -restore */
LINT的选项很多共有300多种,大体可分为以下几类:
1)错误信息禁止选项
该类选项是用于禁止生成某类错误信息的选项,最常用的是-e和+e,-e是禁止生成某类错误信息,+e是恢复生成某类错误信息。

运行lint目录下的msg.exe可以得到msg.txt文件,这个长达5000行的文件包含了所有的错误信息号和解释。

-w<level> 对于所有大于<level>级别的告警信息都不显示。

-wlib(<level>)对于所有大于<level>级别的关于库函数数的告警信息都不显示。

我们可以用-wlib(0)来屏蔽所有的库函数的告警信息,-wlib(1)只显示库函数中的句法错误。

-esym(#,<symbol>) 可以屏蔽对于特定符号的某告警信息。

2)变量类型大小选项
不同的目标机、编译系统变量类型的的大小(如短整形变量、整形变量等)会有所不同,该类选项用于为目标机设置变量类型的大小。

由于默认的设置与大部分的编译器是匹配的,这些专门的设置通常情况下是不需要的,只在特别的目标机结构中才用。

例如一个M68000目标机,它
的int类型和指针类型通常是32bit的,这时你应该使用选项:-si4 -sp4。

这些尺寸参数的当前值可以
通过help屏来获得,例如可以输入以下命令行:
lin -si4 -sp4 ?
3)冗长信息选项
冗长信息指的是LINT过程中产生的一些与编译过程有关的信息,而不是真正的告警信息、
错误信息等。

是否生成这些信息可以通过-v和+v选项来决定。

+v是生成这些信息,-v是关闭这些信息,这组选项中除+v外,其它所有选项都可以关闭+v选项。

4)标记选项
以+f、++f、-f和--f开头的选项是标记选项。

他们的逻辑含义分别如下:
+f...:通过把标志置为1而把它置为ON
-f...:通过把标志置为0而把它置为OFF
++f...:标志增1
--f...:标志减1
后面两个用于你想在局部把一个标志置为ON的情况,而不影响全局设置。

例如你可以这样
使用:
/*lint ++flb */
int printf( );
/*lint --flb */
标记选项的种类很多,基本含义是用于打开或关闭某类语法情况使用,例如允许使用缩写
结构体名称,允许使用无名联合体,把所有模块当作C++编译等。

5)消息显示选项
消息显示选项用于定义消息输出格式。

主要有消息高度选项、消息宽度选项、消息格式选
项等。

6)其它选项
其它选项中的种类很多,各种类间差异很大,在这里就不一一介绍了,建议大家看一看《PC-LINT》一书,第五章有对每种选项的详细说明。

lint本身也有一些说明信息,lint-nt 2> lint.txt 然后狂按几个回车就可以生成一个lint选项的说明文件。

4.LINT一个工程下的多个C文件
4.1为何要LINT多个C文件
在程序编码初期,我们关心的可能只是单个C模块种中的语法问题,等到编程后期,对于
由多个C模块组成的程序,我们希望了解当把多个模块连接在一起后是否还有存在于模块间的语法
问题。

这时编译器虽然能给出一些告警,但PC-LINT的连接能给出更多的告警。

还有当我们能保证
其中的几个模块相对稳定,而另外几个模块仍有问题时可以先将几个稳定的模块编译连接成一个目标文件,文件每次修改完成后先单独编译,然后连接入总的目标文件。

4.2如何LINT一个工程下的多个C文件
象我们平时使用的编译工具一样,PC-LINT在编译连接多个C文件时也会先把每个C文件编译生成中间的目标文件*.lob,然后再将所有的LOB文件连接在一起。

LOB是Lint Object Module的缩写。

这个文件中包含了一个C或C++模块的所有外部信息。

生成LOB文件时有三种选项要注意:第一种是-u,如果要LINT生成LOB文件,就一定要加-u选项;第二种是-zero或-zero(500)选项,为了保证LOB文件在模块存在错误的情况下也能生成,就一定要加这个选项;第三种是-oo[(filename)],filename是生成的LOB文件的名称,在-oo后面,可加,也可不加,如不加,则LOB 文件名与原C模块的名称相同,例如:
lint -u alpha.c -oo(a1)
生成的LOB文件名为:a1.lob
lint -u alpha.c -oo
生成的LOB文件名为:alpha.lob
LINT一个工程下的多个C模块,在用户的源程序目录下一般需要三个文件:一个选项文件(*.lnt)、一个批处理文件(*.bat)和一个MAKEFILE文件(*.mak)。

下面一一讲述如何制作这些文件。

1)选项文件(*.lnt)
选项文件在前面也提到过,你可以把你LINT每个C文件时时用到的所有公共选项罗列在该文件中,选项生效的顺序按照从左到右,从上到下的原则。

该类文件可以层层嵌套,嵌套的层数没有限制。

例如make.lnt文件:
-iC:\lint
std.lnt
+os(temp)
-e46
+vm
-zero
2)批处理文件(*.bat)
制作批处理文件时要注意要在该文件中调用TCMAKE.EXE文件和MAKEFILE文件,例如lintmake.mak文件:
@echo Lint Making 'makelap':
tcmake -flintmake.mak
@echo End of making
3)MAKEFILE文件(*.mak)
MAKEFILE使用的TCMAKE的语法,和我们平时开发编译时使用的MAKEFILE文件语法格式一样,例如下面的lintmake.mak文件:
MCCPATH = c:\mcc68k
OPTION = -u make.lnt -oo
GLOBLE = os.h l2lap.h
mail_depend = $(GLOBLE) q931.h mail.h
lapmain_depend = $(GLOBLE) l1pubdef.h q931.h mail.h
lapos_depend = $(GLOBLE)
fhdlc1_depend = $(GLOBLE) cpuhdlc.h bd_prar.h q931.h
OBJ = mail.lob \
lapmain.lob \
lapos.lob \
fhdlc1.lob
project.lob : $(OBJ)
lint-nt make.lnt -e768 -e769 *.lob
mail.lob: mail.c $(mail_depend)
lint-nt $(OPTION) mail.c
lapmain.lob: lapmain.c $(lapmain_depend)
lint-nt $(OPTION) lapmain.c
lapos.lob: lapos.c $(lapos_depend)
lint-nt $(OPTION) lapos.c
fhdlc1.lob: fhdlc1.c $(fhdlc1_depend)
lint-nt $(OPTION) fhdlc1.c
4.3简单的LINT多个文件
假设我们的工程不复杂,我们可以负担起每次都将所有的文件都lint一遍的开销,也可以不使用上面的正规用法。

笔者在实践中发现,将所有的*.c文件放在一个lint命令中,同样能完成lint整个工程的目的。

如:
lint-nt c:\lint\std.lnt AllMySource.lnt
在AllMySource.lnt中包括你的工程中的所有源文件:
a1.c
a2.c
a3.c
需要注意的是,在std.lnt文件中就不需要-u选项了。

因为我们已经提供了所有的信息了。

5. 通过准则
使用PC-LINT进行代码静态检查,必须达到以下的通过准则。

不能出现第一类警告信息,出现的第二类警告信息必须经过确认。

第一类:不能出现的警告信息
第二类:需要确认的警告
6. PC-LINT的配置
在“..\LINT”目录下配置下列文件
options.lnt (见附一)
std.lnt (见附二)
env-tide.lnt (见附三)
co-ht.lnt
附一 Options.lnt
// Please note -- this is a representative set of error suppression
// options. Please adjust to suit your own policies
// See PC-lint for C/C++ manual (chapter LIVING WITH LINT) // for further details.
-e718 // allow calls to undeclared C functions
-e746 // allow calls w/o prototypes in C.
-e46 // Field type should be int
-e123 // Macro defined with arguments at Location
-e505 // Redundant left argument to comma
-e506 // Constant value Boolean
-e525 // Negative indentation from Location
-e534 // Ignoring return value of Symbol
-e537 // Repeated include file
-e539 // Did not expect positive indentation from Location
-e544 // endif or else not followed by EOL
-e545 // Suspicious use of &
-e641 // Converting enum to int
-e656 // Arithmetic operation uses (compatible) enum's
-e725 // Expected positive indentation from Location
-e726 // Extraneous comma ignored
-e740 // Unusual pointer cast (incompatible indirect types)
-e760 // Redundant macro Symbol defined identically at Location -e762 // Redundant declaration of Symbol previously declared at Location
-e766 // Header file FileName not used in module
-e783 // Line does not end with new-line
-e788 // enum constant Symbol not used within defaulted switch -e793 // ANSI limit of Integer String exceeded
附二 Std.lnt
// Unix C, C++, -si4 -sp4,
// Standard lint options
co-unix.lnt options.lnt -si4 -sp4
// copied from VXWORKS CONFIG FILE
// and you may add your directories here
-iD:/Project2
-iD:/Hammer13/hammer_os/product/flex_hammer/bsp
-iD:/Hammer13/hammer_os/product/flex_hammer/Driver
-iC:/TORNADO/target/h
-iC:/TORNADO/target/config/comps/src
-iC:/TORNADO/target/src/drv -DCPU=PPC603 -DPRJ_BUILD
-iD:/Hammer13/hammer_os/include
-D_FLEX_HAMMER_
-D__KERNEL__
-D_BIG_ENDIAN_
附三 Env-si.lnt
-"format=%(%F %l: %)%t %n %m" // format required by IMPL2MSG -width(0) // don't break lines
-hFmn1 // always supply a File but no macro。

相关文档
最新文档