2023年7月9日发(作者:)
PC-LINT使用说明
1.概述 .....................................................................................2
2.如何安装PC-LINT ..................................................................3
一个C文件 ....................................................................3
3.1用命令行方式进行LINT ............................................................................................................... 4
3.2 在Source Insight中集成 .....................................................................................................................4
3.3LINT选项 ..................................................................................................................................... 6
一个工程下的多个C文件 ...................................................7
4.1为何要LINT多个C文件 ................................................................................................................ 7
4.2如何LINT一个工程下的多个C文件.............................................................................................. 8
4.3简单的LINT多个文件 ................................................................................................................... 9
5. 通过准则 ............................................................................10
第一类:不能出现的警告信息 ........................................................................................................ 10
第二类:需要确认的警告 ............................................................................................................... 10
6. PC-LINT的配置 ................................................................11
附一 ................................................................12
附二 ........................................................................14
附三 ...................................................................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:
5:
6:
7:
8:
9:
10: nm = n * m;
11: temp = p == "" ? "null" : p;
12: for( i = 0; i 13: { 14: 15: k++; kk = i; int result; char *temp; long nm; int i, k, kk; char name[11] = "Joe Jakeson"; 16: } 17: 18: if( k== 1 ) result = nm; result = 1; result = -1; 19: else if( kk > 0 ) 20: else if( kk < 0 ) 21: 22: if( m == result ) 23: else 24:} return( temp ); return( name ); 上面的代码用一般的编译器编译是一段有效的代码,但是用PC-LINT编译就会有几个告警。首先第8行向name数组赋值时丢掉了nul字符,第10行的乘法精度会失准,第11行的比较有问题,第14行的变量k没有初始化,第15行的kk可能没有被初始化,第22行的result也有可能没有被初始化,第23行返回的是一个局部对象的地址。这段代码在大部分编译器下是可以顺利编译通过的,继续查找其中的错误就要靠人工调试程序,如果程序很大,这将是一项烦琐的工作,没有人可以保证能找出所有的这类问题,但PC-LINT只通过一次简单的编译就可做到,显然为我们节省了大量的开发时间。 下面就让我们看看如何安装使用PC-LINT。 2.如何安装PC-LINT 安装PC-LINT比较烦琐,有很多选项。但我们提供的是一个拷贝版本,只要把展开到一个目录就可以了。建议大家都用c:lint作为安装目录。 目录下有一些配置文件,可以根据情况修改: : 编译参数文件,里面已经放了一些引用头文件和宏定义,内容就是编译FLEX时的设置。大家可以根据需要修改。如果你不是用FLEX版本的代码,建议从vxWorks的配置文件中拷贝出你现在编译代码所使用的设置。 :编译选项文件。现在里面的内容是关闭一些告警。这些告警是我们认为要求过高的,允许忽略。注意,原则上不允许开发人员随意在这个文件里增加要关闭的告警,以免PC-LINT检查过于放松。 :PC-LINT与SourceInsight集成时的环境参数设置。不需要修改。 一个C文件 3.1用命令行方式进行LINT 如果使用批处理文件进行LINT,在LINT前要先看一下该批处理文件中的内容,里面包含了LINT-NT命令和命令选项,可以根据自己的要求来修改、增减选项。我们看到,在这个批命令中嵌套了一个文件,在文件中还嵌套了、和文件,原则上*.lnt文件是可以无限制嵌套,该类文件中一般都是了LINT的选项,可通过修改这些文件来修改LINT选项,选项是按照从左到右的顺序执行的。可执行下面命令行: C:abcsrc>lin alpha.c beta.c gamma.c 通常对于由多个C模块组成的程序,最好先分别对每个C模块单元进行LINT检查,做单元LINT时可如下运行: C:abssrc>lin -u alpha.c 其中-u是单元选项,使用-u后可以关闭一些检查多模块时会产生的告警,例如“函数未被使用”或“函数没有定义”等。 也可以不使用批处理文件,而直接使用LINT命令。在DOS环境下LINT命令为,在Windows95/NT环境下为,在OS2环境下为。直接使用LINT命令要注意的一点是要在使用前预先设置LINT目录所在路径,最好的方法是把该路径加在文件中。其它的使用方法与使用批处理文件相同。例如: C:abssrc>lint-nt -ic:lint -os(_) *.c 3.2 在Source Insight中集成 将PC-LINT集成到SourceInsight后,使用会变得十分方便。集成的方式是: 1) 从Options菜单中选择“Custom Commands”命令项。 2) 点Add键增加一个定制功能。 3) 在Name栏中输入“PC-lint ”,这个名称可以随便起,只要你能搞清楚它的含义就可以了。 4) 在Run栏中输入“c:lintlint-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目录下的可以得到文件,这个长达5000行的文件包含了所有的错误信息号和解释。 -w -wlib( 2)变量类型大小选项 不同的目标机、编译系统变量类型的的大小(如短整形变量、整形变量等)会有所不同,-esym(#, 该类选项用于为目标机设置变量类型的大小。由于默认的设置与大部分的编译器是匹配的,这些专门的设置通常情况下是不需要的,只在特别的目标机结构中才用。例如一个M68000目标机,它的int类型和指针类型通常是32bit的,这时你应该使用选项:-si4 -sp4。这些尺寸参数的当前值可以通过help屏来获得,例如可以输入以下命令行: lin -si4 -sp4 ? 3)冗长信息选项 冗长信息指的是LINT过程中产生的一些与编译过程有关的信息,而不是真正的告警信息、错误信息等。是否生成这些信息可以通过-v和+v选项来决定。+v是生成这些信息,-v是关闭这些信息,这组选项中除+v外,其它所有选项都可以关闭+v选项。 4)标记选项 使用: /*lint ++flb */ int printf( ); /*lint --flb */ 标记选项的种类很多,基本含义是用于打开或关闭某类语法情况使用,例如允许使用缩写以+f、++f、-f和--f开头的选项是标记选项。他们的逻辑含义分别如下: +f...:通过把标志置为1而把它置为ON -f...:通过把标志置为0而把它置为OFF ++f...:标志增1 --f...:标志减1 后面两个用于你想在局部把一个标志置为ON的情况,而不影响全局设置。例如你可以这样结构体名称,允许使用无名联合体,把所有模块当作C++编译等。 5)消息显示选项 项等。 6)其它选项 其它选项中的种类很多,各种类间差异很大,在这里就不一一介绍了,建议大家看一看消息显示选项用于定义消息输出格式。主要有消息高度选项、消息宽度选项、消息格式选《PC-LINT》一书,第五章有对每种选项的详细说明。lint本身也有一些说明信息, lint-nt 2> 然后狂按几个回车就可以生成一个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一个工程下的多个C模块,在用户的源程序目录下一般需要三个文件: 一个选项文件lint -u alpha.c -oo(a1) 生成的LOB文件名为: lint -u alpha.c -oo 生成的LOB文件名为: (*.lnt)、一个批处理文件(*.bat)和一个MAKEFILE文件(*.mak)。下面一一讲述如何制作这些文件。 1)选项文件(*.lnt) 选项文件在前面也提到过,你可以把你LINT每个C文件时时用到的所有公共选项罗列在该文件中,选项生效的顺序按照从左到右,从上到下的原则。该类文件可以层层嵌套,嵌套的层数没有限制。例如文件: -iC:lint +os(temp) -e46 +vm -zero 2)批处理文件(*.bat) 制作批处理文件时要注意要在该文件中调用文件和MAKEFILE文件,例如文件: @echo Lint Making 'makelap': tcmake - @echo End of making 3)MAKEFILE文件(*.mak) MAKEFILE使用的TCMAKE的语法,和我们平时开发编译时使用的MAKEFILE文件语法格式一样,例如下面的文件: MCCPATH = c:mcc68k OPTION = -u -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 = : $(OBJ) lint-nt -e768 -e769 *.lob : mail.c $(mail_depend) lint-nt $(OPTION) mail.c : lapmain.c $(lapmain_depend) lint-nt $(OPTION) lapmain.c : lapos.c $(lapos_depend) lint-nt $(OPTION) lapos.c : fhdlc1.c $(fhdlc1_depend) lint-nt $(OPTION) fhdlc1.c 4.3简单的LINT多个文件 假设我们的工程不复杂,我们可以负担起每次都将所有的文件都lint一遍的开销,也可以不使用上面的正规用法。笔者在实践中发现,将所有的*.c文件放在一个lint命令中,同样能完成lint整个工程的目的。 如: lint-nt c: 在中包括你的工程中的所有源文件: a1.c a2.c a3.c 需要注意的是,在文件中就不需要-u选项了。因为我们已经提供了所有的信息了。 5. 通过准则 使用PC-LINT进行代码静态检查,必须达到以下的通过准则。不能出现第一类警告信息,出现的第二类警告信息必须经过确认。 第一类:不能出现的警告信息 编号 1 2 编号为1—199的警告 未初始化警告 无 530:Symbol (Location) not initialized 变量未初始化 644-645:Symbol (Location) may not have been initialized 变量可能未初始化 727-729:Symbol (Location) not explicitly initialized 变量未精确初始化 3 返回值 533:function Symbol should (not) return a value (see Location) 函数(不)应该返回数值 4 5 比较 声明 568,775:nonnegative quantity is never less than zero 650:Constant out of range for operator String 578:Declaration of Symbol hides Symbol (Location) 注:局部变量与全局变量同名造成可读性下降,极易出错) 第二类:需要确认的警告 编号 1 布尔值 类型 描述 774:Boolean within 'String' always evaluates to False] 2 精度损失 569:Loss of information 734:Loss of precision 732, 570:Loss of sign 类型 描述 3 返回值 on) 571:Suspicious Cast 616:control flows into case/default 534:Ignoring return value of Symbol (compare with 建议:使用“(void)function();斕岣呖啥列裕© 4 边界值 661:possible access of out-of-bounds pointer 指针越界访问 5 空指针 662:possible creation of out-of-bounds pointer 413:Likely use of null pointer 空指针引用 613:Possible use of null pointer 空指针引用 l 将空指针传递给函数 6 switch语句 744:switch statement has no default switch语句中没有default 7 未使用的代码和变量 787:enum constant Symbol not used within switch 527:Unreachable 不可达代码 528:Symbol (Location) not referenced (static) 出现未引用变量 529:Symbol (Location) not subsequently referenced
发布者:admin,转转请注明出处:http://www.yc00.com/news/1688906199a182236.html
评论列表(0条)