静态源代码测试工具之pc-link,pmd,logiscope,purify.doc_第1页
静态源代码测试工具之pc-link,pmd,logiscope,purify.doc_第2页
静态源代码测试工具之pc-link,pmd,logiscope,purify.doc_第3页
静态源代码测试工具之pc-link,pmd,logiscope,purify.doc_第4页
静态源代码测试工具之pc-link,pmd,logiscope,purify.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PC-Lint是一个历史悠久,功能异常强劲的静态代码检测工具。经过这么多年的发展,它不但能够监测出许多语法逻辑上的隐患,而且也能够有效地帮你提出许多程序在空间利用、运行效率上的改进点,在很多专业级的软件公司,比如Microsoft, PC-Lint检查无错误无警告是代码首先要过的第一关,url=javascript:;个人/url觉得,对于小公司和个人开发而言,PC-Lint也非常重要,因为基于开发成本考虑,小公司和个人往往不能拿出很多很全面的url=javascript:;测试/url,这时候,PC-Lint的强劲功能可以很好地提高软件的质量。 C语言的灵活性带来了代码效率的提升,但相应带来了代码编写的随意性,另外C编译器不进行强制类型检查,也带来了代码编写的隐患。PCLint识别并报告C语言中的编程陷阱和格式缺陷的发生。它进行程序的全局分析,能识别没有被适当检验的数组下标,报告未被初始化的变量,警告使用空指针,冗余的代码,等等。软件除错是软件项目开发成本和延误的主要因素。PClint能够帮你在程序动态测试之前发现编码错误。这样消除错误的成本更低。 使用PC-Lint在代码走读和url=javascript:;单元测试/url之前进行检查,可以提前发现程序隐藏错误,提高代码质量,节省测试时间。并提供编码规则检查,规范软件人员的编码行为。功能1) PC-Lint是一种静态代码检测工具,可以说,PC-LINT是一种更加严格的编译器,不仅可以象普通编译器那样检查出一般的语法错误,还可以检查出那些虽然完全合乎语法要求,但很可能是潜在的、不易发现的错误。2) PC-lint不但可以检测单个文件,也可以从整个项目的角度来检测问题,因为C语言编译器固有的单个编译,这些问题在编译器环境下很难被检测,而PC-Lint在检查当前文件的同时还会检查所有与之相关的文件,可想而知,它会对我们有很大的帮助。3) PC-lint支持几乎所有流行的编辑环境和编译器,比如Borland C+从1.x到5.x各个版本、Borland C+ Build、GCC、VC,VC.net、watcom C/C+、Source insight、intel C/C+等等,也支持16/32/64的平台环境。4) 支持Scott Meyes的名著(Effective C+/More Effective C+)中说描述的各种提高效率和防止错误的方法。下面主要介绍了将PC-Lint集成到VC+6.0和SourceInsight的方法和步骤。(一)Windows下C/C+开发工具中,VC6使用较为普遍,因此这里先讲下VC6.0环境中集成pclint的步骤.首先,当然要下载软件,正版软件要200多$呢,买不起!所以只好网上找免费的拉。从/down/othe/pclint.rar处可以下载到一个8.0版本的pclint.1.将pclint.rar解压至c:, 这样lint文件就位与c:pclint(安装目录)下了。2.将c:pclintlnt 下的3个文件lib-w32.lnt,env-vc6.lnt,co-msc60.lnt拷贝至c:pclint下,再在安装目录下创建std.lnt和options.lnt两个文件,其中std.lnt的内容如下/ contents of std.lntc:pclintco-msc60.lntc:pclintlib-w32.lntc:pclintoptions.lnt-si4 -sp4-iD:Program Files;D:Program FilesMicrosoft Visual StudioVCArray8Include/end其中-i后面的路径名为VC的安装路径和VC Include 文件路径,根据自己的修改便可。options.lnt 内容可为空,为定制内容,以后需要时再添加。准备url=javascript:;工作/url做完了,下一步就是要将pclint集成到VC6中去,先配置lint使之能对单个C或C+文件进行检查。1.打开VC6,tools-customize-tools 新建一个名为pclint的项,在下面填入command:C:pclintlint-nt.exearguments:-u c:pclintstd.lntc:pclintenv-vc6.lnt$(FilePath)Use Output Window打上勾close 完成。 这个在你VC窗口tools菜单下应该多了一个pclint选项,可以用它来运行lint程序,对你的c/c+代码进行静态检查了。现在就可以用个小程序测试一下pclint了/test1.cpp#includeclass Xint *p;public:X() p = new int20; void init() memset( p, 20, a); X() delete p; ;编译这个文件,看下你的编译器给你多少警告,再运行下lint, 可以自己对比一下。我的机器上,VC产生0 errors 0 warnings, 而lint程序产生了如下8条警告信息,有些还是很有用处的提示,这里就不一一分析了.url=javascript:;test/url.cpp(12): error 783: (Info - Line does not end with new-line)test.cpp(7): error 1732: (Info - new in constructor for class X which has noassignment operator)test.cpp(7): error 1733: (Info - new in constructor for class X which has nocopy constructor) memset( p, 20, a); test.cpp(Array): error 66Array: (Warning - Possible data overrun for functionmemset(void *, int, unsigned int), argument 3 (size=Array7) exceeds argument 1(size=80) Reference: test.cpp: lines 7, Array)test.cpp(7): error 831: (Info - Reference cited in prior message)test.cpp(Array): error 831: (Info - Reference cited in prior message) delete p; test.cpp(11): error 424: (Warning - Inappropriate deallocation (delete) fornew data)- Wrap-up for Module: test.cpptest.cpp(2): error 753: (Info - local class X (line 2, file test.cpp) notreferenced)Tool returned code: 82.通常一个VC项目中包含多个C或C+文件,有时需要同时对这一系列的文件进行lint检查,我们可以通过配置一个pclint_project来达到目的。和前面第一步中的方法基本一样,不过这里我们需要用到unix中的find等命令来查找当前目录下的C和C+文件,然后再将它们送给lint程序处理,所以得先从http:/www.weihenstephan.de/syring/win32/UnxUtils.zip下载UnxUtils.zip.接着按下列步骤进行:(i)解压UnxUtils.zip至c:unix下, 可以看到C:unixusrlocalwbin有很多unix下的命令,等下会用到(ii)打开VC6,tools-customize-tools新建一个名为pclint_project的项,只不过下面的commands和arguments内容不同。commands: C:unixusrlocalwbinfind.exearguments: $(FileDir) -name *.c-o -name *.cpp | C:unixusrlocalwbinxargslint-nt -ic:unixusrlocal-u c:pclintstd.lntc:pclintenv-vc6.lnt(iii)Use Output Window打上勾,close退出。好了,这时VCtools菜单下应该又多了一个pclint_project项了,你以后可以用它来对一个VC项目运行lint检查程序了.(二)SourceInsight中集成pclint程序的方法.Windows平台下也有好多人都喜欢用SourceInsight编辑C/C+程序,如果将pclint集成到SourceInsight中,那就相当于给SourceInsight增加了一个C/C+编译器,而且它的检查更严格,能发现一些编译器发现不了的问题,可以大大减少程序中潜伏的BUG。这样的话,相信更多人会喜欢SourceInsight这个工具了。下面简要地介绍下pclint集成到SourceInsight中的方法有了上面VC中集成pclint的经验, 下面的事情就应该比较轻松了,(a)打开你的SourceInsight, 选择Options-Custom Commands-Add, 输入pclint(当然名字可以随便).(b) Run中输入: c:pclintlint-nt-uc:pclintstd.lntc:pclintenv-vc6.lnt %f(c)Dir留空,将Iconic Window, Capture Output, Parse Links in OutPut, File,then Line四项前打上勾。(d)然后点右侧 Menu-Menu-View-, 右侧Insert, OK.(e)此时在SourceInsight中的View菜单下多了个pclint选项,可以用它来对单个C/C+文件进行静态检查。用类似的方法可以配置对一个SourceInsight工程文件的lint检查。(a)打开你的SourceInsight, 选择Options-Custom Commands-Add,输入pclint_project(当然名字可以随便).(b) Run中输入: C:unixusrlocalwbinfind.exe %d -name *.c-o -name *.cpp|C:unixusrlocalwbinxargs lint-nt-iC:unixusrlocal -u c:pclintstd.lntc:pclintenv-vc6.lnt(c)Dir留空,将Iconic Window, Capture Output, Parse Links in OutPut, File,then Line四项前打上勾。(d)然后点右侧 Menu-Menu-View-, 右侧Insert, OK.(e)此时在SourceInsight中的View菜单下多了个pclint_project选项,可以用它来一个工程中的C/C+文件进行静态检查。 软件除错是软件项目开发成本和延误的主要因素,PC-lint能够帮你在程序动态测试之前发现编码错误,降低软件消除错误的成本。使用PC-Lint在代码走读和单元测试之前进行检查,可以提前发现程序隐藏错误,提高代码质量,节省测试时间。另外,使用PC-lint的编码规则检查,可以有效地规范软件人员的编码行为。如果能够在软件开发过程中有效地使用PC-lint代码检查工具,将大大地提高代码质量,降低软件成本。参考文献1 Gimpel Software. Reference Manual for PC-lint/FlexeLint. July,20012 PC-Lint选项详解附录一 PC-Lint 重要文件说明Msg.txt :解释告警的内容。options.lnt :反映全局编译信息显示情况的选项文件,通常需要添加自定选项以使代码检查更为严格。env-xx.lnt :讲述如何将PC-lint与对应的编辑环境结合起来,xx是si表示是为Source Insight配置的检查环境,xx是vc6则表示是为Visual C+ 6.0准备的检查环境。co-xxx.lnt :选定的编译器与库选项。std.lnt :标准配置文件,包含内存模型等全局性东西。lib-xxx.lnt :库类型的列表,包括标准C/C+库,MFC库,OWL库等等。au-xxx.LNT :C+编程提出过重要建议的作者,选择某作者后,他提出的编程建议方面的选项将被打开。附录 二 错误信息禁止选项说明命令格式 说明 代码中的举例-e# 隐藏某类错误 /*lint -e725 */-e(#) 隐藏下一表达式中的某类错误 /*lint e(534) */ printf(“its all”);!e# 隐藏本行中的错误 /*lint !e534*/ printf(“its all”);-esym(#, Symbol) 隐藏有关某符号的错误 /*lint esym(534, printf)*/ printf(“its all”);-elib(#) 隐藏头文件中的某类错误 /*lint elib(129) */ #include “r01.h”-efunc(#, ) 隐藏某个函数中的特定错误 /*lint efunc(534, mchRelAll)*/ unsigned int mchRelAll(mchHoData *pHoData) printf(“its all”); 附录 三 PC-Lint检测中的常见错误错误编码 错误说明 举例40 变量未声明506 固定的Boolean值 char c=3; if(c B) return TRUE; else return FALSE; return FALSE;529 变量未引用 检查变量未引用的原因530 使用未初始化的变量534 忽略函数返回值539 缩排格式错误545 对数组变量使用& char arr100, *p; p=&arr;603 指针未初始化 void print_str(const char *p); char *sz; print_str(sz);605 指针能力增强 void write_str(char *lpsz); write_str(“string”);613 可能使用了空指针616 在switch语句中未使用break;650 比较数值时,常量的范围超过了 if( ch = 0xFF ) . 变量范围713 把有符号型数值赋给了无符号型 数值715 变量未引用725 Indentation错误734 在赋值时发生变量越界 int a, b, c; c=a*b;737 无符号型变/常量和有变量型 变/常量存在于同一个表达式中。744 在switch语句中没有default752 本地声明的函数未被使用762 函数重复声明774 Boolean表达式始终返回真/假 char c; if(c java -jar .libpmd-4.2.1.jar D:ebsserviceebsservicesrc text rulesets/unusedcode.xml输出结果类如:D:ebsserviceebsservicesrccomsinosoftservicepolicyebsSMPolicyInput.java:51Avoid unused private fields such as logger.D:ebsserviceebsservicesrccomsinosoftservicepolicyebsSMPolicyShow.java:25Avoid unused private fields such as logger.D:ebsserviceebsservicesrccomsinosoftservicepolicyebsSMQueryPolicyByPolicyNo.java:32Avoid unused local variables such as visaStatus.D:ebsserviceebsservicesrccomsinosoftservicepolicyebsSMQueryPolicyByPolicyNo.java:44Avoid unused local variables such as temp.D:ebsserviceebsservicesrccomsinosoftservicepolicyebseriskESMPolicyInput.java:28Avoid unused private fields such as logger.D:ebsserviceebsservicesrccomsinosoftservicepolicyebsjriskJSMPolicyInput.java:22Avoid unused private fields such as logger.一些可以加载必须参数前面或者后面的可选参数如下:-debug:打印debug日志信息-targetjdk:指定目标源代码的版本- 1.3, 1.4, 1.5, 1.6 or 1.7;默认是1.5-cpus:指定创建的线程数-encoding:指定PMD检查的代码的编码方式-excludemarker:指定PMD需要忽略的行的标记,默认为NOPMD-shortnames:在报告中显示缩短的文件名-linkprefix: HTML源文件的路径,只是为了HTML显示-lineprefix:自定义的锚,用于影响源文件中的行,只是用于HTML显示-minimumpriority:规则的优先级限制,低于优先级的规则将不被使用-nojava:不检查java文件,默认是检查java文 件-jsp:检查JSP/JSF文件,默认不检查-reportfile:将报告输出到文件,默认是打印在控制台-benchmark:输出一个基准清单,默认输出到控制台-xslt:覆盖默认的xslt-auxclasspath:指定源代码文件使用的类路径例如在windows系 统中,例子如下:c: java -jar pmd-4.2.1.jar c:mysourcecode text unusedcode,imports -targetjdk 1.5 -debugc: java -jar pmd-4.2.1.jar c:mysourcecode xml basic,design -encoding UTF-8c: java -jar pmd-4.2.1.jar c:mysourcecode html typeresolution -auxclasspathcommons-collections.jar;derby.jar在Eclipse中安 装PMD插件 运行方式PMD可 以作为插件集成到很多流行的IDE中,很多的插件中都包含了PMD的jar文件,这个jar文件中包含了规则集。所以虽然一 些插件中使用rulesets/unusedcode.xml来作为参数引用规则集,但是实际上是 使用getResourceAsStream()方法来从PMD的jar文件中加载。由于Eclipse是比 较流行的开源Java/J2EE开发IDE, 所以本文主要介绍如何在Eclipse中使用PMD工 具进行代码的检查。安装基于EclipseIDE的 插件安装Eclipse的PMD插件的过程如下:?启 动Eclipse?选 择Help-Software Updates-Find and Install?选 择Next,选择New remote site?在Name框中输入PMD,URL框中输入/eclipse?在 之后的对话框中一直点击下一步或者接受协议,完成Eclipse的PMD插件的安装也可以通过下载最新的zip文件按,然后执行上述过程,只是使用New locale site来代替New remote site,并使用下载的zip文件。可以通过Windows-Preferences来 配置PMD。通过右键一个项目, 然后选择PMD-Check node with PMD,即可使用PMD工具检查代码。如果要进行重复代码检测,那么右键一个项目后,选择PMD-Find suspect cut and paste。检查结果会放在reports目录 下,文件名为cpd-report.txt。可以通过使用Eclipse的 帮助系统来查看PMD插件的文档。在安装完更新后,如果发生了一个异常,例如”java.lang.RuntimeException: Could not find that class xxxx”, 这时试着删除workspace中的.metadata/plugins/net.sourceforge.pmd.eclipse目 录下的ruleset.xml文件。使用PMD1、启动Eclipse IDE,打开工程,选择Windows-Preferences下 的PMD项,其中Rules Configuration项目可以配置PMD的检查规则,自定义检查规则也可以在此通过Import的方式导入到PMD中2、配置好后,鼠标右键点击工程中需要检查的JavaSource,选择PMD-Check Code With PMD ,之后PMD就会通过规则检查你的JavaSource了并且将信息显示在PMD自己的视 图上3、示例import java.util.*;public class Test public static void main(String args) tryif(true)System.out.println(Hello World!);catch(Exception e) 以上 代码PMD会检查出:catch块中没有内 容、if判断块中没有内容、代码中出现System.out.println等 警告描述使用Ant进行调用下面是主要的Ant配置 信息rulesets/favorites.xml用Ant命令运行build.xml,PMD就会按照你设定好的规则自动执行代码检查了。关于PMD规 则选择合适的规则运行所有的规则集中的规则会产生非常多的冲突,这些冲突中的很多是不重要的。在 这么多的冲突中寻找你关心的部分结果就没有什么效率可言了。所以需要从明显的规则集,也就是说必须要改的地方开 始是比较好的一个选择,例如只是运行unusedcode检查,然后修改没有使用的局部变量和成员 变量。然后运行基本的检查,修改所有的空语句,例如if语句等。最后可以执行与设计相关的 或者存在一定争议的规则集,或者自定义的规则集。自带规则的介绍: (PMD插 件分析代码规则(中文).xls)PMD自带了很多规则集合,并且分类写入不同的ruleset文件,如Basic包含每人都必须遵守的代码最佳实践,如EmptyCatchBlockBraces关于条件分支的规则,如IfStmtsMustUseBracesCode Size关于代码大小的规则,如方法的长度,参数的长度,属性的个数等Clone克隆实现的规则,如是否有super.clone()Controversial一些有争议的规则,如UnnecessaryConstructor不必要的 构造器Coupling对象连接有关的规则Design可以检查有问题的设计,如SwitchStmtsShouldHaveDefaultFinalizers使用finalizers时需遵循的规则,如FinalizeOnlyCallsSuperFinalizeImport Statements和import有 关的规则,如DuplicateImports重复importJ2EE唯一规则UseProperClassLoader,class.getClassLoader()可能不正确,用Thread.currentThread().getContextClassLoader()代替Javabeans和javabean规范有关的规则,有BeanMembersShouldSerialize属 性必须序列化和MissingSerialVersionUID缺 少序列化IDJUnit Tests和JUnit测试有关的,如JUnitSpelling拼 写检查等Logging (Java)检查Logger的一些错误用法,如MoreThanOneLogger多 个LoggerLogging (Jakarta)使用Jakarta Logger的一些规则,有UseCorrectExceptionLogging异常处理不当和ProperLogger是 否正确定义LoggerMigratingJDK版本移植的规 则,如ReplaceVectorWithList用List代 替VectorNaming和命名有关的规则,名称太短或太长,命名的约定等PMD检查java源文件中的潜在问题。主要包括: 空try/catch/finally/switch语句块 未使用的局部变量、参数和private方法 空if/while语句 过于复杂的表达式,如不必要的if语句等 复杂类Logiscope概述LOGISCOPE是法国Telelogic公司推出的专用于软件质量保证和软件测试的产品。其主要功能是对软件做质量分析和测试以保证软件的质量,并可做认证、反向工程和维护,特别是针对要求高可靠性和高安全性的软件项目和工程。本产品应用于软件的整个生命周期,它贯穿于软件需求分析阶段设计阶段-代码开发阶段-软件测试阶段(代码审查、单元/集成测试和系统测试)-软件维护阶段的质量验证要求。在设计和开发阶段,使用LOGISCOPE可以对软件的体系结构和编码进行确认。可以在尽可能的早期阶段检测那些关键部分,寻找潜在的错误,并在禁止更改和维护工作之前做更多的工作。在构造软件的同时,就定义测试策略。可帮助编制符合企业标准的文档,改进不同开发组之间的交流;在测试阶段用LOGISCOPE,使测试更加有效。可针对软件结构,度量测试覆盖的完整性,评估测试效率,确保满足要求的测试等级。特别是,LOGISCOPE还可以自动生成相应的测试分析报告;在软件的维护阶段,用LOGISCOPE验证已有的软件是否是质量已得到保证的软件,对于状态不确定的软件,LOGISCOPE可以迅速提交软件质量的评估报告,大幅度地减少理解性工作,避免非受控修改引发的错误。本产品的最终目的是评估和提高软件的质量等级,采用基于国际间的标准度量方法(如Halstead、McCabe等)的质量模型对软件进行分析,从软件的编程规则,静态特征和动态测试覆盖等多个方面,量化地定义质量模型,并检查、评估软件质量。 LOGISCOPE 获取ISO/IEC9126 定义的Quality Characteristics

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论