• 会员登陆 | 会员注册
  • 返回首页
    当前位置: 淮北教育 > 淮北成教 >

    博客频道

    时间:2013-03-23 17:54来源:未知 作者:admin 点击:
    关键词:代码检查 PC-Lint 规则 选项 ,大半是由员工自行采购,之后再带入职场使用。其中84%拥有平板电脑的小型企业选择了iPad。这似乎印证了业内所分析的企业的 普通消费者化 是推动企业接受iPad的主要原因之一。而苹果COO蒂姆库克则表示,企业的首席信息官
      

    关键词:代码检查 PC-Lint 规则 选项

    ,大半是由员工自行采购,之后再带入职场使用。其中84%拥有平板电脑的小型企业选择了iPad。这似乎印证了业内所分析的企业的 普通消费者化 是推动企业接受iPad的主要原因之一。而苹果COO蒂姆库克则表示,企业的首席信息官们正意识到,提高员工效率,博客频道,使员工更具创新能力远比使员工使用统一的设备更加重要。而企业员工可以携带自己的设备用于工作,收发电子邮件,使用企业级应用将给iPad带来更多的市场机会。

    这是一段C代码,可以通过大多数常见的C语言编译器的检查,但是PC-Lint能够发现其中的错误和潜在的问题:第8行向name数组赋 时丢掉了结尾的nul字符,第10行的乘法精度会失准,即使考虑到long比int的字长更长,由于符号位的原因仍然会造成精度失准,第11行的比较有问题,第14行的变量k没有初始化,第15行的kk可能没有被初始化,第22行的result也有可能没有被初始化,第23行返回的是一个局部对象的地址。 随着C 语言的出现,C/C 编译器有了更严 的语法检查,但是仍然不能避免出现有BUG的程序。C 的类型检查依然不如Pascal那么严 。对于一个小程序,多数程序员都能够及时发现上面出现的错误,但是从一个拥有成千上万行代码的大型软件中找出这些瑕疵将是一项烦琐的工作,而且没有人可以保证能找出所有的这类问题。如果使用PC-Lint,只需通过一次简单的编译就可以检查出这些错误,这将节省了大量的**时间。从某种意义上说。PC-Lint是一种更加严 的编译器,它除了可以检查出一般的语法错误外,还可以检查出那些虽然符合语法要求,但很可能是潜在的、不易发现的错误。

    最后,让iPad冲击波得以延续的就是苹果的创新。也许有人在此会说,又是这种老调重弹,没摘要:C/C 语言的语法拥有其它语言所没有的灵活性,这种灵活性带来了代码效率的提升,但相应增加了代码中存在隐患的可能性。静态代码检查工具PC-Lint则偏重于代码的逻辑分析,它能够发现代码中潜在的错误,比如数组访问越界、内存泄漏、使用未初始化变量等。本文将介绍如何安装和配置PC-Lint代码检查工具以及如何将PC-Lint与常见的代码编辑软件集成。

    三 PC-Lint的代码检查功能 PC-Lint能够检查出很多语法错误和语法上正确的逻辑错误,PC-Lint为大部分错误消息都分配了一个错误号,编号小于1000的错误号是分配给C语言的,编号大于1000的错误号则用来说明C 的错误消息。表 1 列出了PC-Lint告警消息的详细分类:

    //lint -s**ong(Ab,Bool) 选项是以注释的形式插入代码中 typedef int Bool; Bool gt(int a, b) { if(a) ret**n a b; // OK else ret**n 0; // Warning }例子代码中Bool被声明成强类型,如果没有指定b选项,第一个ret**n**中的比较*作就会被认为与函数类型不匹配。第二个ret**n**导致告警是因为0不是各Bool类型,如果添加c选项,例如-s**ong(Acb,Bool),这个告警就会被抑制。再看一个例子:/*lint -s**ong( AJXl, STRING ) */ typedef char *STRING; STRING s;s = malloc(20); s**cpy( s, abc );

    以C语言为例,其中的编号 指的是一般编译器也会产生的语法错误;编号 是PC-Lint程序内部的错误,这类错误不会出现在代码中的;编号 指的是由于内存限制等导致的**致命错误。编号 中出现的提示信息,是根据隐藏代码问题的可能性进行分类的:其中编号 指的是被检查代码中很可能存在问题而产生的告警信息;编号 中出现的信息,产生错误的可能性相比告警信息来说级别要低,但仍然可能是因为代码问题导致的问题。编号 是可选信息,他们不会被默认检查,除非你在选项中指定检查他们。 PC-Lint/FelexLint提供了和许多编译器类 的告警级别设置选项-wLevel,它的告警级别分为以下几个级别,缺省告警级别为3级: -w0 不产生信息(除了遇到致命的错误) -w1 只生成错误信息没有告警信息和其它提示信息 -w2 只有错误和告警信息 -w3 生成错误、告警和其它提示信息(这是默认设置) -w4 生成所有信息 PC-Lint/FelexLint还提供了用于处理函数库的头文件的告警级别设置选项-wlib(Level),这个选项不会影响处理C/C 源代码模块的告警级别。它有和-wLevel相同的告警级别,缺省告警级别为3级: -wlib(0) 不生成任何库信息 -wlib(1) 只生成错误信息(当处理库的源代码时) -wlib(2) 生成错误和告警信息 -wlib(3) 生成错误、告警和其它信息(这是默认设置) -wlib(4) 产生所有信息 PC-Lint的检查分很多种类,有强类型检查、变量 跟踪、语义信息、赋 顺序检查、弱定义检查、 式检查、缩进检查、const变量检查和volatile变量检查等等。对每一种检查类型,PC-Lint都有很多详细的选项,用以控制PC-Lint的检查效果。PC-Lint的选项有300多种,这些选项可以放在注释中(以注释的形式插入代码中),例如: /*lint option1 option2mentary */ 选项可以有多行 //lint option1 option2mentary 选项仅为一行(适用于C ) 选项间要以空 分开,lint命令一定要小写,并且紧跟在/*或//后面,不能有空 。如果选项由类 于*作符和*作数的部分组成,例如-esym(534, p**ntf, scanf, ******** new),其中最后一个选项是******** new,那么在********和new中间只能有一个空 。PC-Lint的选项还可以放在宏定义中,“名校独大” 谁是择校屡禁不止。,当宏被展开时选项才生效。例如: #define DIVZERO(x) /*lint -save -e54 */ ((x) /0) /*lint -restore */ 允许除数为0而不告警 下面将分别介绍PC-Lint常用的,也是比较重要的代码检查类型,并举例介绍了各个检查类型下可能出现的告警信息以及常用选项的用法:

    苹果iPad所引发的 普通消费者化 让iPad从消费市场走向企业市场

    表 2 强类型检查s**ong选项和参数表A 对强类型变量赋 时进行类型检查,这些赋 **包括:直接赋 、返回 、参数传递、初始化A参数后面可以跟以下字符,用来弱化A的检查强度: i 忽略初始化 r 忽略Ret**n** p 忽略参数传递 a 忽略赋 *作 c 忽略将常量赋 (包括整数常量、常量字符串等)给强类型的情况 z 忽略Zero赋 ,Zero定义为任何非强制转换为强类型的0常量。例如:0L和(int)0都是Zero, 但是(HANDLE)0当HANDLE是一个强类型的时候就不是Zero。(HANDLE *)0也不是例如使用-s**ong(Ai,BITS)设置,PC-Lint将会对从非BITS类型数据向BITS类型数据赋 的代码发出告警,但是忽略变量初始化时的此类赋 。X当把强类型的变量赋指给其他变量的时候进行类型检查。弱化参数i, r, p, a, c, z同样适用于X并起相同的作用。J 选项是当强类型与其它类型进行如下的二进制*作时进行检查,下面是J的参数: e 忽略==、!=和?:*作符 r 忽略 、 =、 和 = o 忽略 、-、*、/、%、|、 忽略该强类型与常量进行以上*作时的检查 z 忽略该强类型与Zero进行以上*作时的检查

    由于malloc和s**cpy是库函数,将malloc的返回 赋给强类型变量s或将强类型变量s传递给s**cpy时会产生强类型冲突,不过l选项抑制了这个告警。 强类型也可用于位域,出于强类型检查的目的,先假定位域中最长的一个字段是优势Boolean类型,如果没有优势Boolean或位域中没有哪个字段比其它字段长,这个类型从位域被切开的位置开始成为“散”类型,例如://lint -s**ong( AJXb, Bool ) //lint -s**ong( AJX, BitField ) typedef int Bool; typedef unsigned BitField; s**uct foo { unsigned a:1, b:2; BitField c:1, d:2, e:3; } x; void f() { x.a = (Bool) 1; // OK x.b = (Bool) 0; // s**ong type violation x.a = 0; // s**ong type violation x.b = 2; // OK x.c = x.a; // OK 118 x.e = 1; // s**ong type violation x.e = x.d; // OK }

    这些选项字符的顺序对功能没有影响。但是A和J选项的弱化字符必须紧跟在它们之后。B选项和b选项不能同时使用,f选项必须搭配B选项或b选项使用,如果不指定这些选项,-s**ong的作用就是仅仅声明type为强类型而不作任何检查。下面用一段代码演示-s**ong选项的用法:

    3.1 强类型检查 强类型检查选项“-s**ong”和它的辅助(补充)选项“-index”可以对typedef定义的数据类型进行强类型检查,以保证只有相同类型之间的变量才能互相赋 ,强类型检查选项s**ong的用法是: -s**ong( flags[, name]) s**ong选项必须在typedef定义类型之前打开,否则PC-Lint就不能识别typedef定义的数据类型,类型检查就会失效。flags参数可以是A、J、X、B、b、l和f,相应的解释和弱化字符在表 2 中列出:

    一 引言 C/C 语言的语法拥有其它语言所没有的灵活性,这种灵活性带来了代码效率的提升,但相应也使得代码编写具有很大的随意性,另外C/C 编译器不进行强制类型检查,也不做任何边界检查,这就增加了代码中存在隐患的可能性。如果能够在代码提交测试之前发现这些潜在的错误,就能够极大地减轻测试人员的压力,减少软件项目的除错成本,可是传统的C/C 编译器对此已经无能为力,这个任务只能由专用的代码检查工具完成。目前有很多C/C 静态代码检查工具,其中Logiscope RuleChecker和PC-Lint是目前应用比较广泛的两个工具。这两个检查工具各有特色,Logiscope RuleChecker倾向于代码编码规范的检查,比如代码缩进 式、case**书写规范、函数声明和布尔表达式的编写规则等,而PC-Lint则偏重于代码的逻辑分析,它能够发现代码中潜在的错误,比如数组访问越界、内存泄漏、使用未初始化变量等。本文将介绍如何安装和配置PC-Lint代码检查工具以及将PC-Lint与常见的代码编辑软件,如Visual C ,So**ce Insight集成的方法,同时还将简要介绍一些PC-Lint常用的代码检查选项。

    笔者之所以刻意提及iPad在企业中的应用,是因为这之前应该是传统PC(上网本、笔记本和*式PC)的优势领域,如果说之前iPad还是在消费市场与传统PC争夺用户外,那么之前一直安枕无忧的企业市场受到iPad的蚕食恐怕才是PC最大的威胁。除了普通消费者化,目前有的企业已经开始为员工采购iPad作为办公之用。例如按照资产计算,摩根大通是美国第二大银行,仅次于美国银行。摩根大通就为投资银行部门的所有人员免费提供iPad。只要这些员工留在该部门,他们就可以一直使用这些iPad。

    BB选项有两个效果: 1. 出于强类型检查的目的,假设所有的Boolean*作返回一个和Type兼容的类型,所谓Boolean*作就是那些指示结果为**ue或false的*作,包括前面提到的四种关系运算符和两种等于判断符,取反*作符!,二元*作符 2. 在所有需要判断Bolean 的地方,如if**和while**,都要检查结果是否符合这个强类型,否则告警。 例如if(a)当a为int时,将产生告警,因为int与Bolean类不兼容,所以必须改为if(a != 0)。b仅仅假定每一个Bolean类*作符都将返回一个与Type类型兼容的返回 。与B选项相比,b选项的限制比较宽松。l库标志,当强类型的 作为参数传递给库函数等情况下,不产生告警。f与B或b连用,表示抑止对1bit长度的位域是Boolean类型的假定,如果不选该项表示1bit长度的位域被缺省假定为Boolean类型。

    上面的例子中,Te

    目 录 摘 要 1 引 言 2 PC-Lint介绍 3 PC-Lint的代码检查功能 3.1 强类型检查 3.2 变量 跟踪 3.3 赋 顺序检查 3.4 弱定义检查 3.5 式检查 3.6 缩进检查 3.7 const变量检查 3.8 volatile变量检查 4 PC-Lint软件使用方法 4.1 安装与配置 4.2 PC-Lint与常用**工具的集成(Visual C ,So**ce Insight,UEdit) 5 总结 参考文献 附录一 PC-Lint 重要文件说明 附录二 错误信息禁止选项说明 附录三 PC-Lint检测中的常见错误

    使用忽略意味着不会产生告警信息。举个例子,学历,教育,国家,民办,可以,,如果Meters是个强类型,那么它只在判断相等和其他关系*作时才会被正确地检查,其它情况则不检查,在这个例子中使用J选项是正确的。

    上面例子中,淮北中学2012高中招生成员a和c是强类型Bool,成员d和e是BitField类型,b不是强类型。为了避免将只有一位的位域假设成Boolean类型,需要在声明Boolean的-s**ong中使用f选项,上面的例子就应该改成这样:-s**ong(AJXbf,Bool)。

    表 1 列出了PC-Lint告警消息分类错误说明CC 告警级别语法错误1内部错误0致命错误0告警2消息3可选信息4

    二 PC-Lint介绍 PC-Lint是GIMPEL SOF**ARE公司**的C/C 软件代码静态分析工具,它的全称是PC-Lint/FlexeLint for C/C ,PC-Lint能够在Windows、MS-DOS和OS/2平*上使用,以二进制可执行文件的形式发布,而FlexeLint 运行于其它平*,以源代码的形式发布。PC-lint在全球拥有广泛的客户群,许多大型的软件**组织都把PC-Lint检查作为代码走查的第一道工序。PC-Lint不仅能够对程序进行全局分析,识别没有被适当检验的数组下标,报告未被初始化的变量,警告使用空指针以及冗余的代码,还能够有效地帮你提出许多程序在空间利用、运行效率上的改进点。 通过下面的例子就可以看出PC-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 ) { 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 ) ret**n( temp ); 23: else ret**n( name ); 24:}

    另一个强类型检查选项是index,index的用法是: -index( flags, ixtype, sitype [, sitype]) 这个选项是对s**ong选项的补充,它可以和s**ong选项一起使用。这个选项指定ixtype是一个排除索引类型,它可以和S**ongly Indexed类型sitype的数组(或指针)一起使用,ixtype和sitype被假设是使用typedef声明的类型名称。flags可以是c或d,c允许将ixtype和常量作为索引使用,而d允许在不使用ixtype的情况下指定数组的长度(Dimensions)。下面是一个使用index的例子://lint -s**ong( AzJX, Count, Temperat**e ) //lint -index( d, Count, Temperat**e ) // Only Count can index a Temperat**e typedef float Temperat**e; typedef int Count; Temperat**e t[100]; // OK because of d flag Temperat**e *pt = t; // pointers are also checked //within a function Count i; t[0] = t[1]; // Warnings, no c flag for( i = 0; i 100; i ) t[i] = 0.0; // OK, i is a Count 119 pt[1] = 2.0; // Warning i = ptt; // OK, pt-t is a Count
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%
    ------分隔线----------------------------
    最新评论 查看所有评论
    发表评论 查看所有评论
    请自觉遵守互联网相关的政策法规,严禁发布违法言论!
    用户名: 密码: 验证码: