PClint错误码大全要点.pdf

上传人:tbuqq 文档编号:5197743 上传时间:2020-02-19 格式:PDF 页数:101 大小:645.33KB
返回 下载 相关 举报
PClint错误码大全要点.pdf_第1页
第1页 / 共101页
PClint错误码大全要点.pdf_第2页
第2页 / 共101页
PClint错误码大全要点.pdf_第3页
第3页 / 共101页
PClint错误码大全要点.pdf_第4页
第4页 / 共101页
PClint错误码大全要点.pdf_第5页
第5页 / 共101页
点击查看更多>>
资源描述

《PClint错误码大全要点.pdf》由会员分享,可在线阅读,更多相关《PClint错误码大全要点.pdf(101页珍藏版)》请在三一文库上搜索。

1、1.1.1.1.1PC-LINT中的各种错误信息都有一个相关的错误号, 其中各个错误号的分配区间如下: 表1:PC-LINT 错误号区间分配 错误类型错误号 C 错误号 C+ 告警级别 语法错误1 -199 1001-1199 1 内部错误200-299 0 致命错误300-399 0 告警400-699 1400-1699 2 提示信息700-899 1700-1899 3 可选的注解900-999 1900-1999 注:其中200-299 号告警为PC-LINT 的内部错误,一般不会发生, 1.2C 语法错误 1.2.11未关闭注释(位置 ) 文件结束的时候,仍然有一个未关闭的注释存在,

2、打开的这个注释位置将被显示出来。 1.2.2 2未关闭的引号 在行尾的时候,仍然存在一个同行的未关闭的引号(单引号或双引号)。 1.2.3 3#else 没有一个 #if 在一个区域内有一个#else ,但是没有一个#if, #ifdef 或 #ifndef 。 1.2.44太多的 #if 嵌套层次 检测出一个内部的限制,有关#if的嵌套层次(包括#ifdef 和 #ifndef) 。 1.2.55太多的 #endif 出现一个 #endif ,但不是 #if 或 #ifdef 或#ifndef. 的。 1.2.66堆栈溢出 一个内置的不可展开的堆栈被过分扩展。可能是太多的嵌套的#if 语句、

3、#includes 语句 (包括所有的递归的#include 语句),static块(有限制的括号 ) 或#define置换。 1.2.77不能打开 include 的文件: FileName FileName 是不能打开的 include文件的名字。 ,可以见 flag fdi (见章节 5.5 标志选项 ),选 项 -i. (见章节 5.7其它选项 ) 和章节 13.2.1 INCLUDE 环境变量。 1.2.88未关闭的 #if (位置 ) 一个#if (或#ifdef 或#ifndef) 没有遇到相应的#endif。位置是#if.的位置 1.2.9 9太多的 #else在#if (位置

4、 ) 一个给定的#if 包含一个#else ,然后轮流流被紧跟另一个#else 或一个#elif。错误消 息给出#if语句条件包含异常的行号 1.2.1010期望的字符串 字符串是期望的记号,期望的记号不能被发现。当一定的保留字没有被认出时,给出这 条消息,例如: int _interrupt f(); 将收到一个Expecting ; message at the f ,因为它认为你想声明_interrupt。 改正的方 法是建立一个新的保留字使用 +rw(_interrupt )。 同样,保证使用正确的编译器选项文 件。见 章节15.10 奇怪的编译器 . 1.2.11 11超出大小范围

5、在#include l行确定的文件名的长度超过了 FILENAME_MAX 字符。 1.2.12 12需要 或“filename“ 1.2.1313不好的类型 类型形容词例如long 、unsigned等等。不能应用到紧跟的类型。 1.2.1414符号Symbol 以前定义过 (位置 ) 符号被定义第二次。 提供出以前定义的位置,如果这是一个暂定的定义(没有初始化) , 这个消息可以用+fmd flag抑制。( 章节5.5Flag 选项 ). 1.2.1515符号Symbol重新被声明(TypeDiff) (位置) 符号被以前声明过或在其它模块定义过(其它位置 )的类型和在当前位置的声明的类型

6、不 同。参数 TypeDiff r提供了类型怎么不同的进一步信息(见章节17. 信息 ). 1.2.1616不认识的名字 一个# 指示符后没有跟着一个可认识的单词。如果这不是错误使用+ppw 选项(章节 5.7其 它选项 ). 1.2.1717未被承认的名称 A non-parameter is being declared where only parameters should be. 1.2.18 18符号重新声明(TypeDiff) 和此位置冲突 一个符号被重新声明。参数TypeDiff 提供类型不同的进一步信息(见Chapter 17. 信息 )。 位置是先前定义的位置。 1.2.1

7、919无效的声明 一个类型独自的出现而没有相关的变量,类型不是 struct 、union 和 enum. 一个双分号能 导致这个: int x; 1.2.2020非法使用= 一个函数声明后紧跟一个符号. 1.2.2121期望 对于不确定大小的数组的初始化必须以一个左括号开始。 1.2.2222非法的操作符 发现一个一元操作符紧跟一个操作数,这个操作符不是一个post 操作符。 1.2.2323期望“:” -碰到一个? 操作符 ,o但是没有紧跟一个期望的: 操作符。 1.2.2424期望一个表达式,但是得到一个字符串 发现一个在一个表达式开始的操作符,但是它不是一个一元操作符。 1.2.252

8、5非法的常量 在一个字符常量中遇到太多的字符。 1.2.26 26期望一个表达式,但是得到一个字符串 1.2.27 27非法的字符(0xff) 源代码中发现非法的字符。消息中提供十六进制代码。假定是一个空格。如果你使用 奇怪的字符在标识符名称中,你将得到这个信息。你可以使用选项- ident (见章节 5.7其 它选项 .) 1.2.2828重定义一个符号(符号位置) 给出的在以前( Location)声明的冒号前的标识符不是一个label. 1.2.29 30期望一个常量 期望一个常量, 但是没有得到。 可能是在case 关键字后,数组维数、 bit field 长度、 枚 举指、#if 表

9、达式等等 . 1.2.30 31重新定义一个符号(Symbol conflicts with Location) 数据对象或函数在此模块中以前定义过又被定义。 1.2.3132 Field 大小(member Symbol) 不能是 0 给出的field 的长度是非正 (0或负数 ). 1.2.3233非法常量 当一个 8进制的常量包含数字8或9时,这是一个错误的形式。 1.2.3334非常量初始化 -在一个 static数据项中发现非常量初始化. 1.2.3435初始化有副作用 在一个 static数据项中发现有副作用的初始化. 1.2.35 36重新定义存储类的符号Symbol 和位置Lo

10、cation冲突 对象的存储类被改变. 1.2.3637 枚举值Symbol 不一致 (和位置Location冲突) 枚举值不一致 . 1.2.3738符号Symbol 的偏移量不一致(Location) 很多类或结构比早期的声明出现在不同的位置(从结构开始的偏移量).可能因为数组维 数从一个模块到另一个模块的改变. 1.2.38 39重新定义符号Symbol c 和位置Location 冲突 struct 或union 被重新定义 . 1.2.3940没有声明标识符Name 在表达式内 , 一个标识符在以前没有被声明并且没有紧跟一个左括号. Name 是标识符 的名称 . 1.2.4041重

11、新定义符号Symbol 一个宏或函数的参数被重新定义. 1.2.4142期望一个语句 1.2.4243变量Symbol虚的类型 在一个实例的上下文中发现虚类型例如void类型. 1.2.4344需要一个switch 在一个 switch外出现case或default语句 . 1.2.4445错误的使用register 一个变量被声明为register ,但是它的类型不应该是register (例如一个函数 ). 1.2.4546域类型应该是int 在结构中位域应该是类型为unsigned 或int. 如果你的编译器允许其它类型,例如char, 那么抑制这条信息. 1.2.4647错误的类型 一

12、元减需要一个算术操作数. 1.2.4748错误的类型 一元的* 或左手边的指针(-) 操作符需要一个指针操作数o. 1.2.4849期望一个类型 在原型内只有类型被允许。原型是圆括号内有一系列的类型的函数声明. 处理器是在它 检测到至少圆括号内的一个类型时,期望更多的类型或关闭的右圆括号. 1.2.4950试图取非左值的地址 一元 按照 ANSI标准是非法的。一些编译器允许这个结构,允许你使用+fpc 选项(指针括号是 左值 ). (见章节 5.5Flag选项 .) 1.2.5253期望一个标量 自动递减 (-) 和自动递增 (+) 操作符可能只应用于标量(算术和指针)或这些操作符定 义的对象

13、 . 1.2.5354被 0除 常量0 w被用于除操作符(/) 或取余操作符的右手边。 1.2.5455坏类型 上下文需要一个标量、函数或结构(除非-fsa). 1.2.5556坏类型 需要标量类型和指针的加/减操作符可能被加到指针中。 1.2.5657坏类型 Bit 操作符 ( 非法的 void 函数 ANSI 标准不允许一个返回void 函数的格式的表达式。如果你试图转换void为return (void)f(); ,而且你的编译器允许,可以抑制这个信息。 1.2.8283在减操作中不兼容的指针类型 两个指针相减,指向的类型是不同的。你将使PC-lint/FlexeLint 去忽略指针中轻

14、微的区 别,通过使用一个或多个-ep. 选项。描述在 章节5.2 错误抑制选项 . 1.2.8384sizeof 目标是零或目标没有定义 一个sizeof 返回一个 0 值。如果目标没有定义或没有完整定义,这将会发生。 确保当你 使用sizeof时,对目标是在范围内完整定义。 1.2.8485数组Symbol 有 0 维 一个数组被声明在上下文中没有一个维数,需要一个非零的维数。 1.2.8586结构Symbol 没有数据元素 尽管在 C中合法,但是在C中却是非法的。 1.2.8687对 #ifdef 或#ifndef 表达式太复杂 在C的规则中,应该有一个单独的标识符紧跟#ifdef 或#i

15、fndef。你可以提供一个有效的 结构化的 C (或 C+) 注释。 1.2.8788符号Symbol 是一个有空元素的数组 一个数组被声明 (在一个 C模块中 )为它的元素每个都是0长度,尽管在 C中是合法的 名单在世 C中是不允许的。 1.2.8890选项String 仅仅合适在一个lint 注释中 指示的选项不合适在一个命令行或一个 .lnt 文件中。例如:如果-unreachable 被给出在 命令行,你将得到这个信息。 1.2.8991行超过整型字符(使用+linebuf) 从输入文件中读取的一行比预期的要长。默认的行缓冲的大小是600 个字符。每次你 使用+linebuf 选项,你

16、将翻番这个大小。 1.2.9092负数数组维数或位域长度 一个负数的数组维数或数组长度是不被允许的。 1.2.9193在宏的字符串参数内新行是不被允许的 在一个宏调用中包含一个被切割为不只一行的字符串。例如: A( “Hello World“ ); 将触发这个信息。如果一些编译器接受这种结构,你可以抑制这个信息。但是最好把字 符串常量放置于一行: A( “Hello World“ ); 将更好。 1.2.92101期望一个标识符 当处理一个函数声明时,遇到一个参数说明,不是标识符,尽管以前的参数被确定为一 个标识符。这是混合旧格式声明和新格式声明的函数,这是不允许的。例如: void f(n,

17、int m) 将发布这个信息。 1.2.93102非法的参数确定 在一个函数声明内,一个参数被确定为或者一个标识符,或者一个跟着声明的类型。 1.2.94103 不期望的声明 在一个原型后,仅仅只能是一个逗号、分号、右括号或左brace。如果你省略了一个在一 个声明后的终结符, 或如果你混合旧格式参数声明和新格式原型时,这个错误可能发生。 1.2.95104冲突的类型 发现两个连续的冲突类型,例如int 紧跟一个double。去除其中一个类型。 1.2.96105冲突的修饰符 发现两个连续的冲突修饰符,例如far 紧跟一个near。去除其中一个修饰符。 1.2.97106非法常量 在一个预处理

18、器表达式中发现一个字符串常量,例如: #if ABC = “abc“ 这个表达式应该是一个整型表达式。 1.2.98107标签Symbol (Location) 没有定义 在一个 goto中,Symbol 在给给出的位置 Location 出现,但是没有相应的label。 1.2.99108无效的上下文 遇到一个continue 或break 语句,没有合适的上下文,例如:for, while, 或do 循环, 多仅仅对 break 语句,相应的 switch 语句。 . 1.2.100110试图给一个void 分配 试图分配一个值给一个指定的目标(可能通过一个指针) 为void. 1.2.1

19、01111分配给一个const目标 一个目标被声明为 const 被分配给一个值。例如, 如果 p 是一个指针,指向一个const int ,那么分配到*p 将导致这个错误。 1.2.102113不一致的枚举声明 在一个枚举内的系列成员(或它们的值 )和另一个同名的枚举量(通常在另一个模块)不一 致。 1.2.103114对 tag Symbol不一致的结构声明 在一个结构 (或联合) 内的系列成员 (或它们的值 )和另一个同名的枚举量(通常在另一个 模块 )不一致。 1.2.104115结构 /联合没有定义 结构或联合的引用需要一个定义,但是在范围内没有定义。例如,一个p-a 的引用, 这里

20、 p 是一个指针,指向一个结构,但是此结构还没有在当前模块中被定义。 1.2.105116不合适的存储类 一个不同于register的存储类在一个代码段中被给出,专注于声明参数。 1.2.106117不合适的存储类 一个存储类在函数外被给出,表示 auto 或 register 。这个存储类仅仅适合于函数内。 1.2.107118原型参数太少 一个函数提供的参数少于范围内原型指示的个数。 1.2.108119原型参数太多 一个函数提供的参数多于范围内原型指示的个数。 1.2.109122数字 (字符 )对基数太大 指示的字符在一个常量中被发现,并以零开始。例如, 08 在一些编译器中被认为是8

21、 , 但是它应该是010 或8。 1.2.110123有参数在Location定义的宏Symbol ,这只是一个告警 有参数的宏被随后识别,没有一个其次的(。这是合法的,但是可能是个疏忽。要抑制 这个信息是难得的(使用-e123),因为一些编译器允许,例如,宏max() 和变量max 共存。 (见章节错误 123使用 min或max.). 1.2.111124指针指向void 是不允许的 这包括减、加和关系操作符( = = 10 . f( 2, 20 ); 导致结果: Call to function f(int, int) violates semantic (1n10) 1.5.27 42

22、7/ 注释不能以形式换行 1.5.28428 在操作符String中有负值下标(Integer) 一个负值的整型被加入到一个数组或一个指针指向分配的区域(通过 malloc , operator new, 等等分配 .) 。 可以是一个部分下标操作或部分指针计算操作。操作符在 String.指出, 整型值通过 Integer给出。 1.5.29 429托管指针没有释放或者没有返回,可能造成内存泄漏 一个auto 存储类的指针被分配内存,或者没有释放或者没有返回给调用者。这代表一 个内存泄漏。 如果一个指针唯一地指向一个存储区,它被认为是保管的。 如果它被复制, 它就不被认为是保管的,因此: i

23、nt *p = new int20; / p is a custodial pointer int *q = p; / p is no longer custodial p = new int20; / p again becomes custodial q = p + 0; / p remains custodial 这里p 没有丢失它的保管特性,仅仅参见一个数学计算操作。一个指针通过传递指针 给一个函数可以丢失它的保管特性。如果函数的参数是指针指向const的类型或如果这个 函数是一个库函数,那个假定不成立。例如 p = malloc(10); strcpy (p, “hello“); 那

24、么p 仍旧有存储分配的保管。可能通过语义选项指出一个函数将有指针的保管,见: custodial(i) 在 章节10.2.1可能的语义 1.5.30 430提示 字符是非标准C/C+ 语法 很多对嵌入式系统的编译器有一个声明语法,确定一个位置作为对一个变量的初始值。 例如: int x 0x2000; 确定变量 x 实际位置于0x2000。这个信息提醒这种语法是非标准的 (尽管非常普遍 )。 1.5.31 432Malloc 函数参数可疑 检测到下列模式: malloc( strlen(e+1) ) 这里e 是一些表达式。这是可疑的因为它接近通常的使用模式: malloc( strlen(e)

25、+1 ) 如果你有意使用第一种模式,那么一个相等的表达式将解除这个错误: malloc( strlen(e)-1 ) 1.5.32 433分配内存的数目小于指向它的指针应该拥有的数目 这通常发生在库分配函数上,例如 malloc 和 calloc 。例子: int *p = malloc(1); 这个信息也支持用户声明分配函数。例如,如果一个用户拥有的分配函数被提供下列的 语义: -sem(ouralloc,P=malloc(1n) 我们将报告同样的信息。请注意必须指出返回的区域是新分配的。这个信息通常和826 一起给出。 1.5.33 434符号“ ”与新行之间有空格 按照 C 和 C+的标

26、准,任何右斜线紧跟一个换行,例如: #define A 34 定义 A 为34。如果一个空格或 tab键 介于右斜线和新行之间,那么按照标准的严格解 释,你将定义A 为一个右斜线,但是这个空格对于裸眼是不可见的,因此或导致混淆。 如果你实在需要定义一个宏为右斜线,可以使用一个注释,例如: #define A /* commentary */ 1.5.34 435整型常量String数值太大,建议检查fll 标志选项,是否需要打开,以 达到 long long 类型范围。 一个整型常量被发现精度超过 long 但是适合 long long , 然而 +fll 标志将激活 long long 类型

27、。检查对long (-sl#) 和对long long (-sll#) 确定的大小,确保它们是正确的。 如果你的编译器支持long long打开+fll ,否则使用小点的常量。 1.5.35 436在此处的宏调用语句中使用预处理指令 类似与宏语句的函数,其参数扩展到多行,还包含预处理语句。这经常会存在缺少右括 号错误。 按照标准 c,预处理包含在宏参中,会导致不能连续被执行。因此,某些编译器把这个指令 认为是预处理器指令。这符合逻辑,但移植时困难。最好在代码中避开这种构造方法。 1.5.36 437传结构体参数给函数的省略符(.)参数 一个结构被传递给函数的一个参数,位置通过省略号标识。例如:

28、 void g() struct A int a; x; void f( int, . ); f( 1, x ); . 这是十分不寻常的,值得指出因为可能不是故意这样的。 1.5.37 501期望是有符号类型 一元的减操作符被应用于无符号类型。结果值是一个正的无符号量,可能不是有意的。 1.5.38 502期望是无符号类型 一元 操作符是一个位操作符将更逻辑上被应用于无符号量,而不是有符号量。 1.5.39 503建议关系操作表达式中不要用boolean 参数 通常一个关系操作符不应该有一个boolean参数,一个例子是 a 0 ) x = 3; y = 4; 对y = 4;将发布这个告警。位

29、置引用是if子句。 见章节 11.3缩排检查 1.5.71 540分配的存储空间太小 字符串初始化超过了其所分配的内存的大小。如: char acTemp5 = “123456“; 1.5.72 541分配的存储空间太小 字符常量(用 xddd or xhhh 确定的)的存储空间长度等于或者超过字节的bit数2*b 。 sb 选项确定,缺省是-sb8。 1.5.73 542超过 bit 字段的存储大小 试图分配一个值到看起来太小的位域。这个被分配的值或者是比目标大的另一个位域的 值,或者是一个太大的数字值。你可以转换这个值到一个普通的无符号类型来抑制这个 信息。如果这个位域是一个 int 。例

30、如: struct int b : 1 s; s.b = 1; /* Warning - - requires 0 or -1 */ 这种情况的解决方法是使用unsigned 代替 int 在b 的声明中。 1.5.74 544此处 endif 或者 else后面没有紧跟EOL 符号(行结束符号) endif 或者else 后面应该紧跟EOL符号。如: #if - #endif if () - 一些编译器明确地允许注释紧跟#endif。如果你按照协定,可以关闭这个消息。 1.5.75 545 int (*p) 10; 那么 a 和 的结构,没有紧跟一个else。 这很可能是一个不希望的分号导致

31、。 1.5.79 549转换做法令人怀疑 执行了指针和一些列举的类型转换。这可能是一个错误,检查你的代码,如果这不是一 个错误,在最终的转换前转换项为一个中间的格式(例如一个int 或一个long)。 1.5.80 550符号“ symbol”被赋值后没有被使用 一个变量(一些函数的局部变量)没有被访问。这意味着这个变量的值一直没有被使用。 可能这个变量被分配了一个值,但是从没有被使用。注意:一个变量的值通过自增或自 减不被认为是被访问了的,除非自增或自减在一个表达式内,使用结果的值。同样应用 于格式的结构: var += expression 。如果取变量的地址,它的值假定被访问。一个数组、

32、结构、联合被 认为访问了的,只要其中的部分被访问了。 1.5.81 551 静态符号“ symbol”被赋值后没有被使用 一个变量 (在模块水平被声明为static ) 没有被访问,尽管变量被引用。见信息550 对 访问的描述。 1.5.82 552外部符号“ symbol”被赋值后没有被使用 一个外部变量没有被访问,尽管这个变量被引用了。见信息550 对访问的描述。 1.5.83 553预处理变量“Name”没有定义,假设是0 指示的变量在以前没有在一个#define语句中定义,但是它却被使用在预处理条件格式 #if 或#elif中。按照惯例所有的变量在预处理表达式中应该被预先定义。这个变量

33、被假 定值为 0。 1.5.84 555K 足够保留一个对 name的在符号表中的位置。 1.5.95 566printf/scanf 系列函数中的格式字符串不一致或冗余 这个信息是对printf/scanf 函数族的格式化进行检查。在格式说明中发现的指示的字符 Char 和在通用的格式说明中的早些的字符不一致或多余。例如,一个格式包含“%ls“ 将 产生字符s指示的这个错误,这是因为长度修改器被设计成用于整型或浮点型转换, 没有字符串转换。这些字符通常被编译器忽略。 1.5.96 567printf/scanf 系列函数中的格式字符前缺少数字 这个信息是对printf/scanf 函数族的格

34、式内的格式说明检查。在扫描格式的特定点期望一 个数字域或星号。例如:%-d 需要一个在格式域的十进制整型的左边调整,但是既然给 出没有,这个需要就是没有意义的。 1.5.97 568非负数不可能小于0 比较格式: u = 0 0 u 是可疑的,如果u 是一个无符号量,或一个量断定永远不会小于零。参见信息775。 1.5.98 569赋值时的信息丢失 从一个常量到一个整型变量的一个分配(或隐含分配,见 Context )不够大去拥有常量。 1.5.99 570赋值时符号位的丢失 从一个负值常量到一个无符号量的一个分配(或隐含分配, 见Context )。转换这个常量为 unsigned 将去除这

35、个诊断,但是这是你希望的吗。 1.5.100571可疑的转换 通常这个信息的发布针对格式的转换: (unsigned) ch 这里 ch 被声明为char ,而char 是有符号的。尽管转换可能看起来阻止对 ch 的符号扩 展,它没有按照正常的C语言的提升规则,ch 首先被转换为int, 要抑制符号扩展,你 可以使用: (unsigned char) ch 另外,如果符号扩展是你希望的,你仅仅希望抑制这个告警,你可以使用: (unsigned) (int) ch 1.5.101572位移值太大 一个量被右移,它的精度等于或小于移位的值。例如: ch 10 将得出这个信息,如果ch 类型是cha

36、r ,这里char 是一个小于10 比特宽度 (通常情 况下 )的类型。在这种情况下抑制这个信息,你可以转换移位的量的类型的长度至少是 移位的值。 常量的精度 (包括枚举常量 ) 从需要在它的二进制表示的比特的数量决定。通 过转换精度不会改编,所以仍旧产生(unsigned) 1 3 信息。但是通常表达式例如13 能合法发生的唯一的方式是通过一个宏。在这种情况下使用:-emacro。 1.5.102 573在除法中,混合使用有符号数和无符号数 / 或% 的一个操作数是有符号的,另一个是无符号的;甚至有符号的量可能是负值。例 如: u / n 这里u 是一个无符号的,n 是一个有符号的,将发布这

37、个信息,但是: u / 4 将不会,甚至4 是名义上地的int。在任何情况下混合有符号量和无符号量都不是个好 主意,但是,对于除法,一个负值可能产生破坏。例如: n = n / u 如果n 为 -2 ,u为 2,不是分配-1 到n ,而是分配一些非常大的值。要解决这个 问题,或者转换整数为无符号的如果你知道它永远不会小于零,或者转换 unsigned 为 一个整数如果你知道它永远不会超过整数的最大值。 1.5.103 574在关系表达式中,有符号数和无符号数混合使用 四个关系操作符是: = n ) . 这里u 是一个无符号的,n 是一个有符号的,将得出这个信息,但是: if( u 12 ) .

38、 将不会(甚至12 是一个正式的int ,明显它不是负值)。混合有符号和无符号的量在一 起在任何情况下不是个好主意,但是,对于四个关系操作符,一个负值可以产生模糊的 结果。例如,如果条件: if( n 4 = 16 ) . 将收到这个告警,因为左手边被限制为4比特的精度。 1.5.161651潜在地混淆初始化器 一个复杂集合的初始化器被处理。ANSI 建议或者没有内部括号的“最低程度地相等” 初始化器或内部集合是相等的“充分的相等的”初始化器。 1.5.162 652 符号的 #define 以前声明过 宏被定义为一个以前声明过的符号。例如: int n; #define n N 以前的符号检

39、查是局部变量和全局变量、函数和typedef 符号、struct 、 union 和enum tag。 没有检查的是 struct 和 union 成员。 1.5.163653可能丢失部分内容 当两个整型相除,分配一个浮点变量,将丢失部分内容。例如,尽管: double x = 5 / 2; 显示分配 2.5 给x,它实际分配的是2.0。要确保你没有丢失部分,转换至少一个操作 数到一个浮点类型。如果你实际希望做切断,在分配给浮点类型变量前转换结果到一个 整型 (int 或 long)。 1.5.164654 选项荒废;使用-width(W,I) 选项 -w 现在被用于设置告警级别,不不再用于确

40、定错误信息的宽度。代替而使用 -width ,用同样的社会。要设置告警级别为3,使用-w3 ,不是-w(3)。 1.5.165655位方式操作使用(兼容 )枚举 一个位方式操作符( | 、 if( n a . 这里,程序员忘记索引数组,但是错误正常执行,没有被检测到,因为数组引用被自动 和隐含地转换为一个指向第一个数组元素的指针。如果你真正想访问第一个元素,使用 y0.a 1.5.174664逻辑或(|) 的左边或逻辑和(;) 1.6.11717发现do . while(0) 尽管这代表在期望一个布尔值的上下文的一个常量,这个结构可能是故意试图压缩一系 列语句为一个单独的语句,因此给出一个单独

41、的错误信息。例如: #define f(k) do n=k; m=n+1; while(0) 允许 f(k) 被用于一个条件语句中: if(n0) f(3); else f(2); 从而,如果你故意这样做,使用-e717 。 1.6.12718Symbol符号没有定义,假定返回int 一个函数被引用没有 (或之前) 被在当前的模块内声明或定义。这不是一个必要的错误, 你可能希望抑制它(见章节 14. 灵活使用 LINT. ). 注意:通过在另一个模块内增加声明, 你将不能抑制这个信息。它只能被抑制通过在被处理的模块内放置一个声明。 1.6.13719 过多的格式参数 在 printf/scan

42、f 函数族中函数的参数个数比在格式中确定参数要多。这个信息和告警 558相似,后者断言用户使用过少的格式参数。它接受一个轻微的信息分级,因为附 加的参数被简单地忽略。 1.6.14 720布尔测试中有赋值 在一个分配中发现上下文需要一个布尔。(例如在一个if() 或while() 子句或一个操作数 到 使用错误 在一个形式 if(e);的结构中,发现一个分号在右括号的右边。这可能是没有注意到或对 使用分号结束语句困惑。如果分号被至少一个空格从)分隔,这个信息将被抑制。最好, 把它放置于一个单独的行。参见信息548。 1.6.16722 怀疑 ; 使用错误 在一个形式while(e); 或for

43、(e;e;e);的结构中,发现一个分号在右括号的右边。这可能是 没有注意到或对使用分号结束语句困惑。如果分号被至少一个空格从)分隔,这个信息 将被抑制。最好,把它放置于一个单独的行。 1.6.17723怀疑使用错误 一个预处理定义以一个= 符号开始。例如: #define LIMIT = 50 这是故意的吗?或者是程序员当他写这些的时候他想起分配。 1.6.18 725期望从当前位置积极缩排 从指示行发现当前行被积极缩排。后面的相应子句引入的控制结构和语句和其它控制子 句和它的范围内的括号被期望有少点的缩排。如果你的程序中的tab的值不是 8个空格, 你可以使用 -t 选项 (见章节 11.3

44、缩排检查 ) 1.6.19726多了无关的逗号 在一个枚举中,一个逗号跟着一个右括号,这不是一个有效的ANSI 结构。逗号被忽略。 1.6.20727符号Symbol (Location) 没有明确地初始化 static变量(函数的局部变量 ) 在使用前没有被明确地初始化。下面的评论适用于信息 728、729、727。 “没有明确地初始化”我们的意思是:在目标的定义中没有初始化 器存在,没有直接分配到目标、没有地址操作符用于目标,或如果取目标的地址,它分 配一个指针到 const 。这些信息不是必要的信号错误, 因为对 static 变量隐含地初始化是 零。但是,信息对指出你忘记初始化一个值有

45、帮助。要从信息中吸取最大益处,我们建 议你对那些你希望初始化为零的变量使用明确地初始化。例如: static int n = 0; 对那些需要动态初始化的变量,不要使用明确地初始化,例如: static int m; 对任何数组、结构或联合,如果没有成员或元素被分配一个值,这个信息将被发布。 1.6.21728符号Symbol (Location) 没有明确地初始化 模块内的变量 (文件范围的static 变量) 没有被明确的初始化。 见在信息727 中更多的 细节。 1.6.22729符号Symbol (Location) 没有明确地初始化 模块内的变量 (外部变量 ) 没有被明确的初始化。

46、见在信息727 中更多的细节。 这个信 息对单元检查是被抑制的。 1.6.23730函数的变量为布尔型 一个布尔被用于作为一个函数的参数。这是故意的吗?或是程序员被一个独特的复杂的 条件语句迷惑了。有经验的C程序员经常抑制这个信息。这个信息仅仅针对如果相关的 参数不被声明为 bool。 1.6.24 731布尔型变量使用了= or != 一个布尔被用于作为 = 或!=的参数。例如: if( (a b) = (c d) ) . 判断是否不等式有同样的值。这可能是一个错误,因为是一个不寻常的使用一个布尔 (见告警503 和514) ,但它可能是故意的,因为这是唯一的方式去有效地获得等值。 因为可能

47、的使用, 结构被给出为一个相关的轻微的情报分级。如果布尔参数被转换为其 它类型,信息不会被给出。 1.6.25732符号位丢失(Context) (Type to Type) 从一个有符号量分配(或隐含分配)到一个无符号量。而且,不能决定这个有符号量没 有符号。例如: u = n; /* Info 732 */ u = 4; /* OK */ 这里u 是一个无符号的, 而n 不是,只是对第一个分配授权这个信息,即使常量4 是 名义上地一个有符号的int。确保这不是一个错误(分配的值永远不是一个负值) ,然后 使用一个转换 (到无符号 )来去除这个信息。 1.6.26733把自动变量的地址赋值给

48、外部变量 一个auto 变量的地址仅仅在变量被声明的块内是有效的。这个变量的地址被分配给一 个更长生命期望的变量。做这种事情有内在的危险。 1.6.27734精确度的丢失(Context) (整型之间) - An assignment is being made into an object smaller than an int. The information being assigned is derived from another object or combination of objects in such a way that information could potentially be lost. The number of bits given does not count the sign bit. 例如 if ch is a char and n is an int then: ch = n; will trigger this message whereas: ch = n will not.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1