内容发布更新时间 : 2024/11/5 15:47:06星期一 下面是文章的全部内容请认真阅读。
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
取消对name的定义,对后续的模块文件生效 忽略以前及以后对name的定义 设置告警级别,取值范围(0,1,2,3,4)
-w0 无任何消息(致命错误Fatal Errors除外)
16
PCLint选项详解
-w1 仅错误消息(Errors),无告警(Warnings)和提示(Informationals) -w2 仅错误消息和告警消息
-w3 错误、告警和提示消息(这是缺省值) -w4 所有消息
-wlib(
对于所有错误号大于#的,都设置退出码为0,这在用make文件时很有用 允许标志符中使用$作为标志符的一部分
VII. 编译器相关选项
-a#
-#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