Java静态代码分析工具.docx
《Java静态代码分析工具.docx》由会员分享,可在线阅读,更多相关《Java静态代码分析工具.docx(14页珍藏版)》请在冰点文库上搜索。
Java静态代码分析工具
Java静态代码分析工具
1.静态代码分析概念
静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数不匹配、有歧义的嵌套语句、错误的递归、非法计算和可能出现的空指针引用等等。
在软件开发过程中,静态代码分析往往先于动态测试之前进行,同时也可以作为制定动态测试用例的参考。
统计证明,在整个软件开发生命周期中,30%至70%的代码逻辑设计和编码缺陷是可以通过静态代码分析来发现和修复的。
但是,由于静态代码分析往往要求大量的时间消耗和相关知识的积累,因此对于软件开发团队来说,使用静态代码分析工具自动化执行代码检查和分析,能够极大地提高软件可靠性并节省软件开发和测试成本。
2.静态代码分析工具的优势
1.帮助程序开发人员自动执行静态代码分析,快速定位代码隐藏错误和缺陷。
2.帮助代码设计人员更专注于分析和解决代码设计缺陷。
3.显著减少在代码逐行检查上花费的时间,提高软件可靠性并节省软件开发和测试成本。
3.Java静态代码分析理论基础和主要技术
1.缺陷模式匹配:
缺陷模式匹配事先从代码分析经验中收集足够多的共性缺陷模式,将待分析代码与已有的共性缺陷模式进行模式匹配,从而完成软件的安全分析。
这种方式的优点是简单方便,但是要求内置足够多缺陷模式,且容易产生误报。
2.类型推断:
类型推断技术是指通过对代码中运算对象类型进行推理,从而保证代码中每条语句都针对正确的类型执行。
这种技术首先将预定义一套类型机制,包括类型等价、类型包含等推理规则,而后基于这一规则进行推理计算。
类型推断可以检查代码中的类型错误,简单,高效,适合代码缺陷的快速检测。
3.模型检查:
模型检验建立于有限状态自动机的概念基础之上,这一理论将被分析代码抽象为一个自动机系统,并且假设该系统是有限状态的、或者是可以通过抽象归结为有限状态。
模型检验过程中,首先将被分析代码中的每条语句产生的影响抽象为一个有限状态自动机的一个状态,而后通过分析有限状态机从而达到代码分析的目的。
模型检验主要适合检验程序并发等时序特性,但是对于数据值域数据类型等方面作用较弱。
4.数据流分析:
数据流分析也是一种软件验证技术,这种技术通过收集代码中引用到的变量信息,从而分析变量在程序中的赋值、引用以及传递等情况。
对数据流进行分析可以确定变量的定义以及在代码中被引用的情况,同时还能够检查代码数据流异常,如引用在前赋值在后、只赋值无引用等。
数据流分析主要适合检验程序中的数据域特性。
4.现有主流Java静态分析工具
1.FindBugs
FindBugs是由马里兰大学提供的一款开源Java静态代码分析工具。
FindBugs通过检查类文件或JAR文件,将字节码与一组缺陷模式进行对比从而发现代码缺陷,完成静态代码分析。
FindBugs既提供可视化UI界面,同时也可以作为Eclipse插件使用。
文本将主要使用将FindBugs作为Eclipse插件。
在安装成功后会在eclipse中增加FindBugsperspective,用户可以对指定Java类或JAR文件运行FindBugs,此时FindBugs会遍历指定文件,进行静态代码分析,并将代码分析结果显示在FindBugsperspective的bugsexplorer中。
FindBugs运用ApacheBCEL库分析类文件(class文件)而不是源代码,将字节码与一组缺陷模式进行对比以发现可能的问题。
FindBugs的检测器已增至300多条,被分为不同的类型,常见的类型如下:
(1)正确性(Correctness):
这种归类下的问题在某种情况下会导致bug,比如错误的强制类型转换等。
(2)最佳实践反例(Badpractice):
这种类别下的代码违反了公认的最佳实践标准,比如某个类实现了equals方法但未实现hashCode方法等。
(3)多线程正确性(Multithreadedcorrectness):
关注于同步和多线程问题。
(4)性能(Performance):
潜在的性能问题。
(5)安全(Security):
安全相关。
(6)高危(Dodgy):
FindBugs团队认为该类型下的问题代码导致bug的可能性很高。
右键单击你要检测的工程、包或文件,-->FindBugs-->FindBugs,check完成后将在BugExplorer视图中看到问题列表,该列表以问题类型组织。
展开列表,双击列表中具体的问题就可以定位的具体的代码行。
配置FindBugs:
选择你的项目,右键=>Properties=>FindBugs=>
DetectorConfiguration选择项:
2.PMD
PMD扫描java代码并寻找潜在的如下问题:
(1)可能的bug-空try/catch/finally/switch语句
(2)无效代码-未使用的变量,参数和私有方法
(3)非最佳的代码-较耗费资源的String/StringBuffer用法
(4)过于复杂的表达式-不必要的if语句,或应该为while的for循环
(5)重复代码-复制/粘贴代码意味着复制/粘贴bug
PMD的配置:
测试结果:
用CPD捕捉代码重复:
Eclipse的PMD插件提供了一项叫做CPD(或复制粘贴探测器)的功能,用于寻找重复的代码。
为在Eclipse中使用这项便利的工具,需要安装具有PMD的Eclipse插件,该插件具有CPD功能。
为寻找重复的代码,请用右键单击一个Eclipse项目并选择PMD|FindSuspectCutandPaste,如图所示:
靠人工来寻找重复的代码是一项挑战,但使用像CPD这样的插件却能在编码时轻松地发现重复的代码。
3.CheckStyle
CheckStyle能够帮助Java开发人员准守某些编码规范的工具。
它能够自动检查代码。
CheckStyle主要检查的内容有:
Java注释、命名约定、标题、Import语句、大小检查、空白、修饰符、块、代码问题、类设计和混合检查。
CheckStyle默认的规范检查文件是SunChecks,还有另外一个SunChecks(Eclipse)可选,从配置文件的结构看,结构几乎是一模一样的,只不过SunChecks(Eclipse)的规范比SunChecks更严格。
一般SunChecks的检查项限定得较为严格,我们实际项目中并不要求那么完美的编程规范,那么可以自己定义检查的配置文件,最后将CheckStyle的配置文件设定为我们自定义的文件即可。
也可以在现有的配置文件中根据需求增加和删除相应的模块。
4.Eclipse提供一种叫做Metrics的插件,使用该插件可以进行许多有用的代码度量,包括圈复杂度度量。
安装Metrics插件并重启Eclipse;然后遵循下列步骤:
右键单击您的项目并选择Properties菜单。
在结果窗口中,选择EnableMetricsplugin复选框并单击OK,如图所示:
从Eclipse中选择Window菜单打开Metrics视图,然后选择ShowView|Other...。
选择Metrics|MetricsView打开如图13中显示的窗口。
您需要使用Java透视图并重新构建项目,从而显示这些度量值。
EclipseMetrics插件还提供了许多功能强大的度量值,有助于您在开发软件的过程中改进代码——可见,它是一个渐进编程意义上的插件!
5.JDepend
JDepend是一个开源的工具,并配有Eclipse插件,在实际应用中,JDepend遍历所有的Java代码目录,自动生成每个Package的依赖性度量。
对于可扩展性、可重用性和可管理性,JDepend可自动度量一个设计在以上三个方面的质量。
CC:
具体类数量
AC:
抽象类(和接口)数量
Ca:
被分析package的类所依赖的其他package的数量,用于衡量package的独立性。
即它调用了多少其他包。
Ce:
被分析package的类所依赖的其他package的数量,用于衡量package的独立性。
即它调用了多少其他包。
A:
被分析package中的抽象类和接口与所在package所有类数量的比例,取值范围为0-1。
I:
I=Ce/(Ce+Ca),用于衡量package的不稳定性,取值范围为0-1。
I=0表示最稳定,I=1表示最不稳定。
即如果这个类不调用任何其他包,则它是最稳定的。
D:
被分析package和理想曲线A+I=1的垂直距离,用于衡量package在稳定性和抽象性之间的平衡。
理想的package要么完全是抽象类和稳定(x=0,y=1),要么完全是具体类和不稳定(x=1,y=0)。
取值范围为0-1,D=0表示完全符合理想标准,D=1表示package最大程度地偏离了理想标准。
即你的包要么全是接口,不调用任何其他包(完全是抽象类和稳定),要么是具体类,不被任何其他包调用。
6.JS工具:
Aptana:
Aptana中的智能提示称为CodeAssist,相当于VS中的Intellisense。
具有浏览器兼容性的提示
不仅仅是javascript,智能提示的范围还包括DOM1,2forHTML,CSS。
Doumentoutline(文档结构)CSS、HTML、JS统一显示:
JSEclipse:
可以在eclipse里面调试javascript,但是找不到下载地址了。
JCSC