findbugs是一款专业的java静态代码分析工具。最好用的java静态代码分析软件findbugs。该软件使您可以扫描Java程序中的错误,并查看有关其含义和可能的修复程序的详细说明。该软件可以检测几乎所有可能引起功能问题的错误,从而大大改善您的程序。此外,由于其数据库中存在大量错误描述,它还会向您显示有关检测到的错误的详细信息,甚至还提供了解决这些错误的方法。在使用中,该软件的工作流程非常简单,用户可以通过创建项目,运行分析,浏览结果,修改和保存来快速实现该软件,需要该软件的用户可以快速下载!
常见问题:
FindBugs内存不足,还是需要很长时间才能完成?
通常,FindBugs需要大量内存和相对较快的CPU。对于大型应用程序,可能需要1024M或更多的堆空间。默认情况下,FindBugs分配768M的堆空间。您可以使用选项增加此选项,其中n是要分配的堆空间的兆字节数。
什么是“辅助阶级道路”?为什么要指定它?
有关Java类的许多重要事实都需要有关其引用的类的信息。例如:
该类继承的其他类和接口
外部类和接口中的方法可以引发哪些异常
“辅助类路径”是Jar文件,目录和类文件的列表,这些文件包含您要FindBugs分析的代码的类,但FindBugs本身不应分析它们。
如果FindBugs没有有关所引用类的完整信息,则将无法产生最准确的结果。例如,拥有完整的引用类存储库,FindBugs可以修剪控制流信息,以便它可以将焦点放在通过最可能在运行时可行的方法的路径上。另外,某些错误检测器(例如可疑参考比较检测器)依赖于能够执行类型推断,这需要完整的类型层次结构信息。
由于这些原因,我们强烈建议您在运行FindBugs时完全指定辅助类路径。您可以使用-auxclasspath命令行选项或GUI项目编辑器对话框中的“类路径条目”列表来执行此操作。
一世
f FindBugs无法找到应用程序引用的类,它会在分析完成时打印出一条消息,并指定缺少的类。您应该修改辅助类路径以指定如何查找丢失的类,然后再次运行FindBugs。
Clipse插件无法加载?
此问题的症状是Eclipse无法使用以下消息加载FindBugs UI插件:
由于缺少或禁用必备插件“ org.eclipse.ui.ide”,因此禁用了“ edu.umd.cs.findbugs.plugin.eclipse”插件
出现此问题的原因是,与FindBugs一起分发的Eclipse插件不适用于旧的3.x版本的Eclipse。请使用Eclipse 3.6版(2010年6月)或更高版本。
我收到很多错误的“ OS”和“ ODR”警告?
默认情况下,FindBugs假定任何方法调用都可以引发未经检查的运行时异常。因此,可以假定从此方法引发的未经检查的异常可以绕过流或数据库资源上的close()方法调用。
您可以使用-workHard命令行参数或findbugs.workHard布尔分析属性,使FindBugs更加难以修剪不太可能的异常边缘。通常,这会减少错误警告的数量,但会降低分析速度。
Eclipse插件已加载,但是不起作用?
确保您尝试分析的Java代码已正确构建,并且没有类路径或编译错误。
确保项目和工作区的FindBugs设置有效-如有疑问,请将其恢复为默认值。
确保错误日志视图不显示错误。
FindBugs的Maven插件在哪里?
可以在此处找到用于FindBugs的Maven插件。请注意,FindBugs开发人员不维护Maven插件,因此我们无法回答有关此问题。
软件功能:
尽管用Java编写的程序几乎可以与任何平台兼容,但是它们可能包含的任何错误都是相同的。
因为创建无错误的代码非常困难,尤其是对于需要处理大量变量和各种平台相关功能的大型应用程序,所以在编写程序时使用特殊的调试器来分析程序要容易得多。
查看按严重性因子排序的检测到的错误
FindBugs是一个用Java编写的功能强大的小型应用程序,它可以扫描和检测几乎任何类型的bug到其他Java程序中。为实现此目的,该实用程序扫描JAR,ZIP或WAR文件中的每个类,并使用静态分析来检测代码错误,这些错误可能导致其在执行期间无法正常运行。
所有发现的错误均按照其类别进行分组和显示,以便为您提供更直观的工作环境。根据是否将其视为不良做法,实验性,恶意性或是否引起性能问题,该错误会传播到文件夹和子文件夹。
使用自定义过滤器手动将错误分组
除了类别之外,代码问题还可以按各种其他因素进行排序,例如排名和日期。 FindBugs允许您根据它们的“糟糕”程度对它们进行排序,从“麻烦”到“最可怕”。尽管采用了幽默的方法,但此功能仍可正常使用,它使您可以根据严重性因素来处理错误。
您还可以在应用程序内手动创建自定义过滤器,以查找特定的错误并在短时间内消除所有不相关的错误,以提高可视性。此外,通过使用云插件,您可以为每个代码指定各种属性,例如“几乎无害”,“必须固定”或“需要进一步研究”。
使用说明:
使用FindBugs图形用户界面(GUI)
1.创建一个项目
使用findbugs命令启动FindBugs,选择File→New Project菜单项。您将看到一个对话框,如下所示:
使用“要分析的类路径”旁边的“添加”按钮选择Java存档文件(zip,jar,ear或war文件)或包含Java类的目录以分析错误。您可以添加多个档案/目录。
您还可以添加包含要分析的Java归档的源代码的源目录。这将使FindBugs突出显示包含可能错误的源代码。您添加的源目录应该是Java包层次结构的根。例如,如果您的应用程序包含在org.foobar.myapp包中,则应将目录的父目录添加到项目的源目录列表中。
另一个可选步骤是添加其他Jar文件或目录作为“辅助类路径位置”条目。如果要分析的归档文件和目录引用了其他类,则这些类不包括在分析的归档文件/目录中,也不在标准运行时类路径中。 FindBugs中的某些错误模式检测器使用类层次结构信息,因此,如果有FindBugs执行分析的整个类层次结构可用,您将获得更准确的结果。
2.运营分析
添加所有归档文件,目录和源目录后,单击“分析”按钮以分析Jar文件中包含的类。请注意,对于旧版本的大型程序
电脑,这可能需要相当长的时间(数十分钟)。最近具有足够内存的计算机通常能够在几分钟内分析大型程序。
3.浏览结果
分析完成后,您将看到以下屏幕:
窗口的左上方窗格显示错误树。这是分析的Jar文件中检测到的所有潜在错误的分层表示。
在顶部窗格中选择特定的错误实例时,将在底部窗格的“详细信息”选项卡中看到错误的描述。另外,如果源可用,则右上角的源代码窗格将显示发生潜在错误的程序的源代码。在上面的示例中,错误是未关闭的流对象。源代码窗口突出显示了创建流对象的行。
您可以将文本注释添加到错误实例。为此,请在分层视图正下方的文本框中键入它们。您可以键入要记录的任何信息。加载并保存错误结果文件后,将保留注释。
4.保存并打开
您可以使用文件→另存为...菜单选项来保存您的工作。要保存您的工作,包括您指定的jar文件列表和所有错误结果,请从“另存为...”对话框的下拉列表中选择“ FindBugs分析结果(.xml)”。您也可以选择仅保存jar文件列表(“ FindBugs项目文件(.fbp)”)或仅保存结果(“ FindBugs分析文件(.fba)”)。您可以使用文件→打开...菜单选项来加载保存的文件。
使用FindBugs™Eclipse插件
要使用Eclipse的FindBugs插件,您需要Eclipse 3.3或更高版本以及JRE / JDK 1.5或更高版本。
1.使用插件
首先,在程序包资源管理器中右键单击Java项目,然后选择标有“查找错误”的选项。 FindBugs将运行,问题标记(显示在源代码窗口中,也显示在Eclipse Problems视图中)将指向代码中已被识别为错误模式的潜在实例的位置。
您还可以在现有Java文件(jar,ear,zip,war等)上运行FindBugs。只需创建一个空的Java项目并将存档附加到项目类路径即可。这样,您现在可以在Package Explorer中右键单击归档节点,然后选择标有“ Find Bugs”的选项。如果您还配置了二进制文件的源代码位置,FindBugs还将把生成的警告链接到正确的源文件。
您可以通过打开Java项目的“属性”对话框并选择“查找错误”属性页面来自定义FindBugs的运行方式。您可以选择的选项包括:
启用或禁用“自动运行FindBugs”复选框。启用后,每次您在项目中修改Java类时,FindBugs都将运行。
选择最低的警告优先级并启用错误类别。这些选项将选择要显示的警告。例如,如果选择“中级”警告优先级,则仅显示中级和高优先级警告。同样,如果未选中“样式”复选框,则不会显示“样式”类别中的警告。
选择检测器。该表允许您选择要为项目启用的检测器。
2.扩展的Eclipse插件(自2.0.0开始)
Eclipse插件支持定制的FindBugs检测器贡献(有关更多信息,另请参见AddingDetectors.txt)。有两种方法可以为Eclipse提供定制插件:
您可以通过窗口→首选项→Java→FindBugs→其他配置现有的标准FindBugs检测器软件包。设置→自定义检测器。只需指定任何其他插件库的位置即可。
该解决方案的优势在于,可以按原样使用现有的检测器包,并且可以快速验证第三方检测器的质量。缺点是必须在每个新的Eclipse工作区中应用此设置,并且不能在团队成员之间共享此设置。
可以通过标准的Eclipse扩展机制提供自定义检测器。
请检查findBugsEclipsePlugin / schema / detectorPlugins.exsd扩展点的文档,以了解如何更新plugin.xml。现有的FindBugs检测器插件可以轻松地“扩展”为功能齐全的FindBugs和Eclipse检测器插件。通常,您只需将META-INF / MANIFEST.MF和plugin.xml添加到jar中并更新构建脚本,以使MANIFEST.MF在构建期间不会被覆盖。
该解决方案的好处是,对于给定的(共享)Eclipse安装,每个团队成员都具有完全相同的检测器集合,并且不再需要配置任何东西。 (非常小)前提是必须将现有的检测器软件包转换为有效的Eclipse插件。您甚至可以对第三方检测器软件包执行此操作。另一个主要区别是能够使用req扩展默认的FindBugs类路径
运行时使用第三方库(有关更多信息,请参见AddingDetectors.txt)。
3,故排除
本节列出了插件的常见问题以及(如果知道的话)如何解决它们。
如果您在Eclipse中启动FindBugs分析并看到OutOfMemory错误对话框,请增加JVM的可用内存:更改eclipse.ini并将以下行添加到文件末尾:
-Vmargs
-Xmx1000m
重要:以“ -vmargs”行开头的配置参数必须是eclipse.ini文件中的最后一行,并且每行只允许一个参数!
如果在源窗口或问题视图中未看到任何FindBugs问号,则可能需要更改“问题视图”过滤器设置。
筛选档案
1.过滤文件简介
从概念上讲,过滤器根据一组条件匹配错误的实例。通过定义过滤器,您可以选择错误实例进行特殊处理。例如,将它们排除或包括在报告中。
筛选器文件是带有顶级元素的XML文档。 FindBugsFilter元素具有一些Match元素作为子元素。每个Match元素代表一个应用于生成的错误实例的谓词。通常,过滤器将用于排除错误的示例。例如:
$ findbugs -textui -exclude myExcludeFilter.xml myApp.jar
但是,您也可以使用过滤器选择要具体报告的错误实例:
$ findbugs -textui -include myIncludeFilter.xml myApp.jar
匹配元素包含子元素,它们是谓词的组合。换句话说,每个孩子都必须是真实的,因为谓词是真实的。
2.匹配术语的类型
该元素指定要匹配的特定错误模式。 pattern属性是错误模式类型的逗号分隔列表。通过查看-xml输出选项(元素的type属性BugInstance的类型属性)或错误描述文档生成的输出,可以找到特定警告的错误模式的类型。
有关更粗粒度的匹配,请使用code属性。它需要逗号分隔的错误缩写列表。对于大多数粗粒度匹配,请使用categoryattriute,这需要用逗号分隔的错误目录名称列表:CORRECTNESS,MT_CORRECTNESS,BAD_PRACTICICE,PERFORMANCE,STYLE。
如果在同一个元素上指定了上述多个属性,则将匹配所有与指定模式名称或缩写或类别之一匹配的错误模式。
作为向后兼容性的一种度量,可以使用和元素来代替元素。它们每个都使用名称属性来指定可接受值的列表。在将来的版本中可能会删除对这些元素的支持。
该元素将警告与某个错误的置信度匹配。 value属性应为整数:1表示高置信度警告,2表示匹配正常置信度警告,3表示匹配低置信度警告。在2.0.0版中替换。
同样,存在向后兼容性。
该元素将警告与特定错误级别匹配。 value属性应该是1到20之间的整数,其中1到4是最糟糕的,5到9是最糟糕的,10到14个故障,以及15到20个注意错误。
该元素与与nameattribute指定的包中的类相关的警告匹配。不包括嵌套包(与Jav一起
导入声明)。但是,使用正则表达式名称匹配可以轻松匹配多个包。
该元素与与特定类关联的警告匹配。 name属性用于指定类名的精确或正则表达式匹配模式。角色属性是类角色。
作为一种向后兼容措施,您可以使用元素类上的属性Match来指定正确的类名,或者使用classregex属性来指定与类名匹配的正则表达式,而不是该类型的元素。
如果Match元素既不包含Class元素也不包含class / classregex属性,则该谓词将应用于所有类。除非您使用适当的方法或字段谓词来进一步完善,否则此类谓词可能会比您想要的错误实例匹配更多的错误实例。
该元素与与特定源文件关联的警告匹配。 name属性用于指定源文件名的精确或正则表达式匹配模式。
此元素指定方法。该名称用于指定与方法名称的精确或正则表达式匹配的模式。 params属性是方法参数类型的逗号分隔列表。 returns属性是方法的返回类型。角色属性是方法角色。在参数和返回中,类名必须完全合格。 (例如,“ java.lang.String”而不是“ String”。)如果指定了后者属性之一,则需要另一个属性来创建方法签名。请注意,您可以提供两个名称属性或参数,并返回其中的三个属性。这样,您可以根据名称和签名提供各种匹配。
该元素指定一个字段。 name属性用于指定字段名称的精确或正则表达式匹配模式。您还可以基于字段的签名过滤-使用type属性指定字段的完全限定类型。您可以指定eiter或这两个属性来执行基于名称/签名的匹配。角色属性是字段角色。
该元素指定一个局部变量。 name属性用于指定局部变量名称的精确或正则表达式匹配模式。局部变量是方法中定义的变量。
该元素将Match子句组合为析取词。也就是说,您可以在Method的Or子句中放置两个元素以匹配任一方法。
该元素组合必须评估为true的子句。也就是说,可以将Bug和Confidence元素放在子句中,并且And只能在给定的置信度级别上匹配特定的错误。
该元素反转包含的子匹配项。也就是说,可以将一个元素放在Not子句中以匹配错误(给定元素除外)。
3. Java元素名称匹配
如果名称属性Class,Source,Method或Field带有其余属性内容的〜字符,则解释为与所讨论的Java元素名称匹配的Java正则表达式。
请注意,模式与整个元素名称匹配。 *必须在模式的开头和/或结尾使用子句来执行子字符串匹配。
请参考java.util.regex.Pattern模式语法的文档。
更新日志:
变更文档描述了许多变更,包括新的错误模式:
BSHIFT_WRONG_ADD_PRIORITY,
CO_COMPARETO_INCORRECT_FLOATING,
DC_PARTIALLY_CONSTRUCTED,
DM_BOXED_PRIMITIVE_FOR_COMPARE,
DM_INVALID_MIN_MAX,
ME_MUTABLE_ENUM_FIELD,
ME_ENUM_FIELD_SETTER,
MS_MUTABLE_COLLECTION,
MS_MUTABLE_COLLECTION_PKGPROTECT,
RANGE_ARRAY_INDEX,
RANGE_ARRAY_OFFSET,
RANGE_ARRAY_LENGTH,
RANGE_STRING_INDEX,
RV_RETURN_VALUE_IGNORED_NO_SIDE_EFFECT,
UC_USELESS_CONDITION,
UC_USELESS_CONDITION_TYPE,
UC_USELESS_OBJECT,
UC_USELESS_OBJECT_STACK,
UC_USELESS_VOID_METHOD
软件特色:
支持Java 8(作为运行时和目标平台)。
FindBugs需要最少的Java 7作为运行时环境
FindBugs现在使用ASM 5,这意味着必须升级某些基于FindBugs 2.x / ASM 3的第三方检测器。
“源”过滤器可用于过滤从其他语言生成的类。
添加了将当前可见/已过滤的错误保存到GUI中的HTML输出的功能。
当数据流没有终止时,请确保我们继续进行分析。
现在,对类型限定符的调整分析会发出警告,在需要使用具有严格类型限定符的值的情况下使用计算值。
各种重新分类和优先级调整
在各种错误报告中添加了更多错误说明,从而为理解错误报告提供了更多上下文