静态工具使用说明书.docx
- 文档编号:29728813
- 上传时间:2023-07-26
- 格式:DOCX
- 页数:28
- 大小:606.54KB
静态工具使用说明书.docx
《静态工具使用说明书.docx》由会员分享,可在线阅读,更多相关《静态工具使用说明书.docx(28页珍藏版)》请在冰豆网上搜索。
静态工具使用说明书
1Findbugs
FindBugs是一个静态分析工具,它检查类或者JAR文件,将字节码与一组缺陷模式进行对比以发现可能的问题。
有了静态分析工具,就可以在不实际运行程序的情况对软件进行分析。
FindBugs中开源项目当中的一个,它可以帮你找到代码中隐藏的一些错误,提升你的代码能力与系统安全可靠性。
FindBugs可以以多种方式运行:
从GUI、从命令行、使用Ant、作为Eclipse插件程序和使用Maven。
我重点介绍GUI、作为Eclipse插件程序和Ant来运行,其他运行方式大家可以根据自己的情况来选定。
使用FindBugs至少需要JDK1.4.0以上版本,FindBugs是平台独立的,可以运行于GNU/Linux、Windows、MacOSX等平台上。
运行FindBugs至少需要有256MB内存,如果你要分析一个很大的项目,那就需要更加多的内存了。
1.1GUI
1.1.1安装
可以下载到最新的版本。
在下载了zip或者tar文件后,将它解压缩到所选的目录中,这样安装就完成了。
1.1.2使用
使用FindBugsUI很直观(bin目录包含了运行FindBugs的批处理文件,进入Findbugs的安装目录,找到bin目录,双击findbugs.bat启动,出现界面运行方式)。
但是有几点值得说明,使用FindBugsUI的一个好处是对每一个检测到的问题提供了说明,对每一种缺陷模式提供了类似的说明,在第一次熟悉这种工具时这是很有用的。
窗口下面的Sourcecode选项卡也同样有用。
如果告诉FindBugs在什么地方寻找代码,它就会在转换到相应的选项卡时突出显示有问题的那一行。
(doc目录下的bugDescriptions.html有所有bug的描述。
)
GUI虽然直观但是不能直接改动还要在程序中寻找相应位置的错误然后进行修改。
具体使用可以参考
启动后出现如下界面:
在菜单View中可以进行界面的切换,ViewProjectDetails和ViewBugs切换
在菜单Settings是对检测的缺陷模式进行选择,ConfigureDetectors可以根据项目的具体情况进行检查规则的取舍。
ArchiveorDirectory:
可以检查zip,jar,ear和war的文件,还可以检查类文件
Sourcedirectory:
可以加入对应zip,jar,ear和war的源文件,可以增加发现Bug的几率,但是如果不加入也可以。
如果加入源文件可以在sourcecode中看到相应位置。
Classpathentry:
如果分析文件时引用的类并不在文档文件或是引入的路径时要加入,可以得到更准确的分析结果,但是不是必须选择项。
第一次使用
(1)File->创建新项目,输入被检查的class或jar路径、java源文件路径及程序运行依赖的class或jar路径
(2) 按【FingBugs】按钮开始检查
(3) 如果出现下图的警告
说明程序运行依赖的class或jar路径不对或依赖文件不完整,应依据警告信息完善。
(4) 按【OK】后即进入上图一的错误信息显示
(5) 选择【file->SaveProject】储存新建的项目
(6) 选择【file->SaveBugs】储存新扫描的Bugs信息(xml文件)
非第一次使用
(1)选择【file->OpenProject】打开上次新建的项目
(2)选择【file->ReloadProject】运行打开的项目
(3)也可以选择【file->LoadBugs】装载储存的Bugs信息来查看
例如:
可以选择一个或多个文件或路径,然后点击FindBugs!
按钮进行检测,如下:
出现的可能Bug可以用很多方式显示,可以看到有两个工程的检查结果,此时可以分析哪些是真的错误,而有些是伪问题
1.2Eclipse插件
1.2.1安装方法:
✓启动Eclipse
✓选择Help-->SoftwareUpdates-->FindandInstall
✓选择Next,选择Newremotesite
✓在Name框中输入FindBugsupdatesite,URL框中输入
✓在之后的对话框中一直点击下一步或者接受协议,完成Eclipse的findbugs插件的安装
1.2.2使用方法:
右击项目或程序名->FindBugs->FindBugs,执行后,会在存在缺陷的代码行标识一个BUG;
打开bugDetails视图:
Windows->ShowView->Other->Findbug->bugDetails和BugExplorer来查看Bugs,如下图:
右击项目或程序名->FindBugs->ClearBugMarkers,执行后,清除缺陷显示。
当然,在代码编辑窗口中,点击带有警告提示信息的图标时,也会自动切换到BudDetails窗口去,查看详细的警告信息。
根据这里详细的信息,你可以得到FindBugs为什么会对你的代码报警告信息,及相应的处理办法,根据它的提示,你可以快速方便地进行代码修改。
在BugExplorer中,双击问题,也会自动切换到代码编辑窗口相应位置,如下图所示:
1.2.3配置FindBugs
选择你的项目,右键=>Properties=>FindBugs
可以配置的信息包括如上图所示的选项的相关设置:
RunFindBugsAutomatically,analysiseffort:
当此项选中后,FindBugs将会在你修改Java类时自动运行,如你设置了Eclipse自动编译开关后,当你修改完Java文件保存,FindBugs就会运行,并将相应的信息显示出来。
当此项没有选中,你只能每次在需要的时候自己去运行FindBugs来检查你的代码。
analysiseffort让你选择分析的级别,有min、default、max三个选择项可以选择,比如:
min选择项:
那么只有是High级别的提示信息才会被显示。
default选择项:
那么只有是Medium和High级别的提示信息才会被显示。
max选择项:
那么所有级别的提示信息都会被显示。
DetectorConfiguration:
在这里你可以选择所要进行检查的相关的BugPattern条目,可以从Detectorid、Bugid(s)、Speed、Category、Description中看到相应的内容,你可以根据需要选择或去掉相应的检查条件。
ReporterConfiguration:
Minimumprioritytoreport:
这个选择项是让你选择哪个级别的信息进行显示,有Low、Medium、High三个选择项可以选择,很类似于Log4J的级别设置,比如:
High选择项:
那么只有是High级别的提示信息才会被显示。
Medium选择项:
那么只有是Medium和High级别的提示信息才会被显示。
Low选择项:
那么所有级别的提示信息都会被显示。
Reported(visible)bugcategories:
是一些显示Bug分类的选择:
Performance:
可能性能不佳的代码
Correctness:
关于一般的正确性问题,可能导致错误的代码
Internationalization:
当对字符串使用upper或lowercase方法,如果是国际的字符串,可能会不恰当的转换
Multithreadedcorrectness:
如果代码公开,可能受到恶意攻击的代码
Badpractice:
一些不好的实践
Maliciouscodevulnerability:
恶意破坏代码相关方面的
Dodgy:
关于具有潜在危险的代码,可能运行期产生错误
Security:
findbugs自带60余种Badpractice,80余种Correntness,1种Internationalization,12种Maliciouscodevulnerability,27种Multithreadedcorrentness,23种Performance,43种Dodgy
列举:
Badpractice:
HE:
类定义了equals(),却没有hashCode();或类定义了equals(),却使用Object.hashCode();或类定义了hashCode(),却没有equals();或类定义了hashCode(),却使用Object.equals();类继承了equals(),却使用Object.hashCode()。
SQL:
Statement的execute方法调用了非常量的字符串;或PreparedStatement是由一个非常量的字符串产生。
DE:
方法终止或不处理异常,一般情况下,异常应该被处理或报告,或被方法抛出。
Correctness一般的正确性问题
可能导致错误的代码,下面列举几个:
NP:
空指针被引用;在方法的异常路径里,空指针被引用;方法没有检查参数是否null;null值产生并被引用;null值产生并在方法的异常路径被引用;传给方法一个声明为@NonNull的null参数;方法的返回值声明为@NonNull实际是null。
Nm:
类定义了hashcode()方法,但实际上并未覆盖父类Object的hashCode();类定义了tostring()方法,但实际上并未覆盖父类Object的toString();很明显的方法和构造器混淆;方法名容易混淆。
SQL:
方法尝试访问一个PreparedStatement的0索引;方法尝试访问一个ResultSet的0索引。
UwF:
所有的write都把属性置成null,这样所有的读取都是null,这样这个属性是否有必要存在;或属性从没有被write。
Internationalization国际化
当对字符串使用upper或lowercase方法,如果是国际的字符串,可能会不恰当的转换。
Maliciouscodevulnerability可能受到的恶意攻击
如果代码公开,可能受到恶意攻击的代码,下面列举几个:
FI:
一个类的finalize()应该是protected,而不是public的。
MS:
属性是可变的数组;属性是可变的Hashtable;属性应该是packageprotected的。
Multithreadedcorrectness多线程的正确性
多线程编程时,可能导致错误的代码,下面列举几个:
ESync:
空的同步块,很难被正确使用。
MWN:
错误使用notify(),可能导致IllegalMonitorStateException异常;或错误的使用wait()。
No:
使用notify()而不是notifyAll(),只是唤醒一个线程而不是所有等待的线程。
SC:
构造器调用了Thread.start(),当该类被继承可能会导致错误。
Performance性能问题
可能性能不佳的代码,下面列举几个:
DM:
方法调用了低效的Boolean的构造器,而应该用Boolean.valueOf(…);用类似
Integer.toString
(1)代替newInteger
(1).toString();方法调用了低效的float的构造器,应该用静态的valueOf方法。
SIC:
如果一个内部类想在更广泛的地方被引用,它应该声明为static。
SS:
如果一个实例属性不被读取,考虑声明为static。
UrF:
如果一个属性从没有被read,考虑从类中去掉。
UuF:
如果一个属性从没有被使用,考虑从类中去掉。
Dodgy危险的
具有潜在危险的代码,可能运行期产生错误,下面列举几个:
BC:
对抽象集合如List、Set的造型;对具体集合如ArrayList、HashSet的造型;
未检查或无法保证的造型;
CI:
类声明为final但声明了protected的属性。
DLS:
对一个本地变量赋值,但却没有读取该本地变量;本地变量赋值成null,却没有读取该本地变量。
ICAST:
整型数字相乘结果转化为长整型数字,应该将整型先转化为长整型数字再相乘。
INT:
没必要的整型数字比较,如X<=Integer.MAX_VALUE。
NP:
对readline()的直接引用,而没有判断是否null;对方法调用的直接引用,而方法可能返回null。
REC:
直接捕获Exception,而实际上可能时RuntimeException。
ST:
从实例方法里直接修改类变量,即static属性。
1.3Ant
1.4FindBugs可以做什么
FindBugs提供了35个检测器来检测字节码中可能的缺陷。
可以做的事情主要有:
1.4.1找出hashequals不匹配
找与equals()和hashCode()的实现相关的几个问题。
这两个方法非常重要,因为几乎所有基于集合的类---List、Map、Set等都调用它们。
一般来说,这个检测器寻找两种不同类型的问题:
①当一个类重写对象的equals()方法,但是没有重写它的hashCode方法,或者相反的情况时。
②定义一个co-variant版本的equals()或compareTo()方法。
例如,Bob类定义其equals()方法为布尔equals(Bob),它覆盖了对象中定义的equals()方法。
因为Java代码在编译时解析重载方法的方式,在运行时使用的几乎总是在对象中定义的这个版本的方法,而不是在Bob中定义的那一个(除非显式将equals()方法的参数强制转换为Bob类型)。
因此,当这个类的一个实例放入到类集合中的任何一个中时,使用的是Object.equals()版本的方法,而不是在Bob中定义的版本。
在这种情况下,Bob类应当定义一个接受类型为Object的参数的equals()方法。
1.4.2检测:
忽略方法返回值
这个检测器查找代码中忽略了不应该忽略的方法返回值的地方。
这种情况的一个常见例子是在调用String方法时,例如:
1StringaString="bob";
2b.replace('b','p');
3if(b.equals("pop"))
这个错误很常见。
在第2行,程序员认为他已经用p替换了字符串中的所有b。
确实是这样,但是他忘记了字符串是不可变的。
所有这类方法都返回一个新字符串,而从来不会改变消息的接收者。
1.4.3检测:
Null指针对null的解引用(dereference)和冗余比较
这个检测器查找两类问题。
它查找代码路径将会或者可能造成null指针异常的情况,它还查找对null的冗余比较的情况。
例如,如果两个比较值都为null,那么它们就是冗余的并可能表明代码错误。
FindBugs在可以确定一个值为null而另一个值不为null时,检测类似的错误,例如:
1Personperson=aMap.get("bob");
2if(person!
=null){
3person.updateAccessTime();
4}
5Stringname=person.getName();
在这个例子中,如果第1行的Map不包括一个名为“bob”的人,那么在第5行询问person的名字时就会出现null指针异常。
因为FindBugs不知道map是否包含“bob”,所以它将第5行标记为可能null指针异常。
1.4.4检测:
初始化之前读取字段
这个检测器寻找在构造函数中初始化之前被读取的字段。
这个错误通常是由使用字段名而不是构造函数参数引起的,例如在构造函数中读取未初始化的字段:
1publicclassThing{
2privateListactions;
3publicThing(StringstartingActions){
4StringTokenizertokenizer=newStringTokenizer(startingActions);
5while(tokenizer.hasMoreTokens()){
6actions.add(tokenizer.nextToken());
7}
8}
9}
在这个例子中,第6行将产生一个null指针异常,因为变量actions还没有初始化。
1.4.5命名检查
对标准Java命令规范的测试:
变量名称不应太短;方法名称不应过长;类名称应当以小写字母开头;方法和字段名应当以小写字母开头,等等。
1.4.6未使用的代码检查
查找从未使用的私有字段和本地变量、执行不到的语句、从未调用的私有方法,等等。
1.4.7嵌套检查
例如:
switch语句应当有default块,应当避免深度嵌套的if块,不应当给参数重新赋值,不应该对double值进行相等比较。
1.4.8导入语句检查
检查import语句的问题,比如同一个类被导入两次或者被导入java.lang的类中。
1.4.9JUnit测试检查
查找测试用例和测试方法的特定问题,例如方法名称的正确拼写,以及suite()方法是不是static和public。
1.4.10字符串检查
找出处理字符串时遇到的常见问题,例如重复的字符串标量,调用String构造函数,对String变量调用toString()方法。
1.4.11括号检查
检查for、if、while和else语句是否使用了括号。
1.4.12代码尺寸检查
测试过长的方法、有太多方法的类以及重构方面的类似问题。
1.4.13终结函数检查
因为在Java语言中,finalize()方法不是那么普遍,它们的使用规则虽然很详细,但是人们对它们相对不是很熟悉。
这类检查查找finalize()方法的各种问题,例如空的终结函数,调用其他方法的finalize()方法,对finalize()的显式调用,等等。
1.4.14克隆检查
用于clone()方法的新规则。
凡是重写clone()方法的类都必须实现Cloneable,clone()方法应该调用super.clone(),而clone()方法应该声明抛出CloneNotSupportedException异常,即使实际上没有抛出异常,也要如此。
1.4.15耦合检查
查找类之间过度耦合的迹象,比如导入内容太多;在超类型或接口就已经够用的时候使用子类的类型;类中的字段、变量和返回类型过多等。
1.4.16异常检查
针对异常的检查:
不应该声明该方法而抛出java.lang.Exception异常,不应当将异常用于流控制,不应该捕获Throwable,等等。
1.4.17日志检查
查找java.util.logging.Logger的不当使用,包括非终状态(nonfinal)、非静态的记录器,以及在一个类中有多个记录器。
1.4.18Open—Close检查
检查文件或通讯方面,是否忘记Close的情况。
1.4.19其它检查
其它缺陷清单可参见:
缺陷清单
1.4.20构建自己的规则集
可以构建自己的规则集
2PMD
PMD是一个开源的静态分析工具,它分析Java源代码,找出潜在的bug。
在一般意义上来说,它与FindBugs和Lint4j这类工具类似。
但是,所有这些工具找出的bug各不相同,所以在给定代码基址上把这些工具都运行一遍很有好处。
PMD是用Java编程语言编写的,并且要求使用JDK1.3或更高的版本。
PMD用于检查Java源代码,以便发现如下的潜在问题:
✓潜在的bug:
空的try/catch/finally/switch语句
✓未使用的代码:
未使用的局部变量、参数、私有方法等
✓可选的代码:
String/StringBuffer的滥用
✓复杂的表达式:
不必须的if语句、可以使用while循环完成的for循环
✓重复的代码:
拷贝/粘贴代码意味着拷贝/粘贴bugs
2.1命令行
2.1.1安装
如果您习惯使用命令行,那么PMD的安装和运行会非常简单。
先下载zip压缩文件,然后把它解压到合适的位置即完成安装。
2.1.2运行
运行PMD最简单的方法是调用脚本pmd.sh(在Unix/Linux上)或脚本pmd.bat(在Windows上)。
不太合常规的是,这些脚本在pmd-2.1/etc目录中,而不是在bin目录中。
这个脚本采用了三个命令行参数:
要检查的.java文件的路径。
指定输出格式的关键字html或xml。
要运行的规则集的名称。
例如,以下命令使用命名规则集检查ImageGrabber.java文件并生成XML输出:
pmd [filename|jar or zip file containing source code|directory] [report format] [ruleset file]
reportformat:
输出格式,XML/HTML,通常使用HTML会比较方便一些。
rulesetfile:
分析的标准。
可以是下面的一个或多个,用逗号分隔。
详见2.4可用的规则
Linux下:
$/usr/pmd-2.1/etc/pmd.shImageGrabber.javaxmlrulesets/naming.xml
Windows下:
1、cmd->进入%PMD_HOME%\lib->输入java–jarpmd-4.2.1.jarc:
\youcodehtmlunusedcode>>c:
\report.html
2、cmd->进入%PMD_HOME%\bin->输入pmdc:
\youcodehtmlrulesets/unusedcode.xml>>c:
\report.html
以上两种方法均可以生成报告
以我电脑为例:
用ie打开report.html显示如下信息
相同的文件名不会覆盖,报告内容会追加。
2.2Eclipse插件
2.2.1安装方法:
✓启动Eclipse
✓选择Help-->SoftwareUpdates-->FindandInstall
✓选择Next,选择Newremotesite
✓在Name框中输入PMD,URL框中输入
✓在之后的对话框中一直点击下一步或者接受协议,完成Eclipse的PMD插件的安装
2.2.2使用方法:
通过右键一个项目,然后选择PMD-->ChecknodewithPMD,即可使用PMD工具检查代码。
在ViolationsOverview和ViolationsOutline
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 静态 工具 使用 说明书