PCLint选项详解 下载本文

内容发布更新时间 : 2024/5/18 8:17:18星期一 下面是文章的全部内容请认真阅读。

PCLint选项详解

B

假定每一个Bolean类操作符都将返回一个与Type类型兼容的返回值,在所有需要判

断Bolean值如if语句的地方都要检查结果是否符合这个强类型,否则告警。对于后半句主要是用于如下情况,if(a)...当a为int时,将产生告警,因为int与Bolean类不兼容,所以必须改为if(a != 0)...。

b l f

仅仅假定每一个Bolean类操作符都将返回一个与Type类型兼容的返回值 库标志,当强类型的值作为参数传递给库函数等情况下,不发告警

与B或b连用,表示抑止对1bit长度的位域是Boolean类型的假定,如果不选该项表

示1bit长度的位域被缺省假定为Boolean类型。

如果Flags部分为空,表示所有Types都是强类型,但是除了对声明进行检查之外,不指定任何其它的检查。如果Types部分为空,表示除了用别的-strong选项说明的强类型之外的所有用typedef定义的类型都是强类型,且具有Flags属性。例如:

-strong(A) -strong(Ac,Count)或-strong(Ac,Count) -strong(A)都是表示对Count类型不做强类型检查,但是对于其它用typedef定义的类型都是强类型并进行赋值检查。

-t# -u

设置Tab键的大小为#,缺省值为8

单元检查,抑止许多模块间问题告警,如526、552等

-unreachable

表明程序中的一个点是不可达的,用于抑止某些告警,如:

int f(n) {

if (n) return n; exit(1);

//lint -unreachable }

此处用以防止PCLint认为exit语句后执行了一个隐含的return,而隐含的return一般是不返回值的,这就会出问题,因为声明要返回值int。所以使用此选项抑止此告警。

-u --u -w

取消对name的定义,对后续的模块文件生效 忽略以前及以后对name的定义 设置告警级别,取值范围(0,1,2,3,4)

-w0 无任何消息(致命错误Fatal Errors除外)

16

PCLint选项详解

-w1 仅错误消息(Errors),无告警(Warnings)和提示(Informationals) -w2 仅错误消息和告警消息

-w3 错误、告警和提示消息(这是缺省值) -w4 所有消息

-wlib() 设置对库文件的告警级别,取值范围及含义同上,缺省级别为4 -wprintf(#,id[,...]) -printf选项的宽字符(wide char)版本 -wscanf(#,id[,...]) -scanf选项的宽字符(wide char)版本 -zero[(#)] -$

对于所有错误号大于#的,都设置退出码为0,这在用make文件时很有用 允许标志符中使用$作为标志符的一部分

VII. 编译器相关选项

-a#(tokens) 使 #predicate (tokens)为True,用于Unix -d()[=] 用于定义类似于函数的宏 -#d[=] 定义标号,仅用于 #include 举例如下:

-#dtime=Filename 不会影响time在非Include以外的地方作为标志符使用 #include time 某些VAX-11 C可以这样使用Include

-overload(X) X为16进制常数,用于设置标志位,缺省值为7 而

不选择void f(int far *),因为内存模式far不满足。

bit 1 内存模式满足优先于ANSI标准满足。例如:int n; f(&n);将选择void f(int const *)

bit 2 内存模式及ANSI标准同时满足优先于单个满足。 bit 4 内存模式对于引用参数(&)有意义。

设置时,如果要设置哪几个位,X就等于位数和。如:7 = 1 + 2 + 4,表示同时置为bit 1、2和4。其余依此类推。此选项影响函数重载(Overload)的选择。

-plus(Char) 的替代

-template(X) X为16进制常数,用于设置对模板处理的标志位

将字符Char作为“+”对待,用于解决某些操作系统上不方便使用+

bit 1 当前只有这一个标志位,缺省是关的。表示对于模板基类采用积极的处理方式。

17

PCLint选项详解

一般来说,模板基类直到实例化的时候才进行处理。但是对于某些库,尤其是STL库,基类必须采用积极的处理方式。因为它们提供了模板处理时需要的名字。

_bit

1个bit宽的数据类型,使用+rw(_bit)激活

用于忽略它本身和其后的下一个单词,使用+rw(_gobble)激活

_gobble

_to_brackets 用于忽略它本身和其后用各种括号(()、[]和{})括起来的部分,使用

+rw(_to_brackets)激活

用于忽略它本身及其后的所有东西直到遇到分号(;)为止(包括分号), 使用+rw(_to_semi)激活

_to_semi

以上的三个选项,其用法相似,举例如下:

-dinterrupt=_to_brackets //令interrupt等同于_to_brackets +rw(_to_brackets) 的,

将导致interrupt及其后用括号括起来的部分Lint时被忽略

//将_to_brackets作为关键字激活,而interrupt是等同于该关键字

结果如下,将导致下面的语句被忽略: interrupt(3) interrupt[5,5] interrupt{x,x}

VIII. 各种使用说明 A.

库模块文件的使用(Library Modules)

库模块文件用来描述函数(非原型)的参数列表,对于库模块文件中声明的任何对象(不是指C++的对象,包括结构等)都不需要在其它地方定义和使用,这一点和库头文件一样。它的目的是为了使Lint能够处理源程序所包含的非原型的库函数。即使对于ANSI标准的编译器,有时候我们也会使用到非原型的库,这时就需要使用库模块文件了。举例如下:

假设你被提供了一个图形库的目标文件g.lib和头文件g.h。如果g.h包含原型,你不需要使用库模块文件。如果g.h不包括原型,而你又有该库的源程序g1.c-g25.c的话,你可以用如下命令生成原型描述。

lint -u g*.c -od(gproto.h)

这个命令将生成所有函数和数据对象的原型到文件gproto.h中,其中不包括结构定义,如果你的g.h文件中没有结构定义的原型,你还需要使用-ods命令将结构定义也生成原型。然

18

PCLint选项详解

后你可以定义你的库模块文件如下:

glib.c: /*lint -library */ #include \#include\

接下来你就可以用它来Lint包含该库的源程序program了,命令如下: lint co glib program

//co为编译器的配置文件(lnt)

为了减少处理时间,你还可以先将glib.c生成为LOB文件以加快处理。如下: lint -u co glib -oo(glib.lob) lint co glib.lob program

B. 汇编(非C、C++)文件的处理

如果你的工程中包含汇编代码或其它非C、C++代码,你必须如下处理以使得Lint不会

因为这些缺失的代码产生误告警。最常用的方法是创建一个头文件来描述汇编部分的代码,这个头文件必须被当作库头文件处理,以免PClint对其中的声明产生告警(因为无法得到声明的定义和使用部分的代码)。因此我们必须这样使用:+libh(asm.h)。

另外如果一个变量alpha仅在汇编代码部分被使用,Lint时会告警552,我们可以使用如下命令抑止该告警:-esym(552,alpha)。需要说明的是,这个选项不能放在asm.h文件中,因为库头文件中的选项只有在第一次该头文件被包含时才会生效,那么这个选项对于前面处理过的源文件就是无效的。所以该命令应该包含到配置文件中。

C. 1.

强类型 应用举例:

例一:

//lint -strong( AJXb , Bool ) //lint -strong( AJX , BitField ) typedef int

Bool;

//由于没有选择f,因此1bit字位缺省为Boolean类型

typedef unsigned BitField; struct foo {

unsigned a:1 , b:2 ; //成员a和c都被缺省假定为Bool类型,b不是强类型

19

PCLint选项详解

BitField c:1 , d:2 , e:3;

//成员d和e都是BitField类型

}x; void f() { } 例二:

//这个例子也说明了一个变量只能是一种强类型,如c。

x.a = x.b = x.a = x.b = x.c = x.e = x.e =

(Bool) 1; //OK,同一类型赋值 (Bool) 0; //NO,违反X规则 0; 2; x.a; 1; x.d;

//NO,违反A规则 //OK,b不是强类型 //OK,同一类型赋值 //NO,违反A规则 //OK,同一类型赋值

//lint -index( d , Count , Temperature ) typedef float Temperature; typedef int Count; Temperature t[100]; Temperature *pt = t ; Count t[0] =

t[1];

//NO,因为没有c,所以不允许使用常数作为下标

i;

//OK,因为d允许使用非Count类型说明数组大小

for( i=0 ; i<100 ; i++)

t[i] = 0.0;

//OK,i是Count类型

//NO,因为没有c,所以不允许使用常数作为下标

pt[1] = 2.0; i = pt - t ;

//OK,pt - t 的结果是Count类型

说明:如果要对多维数组进行强索引类型检查,应该使用递归式定义数组方式,以二位数组Screen[25][80]的定义方式举例如下:

/*lint

-index( d , Row_Ix , Row ) -index( d , Col_Ix , Att_Char) */

20