自动找Bug/插件-代码静态检查findbugs-idea安装以及使用

2023-10-27

目录

简介

IDEA安装FindBugs

Findbugs配置

配置排除一些类

扫描级别

IDEA中使用FindBugs:

一些常见错误

补充


简介

Findbugs是一个静态分析工具,它检查类或者JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。Findbugs自带检测器,其中有60余种Bad practice,80余种Correctness,1种 Internationalization,12种Malicious code vulnerability,27种Multithreaded correctness,23种Performance,43种Dodgy。我们还可以自己配置检查规则(做哪些检查,不做哪些检查),也可以自己来实现独有的校验规则(用户自定义特定的bug模式需要继承它的接口,编写自己的校验类)。
 

IDEA安装FindBugs

(1)在线安装:菜单File->Settings->Plugins->Browse repositories...->搜索框内搜索FindBugs->得到结果FindBugs-IDEA,下载(install)并重新启动就ok了。

(2)离线安装:首先要下载FindBugs压缩包,下载网址:FindBugs压缩包,然后菜单File->Settings->Plugins->Install plug from disk->选择你下载的FindBugs压缩包(因为包含jar包较多),然后apply->OK,重启就ok了。

FindBugs-IDEA
IDEA版本新一点的装不上, 评论说用Spotbugs替换了

Findbugs配置

配置排除一些类

选择xml文件, 例如findbugs-exclude-filter.xml

<?xml version="1.0" encoding="UTF-8"?>
<FindBugsFilter>
	<!--过滤类-->
    <Match>
        <Class name="com.baidu.model.PageQuery" />
    </Match>
    <!--过滤所有DO,VO等后缀的类-->
    <Match>
        <Class name="~.*\.*(DO|Param|VO|Model|Event|Response|Query|Vo)"/>
    </Match>
	<!--过滤包-->
	<Match>
        <Package name="com.baidu.model" />
    </Match>
	<!--过滤方法-->
	<Match>
        <Class name="com.baidu.service.TestServiceImpl" />
        <Method name="getListData"></Method>
    </Match>
	<!--过滤异常-->
	<Match>
		<!--装箱后拆箱紧接着装箱,忽略不处理 -->
		<!-- Boxed value is unboxed and then immediately reboxed-->
		<Package name="~.*" />
		<Bug pattern="BX_UNBOXING_IMMEDIATELY_REBOXED" />
	</Match>
</FindBugsFilter>

扫描级别

Minimum rank to report错误信息分成了3个级别

Findbugs将错误信息分成了3个级别,依据严重程度High>Medium>Low,用户可以根据需要进行筛选。比如:
(1)High选择项,只有是High级别的提示信息才会被显示。
(2)Medium选择项,只有是Medium和High级别的提示信息才会被显示。
(3)Low选择项,所有级别的提示信息都会被显示。

此外,还有一个拖动条供选择rank等级(1-20),rank越高,严重程度越低,显示的信息越多。一般选择14,15就差不多够用了。

IDEA中使用FindBugs:

选中项目,包,类,右击鼠标,选择FindBugs, 

  • Analyze Selected File(s)单个文件
  • Analyze Package(s) Files包下文件
  • Analyze Module Files整个module
  • Analyze Project Files整个工程

一些常见错误

Bad practice 坏的实践,主要是代码中的一些坏习惯,没有按Java规范来, 下面列举几个:
	HE:类中equals()与hashCode()没有同时定义,或者使用了错误的对象的hashCode()或equals()。
	SQL:Statement 的execute方法调用了非常量的字符串;或Prepared Statement是由一个非常量的字符串产生。
	DE: 方法终止或不处理异常,一般情况下,异常应该被处理或报告,或被方法抛出。

Correctness 一般的正确性问题,可能导致错误的代码,下面列举几个:
	NP: 空指针被引用;在方法的异常路径里,空指针被引用;方法没有检查参数是否null;null值产生并被引用;null值产生并在方法的异常路径被引用;传给方法一个声明为@NonNull的null参数;方法的返回值声明为@NonNull实际是null。
	Nm: 类定义了hashcode()方法,但实际上并未覆盖父类Object的hashCode();类定义了tostring()方法,但实际上并未覆盖父类Object的toString();很明显的方法和构造器混淆;方法名容易混淆。
	SQL:方法尝试访问一个Prepared Statement的0索引;方法尝试访问一个ResultSet的0索引。
	UwF:所有的write都把属性置成null,这样所有的读取都是null,这样这个属性是否有必要存在;或属性从没有被write。

Internationalization 国际化,当对字符串使用upper或lowercase方法,如果是国际的字符串,可能会不恰当的转换。

Malicious code vulnerability 可能受到的恶意攻击,如果代码公开,可能受到恶意攻击的代码,下面列举几个:
	FI: 一个类的finalize()应该是protected,而不是public的。
	MS:属性是可变的数组;属性是可变的Hashtable;属性应该是package protected的。

Multithreaded correctness 多线程的正确性,多线程编程时,可能导致错误的代码,下面列举几个:
	ESync:空的同步块,很难被正确使用。
	MWN:错误使用notify(),可能导致IllegalMonitorStateException异常;或错误的使用wait()。
	No: 使用notify()而不是notifyAll(),只是唤醒一个线程而不是所有等待的线程。
	SC: 构造器调用了Thread.start(),当该类被继承可能会导致错误。

Performance 性能问题,可能导致性能不佳的代码,下面列举几个:
	DM:方法调用了低效的Boolean的构造器,而应该用Boolean.valueOf(…);用类似Integer.toString(1) 代替new Integer(1).toString();方法调用了低效的float的构造器,应该用静态的valueOf方法。
	SIC:如果一个内部类想在更广泛的地方被引用,它应该声明为static。
	SS: 如果一个实例属性不被读取,考虑声明为static。
	UrF:如果一个属性从没有被read,考虑从类中去掉。
	UuF:如果一个属性从没有被使用,考虑从类中去掉。

Dodgy 危险的,具有潜在危险的代码,可能运行期产生错误,下面列举几个:
	CI: 类声明为final但声明了protected的属性。
	DLS:对一个本地变量赋值,但却没有读取该本地变量;本地变量赋值成null,却没有读取该本地变量。
	ICAST: 整型数字相乘结果转化为长整型数字,应该将整型先转化为长整型数字再相乘。
	INT:没必要的整型数字比较,如X <= Integer.MAX_VALUE。
	NP: 对readline()的直接引用,而没有判断是否null;对方法调用的直接引用,而方法可能返回null。
	REC:直接捕获Exception,而实际上可能是RuntimeException。
	ST: 从实例方法里直接修改类变量,即static属性。



Class names should start with an upper case letter 主要包括类名的命名,以大写字母开头
Method names should start with a lower case letter 方法名以小写字母开头
Field names should start with a lower case letter 字段名以小写字母开头
equals()method does not check for null argument equals()方法应该检查非空
Class defines equals() and uses Object.hashCode() 一个类覆写了equals方法,没有覆写hashCode方法,使用了Object对象的hashCode方法
Method ignores exceptional return value 方法忽略返回值的异常信息
Equals method should not assume anything about the type of its argument equals(Object o)方法不能对参数o的类型做任何的假设。比较此对象与指定的对象。当且仅当该参数不为 null,并且是表示与此对象相同的类型的对象时,结果才为 true。
Comparison of String objects using == or != 用==或者!=去比较String类型的对象
Method might ignore exception 方法可能忽略异常
Method invokes System.exit() 在方法中调用System.exit(…)语句,考虑用RuntimeException来代替
Method ignores result of InputStream.read() InputStream.read方法忽略返回的多个字符,如果对结果没有检查就没法正确处理用户读取少量字符请求的情况。
Dodgy code 糟糕的代码(一般是没有按Java规范来写代码,或语句不全,类型转换,多余的语句,判断)
Switch statement found where default case is missing Switch没有默认情况下执行的case语句
Switch statement found where one case falls through to the next case Switch语句中一个分支执行后又执行了下一个分支。通常case后面要跟break 或者return语句来跳出。
Dead store to local variable 该指令为局部变量赋值,但在其后的没有对她做任何使用。通常,这表明一个错误,因为值从未使用过。
Write to static field from instance method 在实例方法写入静态字段
Redundant nullcheck of value known to be non-null 方法中对不为空的值进行为空的判断。
Method uses the same code for two branches 此方法使用相同的代码,以实现两个有条件的分支。检查以确保这是不是一个编码错误
Exception is caught when Exception is not thrown 在try/catch块中捕获异常,但是异常没有在try语句中抛出而RuntimeException又没有明确的被捕获
Integral division result cast to double or float 整形数除法强制转换为double或者float类型。
Possible null pointer dereference due to return value of called method 方法的返回值没有进行是否为空的检查就重新赋值,这样可能会出现空指针异常。
Useless object created 对象创建了并没有用
Unread public/protected field 没有用到的字段
Internationalization 关于代码国际化相关方面的
Consider using Locale parameterized version of invoked method
使用平台默认的编码格式对字符串进行大小写转换,这可能导致国际字符的转换不当。使用以下方式对字符进行转换
Performance 关于代码性能相关方面的(多为声明了无用的属性)
Boxing/unboxing to parse a primitive 类型转换 比如字符串转换成int 应该使用Integer.parseInt(“”) 代替Integer.valueOf(“”)
Method concatenates string using + in aloop
每次循环里的字符串+连接,都会新产生一个string对象,在java中,新建一个对象的代价是很昂贵的,特别是在循环语句中,效率较低
解决办法:使用StringBuffer或者StringBuilder重用对象。
Private method is never called 私有方法没有被调用
Explicit garbage collection;extremely dubious except in benchmarking code
在代码中显式的调用垃圾回收命名,这样做并不能起作用。在过去,有人在关闭操作或者finalize方法中调用垃圾回收方法导致了很多的性能浪费。这样大规模回收对象时会造成处理器运行缓慢。
Unread field:should this field be static? 没有用到的static 字段
should be a static inner class 此内部类应该使用static修饰
Experimental
Method may fail to clean up stream or resource on checked exception
这种方法可能无法清除(关闭,处置)一个流,数据库对象,或其他资源需要一个明确的清理行动
解决方法:流的关闭都写在finally里面
Malicious code vulnerability 关于恶意破坏代码相关方面的(主要是一些属性,建议改为private并为其提供get,set方法 )
May expose internal representation by incorporating reference to mutable object
此代码把外部可变对象引用存储到对象的内部表示。如果实例受到不信任的代码的访问和没有检查的变化危及对象和重要属性的安全。存储一个对象的副本,在很多情况下是更好的办法。
Field isn’t final but should be 此字段前应该加final
Field isn’t final and can’t be protected from malicious code 此字段前应该加final
Field should be package protected
一个静态字段是可以被恶意代码或其他的包访问修改。可以把这种类型的字段声明为final类型的以防止这种错误。
Multithreaded correctness 关于代码正确性相关方面的
Static DateFormat DateFormat 在多线程中本身就是不安全的,如果在线程范围中共享一个DateFormat的实例而不使用一个同步的方法在应用中就会出现一些奇怪的行为。
Call to static DateFormat DateFormats多线程使用本事就是不安全的,改进方法:需要创建多实例或线程同步
Correctness 关于代码正确性相关方面的
Nullcheck of value previously dereferenced 此代码之前废弃null值检查。解决办法 进行null检查
Possible null pointer dereference 可能为null
Possible null pointer dereference in method on exception path 在异常null值处理分支调用的方法上,可能存在对象去除引用操作
value is null and guaranteed to be dereferenced on exception path exception分支上,存在引用一个null对象的方法,引发空指针异常。
Self comparison of value with itself 方法中对一个局部变量自身进行比较运算,并可说明错误或逻辑错误。请确保您是比较正确的事情。

An apparent infinite recursive loop 明显的无限迭代循环,将导致堆栈溢出.

补充


Multithreaded correctness
    Sleep with lock held  当持有对象时调用Thread.sleep()。这可能会导致很差的性能和可扩展性,或陷入死锁,因为其他线程可能正在等待获得锁。调用wait()是一个更好的主意,释放对象的持有以允许其他线程运行。注意:sleep方法没有释放锁,而wait方法释放了锁

Correctness
    Null pointer dereference  空指针取消引用
        Method call passes null for non-null parameter  方法调用为非null参数传递null
        Non-virtual method call passes null for non-null parameter  非虚拟方法调用为非null参数传递null

Security 关于代码安全性防护
    HTTP Response splitting vulnerability HTTP响应拆分漏洞
        HTTP parameter directly written to HTTP header output 估计是把参数直接写进头部了 ,没有做任何处理
            // responses.setHeader("Access-Control-Allow-Origin", originHeader);
            responses.addHeader("Access-Control-Allow-Origin", URLEncoder.encode(originHeader, StandardCharsets.UTF_8.displayName()));
        

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自动找Bug/插件-代码静态检查findbugs-idea安装以及使用 的相关文章

  • 如何将本机库链接到 IntelliJ 中的 jar?

    我正在尝试在 IntelliJ 中设置 OpenCV 但是我一直在弄清楚如何告诉 IntelliJ 在哪里可以找到本机库位置 在 Eclipse 中 添加 jar 后 您可以在 Build Config 屏幕中设置 Native 库的位置
  • 日期语句之间的 JPQL SELECT [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想将此 SQL 语句转换为等效的 JPQL SELECT FROM events WHERE events date BETWE
  • 序列的排列?

    我有具体数量的数字 现在我想以某种方式显示这个序列的所有可能的排列 例如 如果数字数量为3 我想显示 0 0 0 0 0 1 0 0 2 0 1 0 0 1 1 0 1 2 0 2 0 0 2 1 0 2 2 1 0 0 1 0 1 1 0
  • Spring应用中Eureka健康检查的问题

    我正在开发一个基于 Spring 的应用程序 其中包含多个微服务 我的一个微服务充当尤里卡服务器 到目前为止一切正常 在我所有其他微服务中 用 EnableEurekaClient 我想启用这样的健康检查 应用程序 yml eureka c
  • 如何通过 javaconfig 使用 SchedulerFactoryBean.schedulerContextAsMap

    我使用 Spring 4 0 并将项目从 xml 移至 java config 除了访问 Service scheduleService 带注释的类来自QuartzJobBean executeInternal 我必须让它工作的 xml 位
  • 如何循环遍历所有组合,例如48 选择 5 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在java中从大小为n的集合中迭代生成k个元素子集 https stackoverflow com questions 4504974 how to iteratively generate k
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • Spring AspectJ 在双代理接口时失败:无法生成类的 CGLIB 子类

    我正在使用Spring的
  • 如何在 Spring 中禁用使用 @Component 注释创建 bean?

    我的项目中有一些用于重构逻辑的通用接口 它看起来大约是这样的 public interface RefactorAwareEntryPoint default boolean doRefactor if EventLogService wa
  • 在 Jar 文件中运行 ANT build.xml 文件

    我需要使用存储在 jar 文件中的 build xml 文件运行 ANT 构建 该 jar 文件在类路径中可用 是否可以在不分解 jar 文件并将 build xml 保存到本地目录的情况下做到这一点 如果是的话我该怎么办呢 Update
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • 检测并缩短字符串中的所有网址

    假设我有一条字符串消息 您应该将 file zip 上传到http google com extremelylonglink zip http google com extremelylonglink zip not https stack
  • 将 MOXy 设置为 JAXB 提供程序,而在同一包中没有属性文件

    我正在尝试使用 MOXy 作为我的 JAXB 提供程序 以便将内容编组 解组到 XML JSON 中 我创建了 jaxb properties 文件 内容如下 javax xml bind context factory org eclip
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • Cucumber 0.4.3 (cuke4duke) 与 java + maven gem 问题

    我最近开始为 Cucumber 安装一个示例项目 并尝试使用 maven java 运行它 我遵循了这个指南 http www goodercode com wp using cucumber tests with maven and ja
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn

随机推荐

  • K均值、模糊C均值、直觉模糊C均值的理解与C++实现

    最近做课题想到用聚类算法做图像分割 从理论到实践 好不容易把理论看完 大概明白是个什么意思 到了代码转化的步骤 what the fuck 这都是什么 自己不会编就算了 把别人的代码借过来根本看不懂在写什么 特此开贴记录坑爹玩意儿 1 K
  • MySQL十九:分库分表实践

    在很多小型应用中都没真正使用分库分表 但是说起来并不陌生 因为我们在面试中经常会被问到 今天我们从从以下几个方面来聊聊分库分表 是什么 解决什么 怎么做 为什么要这么做 即 分库分表是什么 分库分表解决什么问题 分库分表怎么做 分库分表什么
  • Jmeter 线程组/配置元件讲解

    配置元件讲解 线程组 线程组详解 压力测试 HTTP取样器 高级设置 响应 超时 下载资源 代理服务器 保存MD5格式数据 配置元件 HTTP请求默认值 HTTP信息头管理器 HTTPCookie管理器 HTTP缓存管理器 用户定义的变量
  • 思科 计算机网络 期末考试答案

    以下哪个域名是顶级域的一个示例 A root cisco com B www cisco com C cisco com D com DNS根域下面是顶级域 也由Internet域名注册授权机构管理 共有3种类型的顶级域 1 通用顶级域名
  • [极客大挑战 2019]Http(BUUCTF)

    前言 这篇文章还是是为了帮助一些 像我这样的菜鸟 找到简单的题解 题目描述 解题工具 我用fiddler抓包 burpsuite也可以 解题过程 用F12查看一下源代码 发现Secret php 进入是一个高档页面 翻译一下意思是 来源不是
  • Centos 7.0 的svn

    第一步 1 1 yum 安装 yum install subversion 1 2 查看版本号 span style font size 16px svn version span 到这就配置成功了 span style font size
  • Prometheus监控各系统

    使用及安装 Prometheus 安装 Prometheus wget https github com prometheus prometheus releases download v2 30 3 prometheus 2 30 3 l
  • 10个数冒泡排序流程图_图文解析:如何用PLC梯形图实现冒泡排序算法?

    作者注 此程序仅供欣赏 作为科普知识了解即可 实际工程当中PLC一般都有专用的排序指令或函数 不需要我们亲自写排序算法 什么是冒泡排序 学习过一点C语言的朋友 对冒泡排序的概念应该并不陌生 冒泡排序是一种非常基础的排序算法 它的过程是将N个
  • G711 G729音频编码总结

    g729编码 每次只能编码160个字节 编码后为10个字节大小 16 1的压缩比 如果要编码320字节的数据 需要分两次进行 并且G729A不支持多路同时解码 否则声音会有问题 G729b也不行 ITU上的代码都不支持多路解码 但是g729
  • 【华为机试真题 C++】高矮个子排队-100

    编程题目 100分 高矮个子排队 2021 H1 H2 2022 Q1 考试题 时间限制 C C 1秒 其他语言 2秒 空间限制 C C 262144K 其他语言524288K 64bit IO Format lld 本题可使用本地IDE编
  • 毕业设计 stm32智能扫地机器人 - 单片机 嵌入式

    文章目录 0 简介 1 课题背景 2 硬件系统总体框架 2 1 电机驱动 2 2 红外线传感器 2 3 超声波传感器 2 4 MPU6050 2 5 ATK ESP8266 WI FI 模块 2 6 电源管理模块 3 软件系统设计 3 1
  • Jupyterlab 3以及Kite代码补全插件安装

    Jupyterlab 3 以及Kite代码补全插件安装 为啥安个这玩意儿 之前一直用Jupyter写一些机器学习和深度学习的东西 尤其是去年一年里白嫖谷歌的Colab很长时间 甚至还开了pro 他们的工作台就是Jupyter类型的 用多了就
  • 【Bias 03】Benchmarking Robustness in Object Detection: Autonomous Driving when Winter is Coming

    Related work Improving corruption robustness 去除腐蚀 1 提出一种基于DNN 恢复雨雾图片质量的方法 2 预处理中去除雨 但这种方法都是针对某种腐蚀 数据增强 把腐蚀数据加入训练 1 blurr
  • C++类模板和static数据成员

    静态数据成员对象之间共享的 当静态数据成员遇上类模板式也是如此吗 现有demo类模板 类中包含static数据成员 template
  • Linux modules-load 启动时加载驱动模块

    Linux modules load 启动时加载驱动模块 Linux 内核包含非常多驱动以及其他功能模块 驱动开发时 我们可以通过insmod命令向内核中载入模块 rmmod卸载模块 lsmod列出加载的所有模块 一般情况下 模块会根据硬件
  • 【MATLAB】常见语法结构和实用操作

    目录 语法结构 循环 遍历 结构 函数结构 画图操作 绘制函数图像 ezplot figure多图绘制 创建多项式 按照系数创建多项式 利用多项式零点创建多项式 解方程组 语法结构 循环 遍历 结构 与其它编程语言类似 Matlab也有循环
  • 对象存储oss的使用

    分为两个大块 1 阿里云oss配置 2 写代码 阿里云oss配置的最终木电的拿到这几个东西 1 accessKeyId 相当于身份认证 在注册完成之后 就可以拿到 2 accessKeySecret 相当于认证的密码 同样注册完成之后 就会
  • word图片撑满_word图片满页 word图片铺满整个页面

    word中如何让图片占满整个页面 确定 再确定 不OK了 7厘米 页面设置 里设置页面方向及纸张大小 当然也要根据你打印机性能 请将下面 锁定纵横比 那个钩取消 如将页面边距设置为0 点 版式 如图片太大你打印机不一定打印得了 再点右下角的
  • Python报错:IndexError: invalid index of a 0-dim tensor. Use `tensor.item()` in

    Python报错如下 E anaconda envs pytorch gpu python exe D project graphsage graphsage model py D project graphsage graphsage e
  • 自动找Bug/插件-代码静态检查findbugs-idea安装以及使用

    目录 简介 IDEA安装FindBugs Findbugs配置 配置排除一些类 扫描级别 IDEA中使用FindBugs 一些常见错误 补充 简介 Findbugs是一个静态分析工具 它检查类或者JAR 文件 将字节码与一组缺陷模式进行对比