Findbugs中常见错误的分类和原因分析

2023-10-26

Findbugs 中的常用的bug pattern配置

Bug pattern description
Bad practice 不好的习惯
Correctness 代码的正确性
Dodgy 小问题
Malicious code vulnerability 恶意代码
Internationalization 国际化问题
Performance 性能问题
Security 安全性问题
Multithreaded currectness 线程问题
Experrimental 实验性问题

常见错误和原因

  • ES_COMPARING_PARAMETER_STRING_WITH_EQ
    ES: Comparison of String parameter using == or != (ES_COMPARING_PARAMETER_STRING_WITH_EQ)

使用 == 或者 != 来比较字符串或interned字符串,不会获得显著的性能提升,同时并不可靠,请考虑使用equals()方法。

  • HE_EQUALS_NO_HASHCODE
    HE: Class defines equals() but not hashCode() (HE_EQUALS_NO_HASHCODE)

类定义了equals()方法但没有重写hashCode()方法,这样违背了相同对象必须具有相同的hashcodes的原则

  • IT_NO_SUCH_ELEMENT
    It: Iterator next() method can’t throw NoSuchElement exception (IT_NO_SUCH_ELEMENT)

迭代器Iterator无法抛出NoSuchElement异常,类实现了java.util.Iterator接口,但是next()方法无法抛出java.util.NoSuchElementException异常,因此,next()方法应该做如此修改,当被调用时,如果没有element返回,则抛出NoSuchElementException异常

  • J2EE_STORE_OF_NON_SERIALIZABLE_OBJECT_INTO_SESSION
    J2EE: Store of non serializable object into HttpSession (J2EE_STORE_OF_NON_SERIALIZABLE_OBJECT_INTO_SESSION)

将没有实现serializable的对象放到HttpSession中,当这个session被钝化和迁移时,将会产生错误,建议放到HttpSession中的对象都实现serializable接口。

  • ODR_OPEN_DATABASE_RESOURCE
    ODR: Method may fail to close database resource (ODR_OPEN_DATABASE_RESOURCE)

方法可能未关闭数据库资源,未关闭数据库资源将会导致性能变差,还可能引起应用与服务器间的通讯问题。

  • OS_OPEN_STREAM
    OS: Method may fail to close stream (OS_OPEN_STREAM)

方法可能未关闭stream,方法产生了一个IO流,却未关闭,将会导致文件描绘符的泄漏,建议使用finally block来确保io stream被关闭。

  • DMI_CALLING_NEXT_FROM_HASNEXT
    DMI: hasNext method invokes next (DMI_CALLING_NEXT_FROM_HASNEXT)

The hasNext() method invokes the next() method. This is almost certainly wrong, since the hasNext() method is not supposed to change the state of the iterator, and the next method is supposed to change the state of the iterator.

  • IL_INFINITE_LOOP
    IL: An apparent infinite loop (IL_INFINITE_LOOP)

明显的无限循环.

  • IL_INFINITE_RECURSIVE_LOOP
    IL: An apparent infinite recursive loop (IL_INFINITE_RECURSIVE_LOOP)

明显的无限迭代循环,将导致堆栈溢出.

  • WMI_WRONG_MAP_ITERATOR
    WMI: Inefficient use of keySet iterator instead of entrySet iterator (WMI_WRONG_MAP_ITERATOR)

使用了keySet iterator和Map.get(key)来获取Map值,这种方式效率低,建议使用entrySet的iterator效率更高.

  • IM_BAD_CHECK_FOR_ODD
    IM: Check for oddness that won’t work for negative numbers (IM_BAD_CHECK_FOR_ODD)

奇偶检测逻辑,未考虑负数情况.

常见bug 类型

  • Call to equals() comparing different types

id: EC_UNRELATED_TYPES, type: EC, category: CORRECTNESS

原因分析:

这缺陷的意思是,大部分都是类型永远不会有这种情况, 比如a为DOUBLE类型所以EQUALS只匹配字符串 if(a.equals())或if(a.quals())这类判断是根本不会有用的;

示例:if(“1”.equals(DAOValue.valueofSuccess()))

  • Dead store to local variable

id: DLS_DEAD_LOCAL_STORE, type: DLS, category: STYLE

原因分析:
DLS问题指的是给本地变量赋了一个值,但随后的代码并没有用到这个值。

  • Method call passes null for nonnull parameter

id: NP_NULL_PARAM_DEREF, type: NP, category: CORRECTNESS

原因分析:对参数为null的情况未作处理。

问题代码:
在这里插入图片描述
修改后:
在这里插入图片描述

  • Method with Boolean return type returns explicit null

id: NP_BOOLEAN_RETURN_NULL, type: NP, category: BAD_PRACTICE

原因分析:
方法如果定义为返回类型Boolean,则可以返回Boolean.TRUE, Boolean.FALSE or null (如果 return 的是 true or false, 则AutoBoxing 成 Boolean.TRUE, Boolean.FALSE)。因为JDK 支持 基本类型和装箱类型的自动转化, 所以下面的代码中:

boolean result = test_NP_BOOLEAN_RETURN_NULL();

因为此时test_NP_BOOLEAN_RETURN_NULL() 返回的是NULL, 所以 JDK 做 automatic unboxing 的操作时, 即调用了 object. booleanValue() 方法时,抛出了空指针。

改成:boolean result = test_NP_BOOLEAN_RETURN_NULL()==null?false:true;

  • No relationship between generic parameter and method argument

id: GC_UNRELATED_TYPES, type: GC, category: CORRECTNESS
原因分析:调用Collection类中的contains方法比较时,所比较的两个参数类型不致;

例如:
在这里插入图片描述
修改后:

在这里插入图片描述

  • Null pointer dereference in method on exception path

id: NP_ALWAYS_NULL_EXCEPTION, type: NP, category: CORRECTNESS

原因分析:在异常处理时,调用一个空对象的方法时可能引起空指针异常。

例如:
在这里插入图片描述

  • Nullcheck of value previously dereferenced

id: RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE, type: RCN, category: CORRECTNESS

原因分析:前面获取的对象,现在引用的时候没有交验是否为null。
例如:
在这里插入图片描述

  • Possible null pointer dereference

id: NP_NULL_ON_SOME_PATH, type: NP, category: CORRECTNESS

原因分析:可能存在空引用。

例如:
在这里插入图片描述

  • Possible null pointer dereference in method on exception path

id: NP_NULL_ON_SOME_PATH_EXCEPTION, type: NP, category: CORRECTNESS

原因分析:

代码调用时, 遇到异常分支, 可能造成一个对象没有获得赋值依旧保持NULL空指针。 接下来如果对这个对象有引用, 可能造成NullPointerException 空指针异常。.

在这里插入图片描述

  • Test for floating point equality

id: FE_FLOATING_POINT_EQUALITY, type: FE, category: STYLE

原因分析:

Float类型的数据比较时,会存在的定的误差值,用!=来比较不是很准确,建议比较两个数的绝对值是否在一定的范围内来进行比较。如,if ( Math.abs(x - y) < .0000001 )

例如:
在这里插入图片描述

  • Useless assignment in return statement

id: DLS_DEAD_LOCAL_STORE_IN_RETURN, type: DLS, category: STYLE

原因分析:

在return的对象中,没有必要通过对象赋值再进行返回。

例如:
在这里插入图片描述

  • Write to static field from instance method

id: ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD, type: ST, category: STYLE

原因分析:向static字段中写入值。

例如:

private static DBRBO dbrBO;
 public final void refresh() {
        danskeBankBO = null;
        dbrBO = null;
        fileAndPathBO = null;
    }

议改为:去掉static。

  • Incorrect lazy initialization and update of static field

id: LI_LAZY_INIT_UPDATE_STATIC, type: LI, category: MT_CORRECTNESS
原因分析:

该方法的初始化中包含了一个迟缓初始化的静态变量。你的方法引用了一个静态变量,估计是类静态变量,那么多线程调用这个方法时,你的变量就会面临线程安全的问题了,除非别的东西阻止任何其他线程访问存储对象从直到它完全被初始化。

  • Method ignores return value

id: RV_RETURN_VALUE_IGNORED, type: RV, category: CORRECTNESS

原因分析:方法忽略了设置返回值。

例如:
在这里插入图片描述

  • Method might ignore exception

id: DE_MIGHT_IGNORE, type: DE, category: BAD_PRACTICE

原因分析:应该将异常 处理、打印或者抛出

例如:
在这里插入图片描述

  • Unwritten field

id: UWF_UNWRITTEN_FIELD, type: UwF, category: CORRECTNESS

原因分析:从未被初始化的变量,调用它时,将返回默认值,要么初始化,要么删掉它。

例如:
在这里插入图片描述

  • Value is null and guaranteed to be dereferenced on exception path

id: NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH, type: NP, category: CORRECTNESS

原因分析:exception分支上,存在引用一个null对象的方法,引发空指针异常。

例如:
在这里插入图片描述

  • Very confusing method names

id: NM_VERY_CONFUSING, type: Nm, category: CORRECTNESS

原因分析:被引用的方法中存在容易混淆的变量。

在这里插入图片描述
fzgsdm改成 fzgsDm 即可。

  • Method invokes inefficient new String() constructor

id: DM_STRING_VOID_CTOR, type: Dm, category: Performance

原因分析:不使用new String()定义空的字符串

例如:
在这里插入图片描述
改成:
在这里插入图片描述

  • Load of known null value

id: NP_LOAD_OF_KNOWN_NULL_VALUE, type: Np, category: Dodgy

原因分析:null值的不当使用。

例如:
在这里插入图片描述

  • Method concatenates strings using + in a loop

id: SBSC_USE_STRINGBUFFER_CONCATENATION, type: SBSC, category: Performance

原因分析:在循环里使用字符串连接,效率低,应该使用StringBuilder/StringBuffer

例如:

 // This is bad
  String s = "";
  for (int i = 0; i < field.length; ++i) {
    s = s + field[i];
  }

改为:

  // This is better
  StringBuffer buf = new StringBuffer();
  for (int i = 0; i < field.length; ++i) {
    buf.append(field[i]);
  }
  String s = buf.toString();

详细的参考以下网址

API:http://findbugs.sourceforge.net/api/index.html

技术手册:http://findbugs.sourceforge.net/manual/index.html

更多请参见官网:http://findbugs.sourceforge.net/bugDescriptions.html

本文转载在:https://www.cnblogs.com/pony1223/p/Findbugs.html

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

Findbugs中常见错误的分类和原因分析 的相关文章

  • “找不到类‘android.support.v4.app.FragmentActivity’”错误

    我收到以下错误 gt 02 06 23 10 24 104 E dalvikvm 912 Could not find class gt android support v4 app FragmentActivity referenced
  • Java EE 5 API 的单个/完整 Maven 依赖项

    是否有包含整个 Java EE 5 规范 API 的单个 Maven 依赖项 就像
  • 使用 Java 将文件附加到 zip 文件

    我当前正在提取一个 war 文件的内容 然后将一些新文件添加到目录结构中 然后创建一个新的 war 文件 这一切都是通过Java以编程方式完成的 但我想知道复制战争文件然后附加文件是否会更有效 然后我就不必等待战争扩大然后必须再次被压缩 我
  • Java:BufferedReader 的 readLine 方法的效率和可能的替代方案

    我们正在努力减少延迟并提高用 Java 编写的进程的性能 该进程通过 readLine 方法从套接字消费数据 xml 字符串 缓冲读取器 http java sun com javase 6 docs api java io Buffere
  • 如何激活IDEA的“运行仪表板”功能

    我有一个名为 的窗口工具运行仪表板 在项目A中 但我无法在项目B中激活这个窗口 有谁知道如何解决这个问题吗 这个功能出现在IntelliJ IDEA版本2017 3中 This is what I see in Project A This
  • Spring boot 动态查询

    我的网络应用程序中有一个过滤器 允许按车辆类型 品牌 燃料 州和城市进行搜索 但所有这些过滤器都是可选的 我怎样才能使用存储库来做到这一点 控制器类 RequestMapping value vehicle search method Re
  • 从通用接口扩展

    最后一排有什么问题吗 interface I1
  • 使用 SSLSocket 的 SOCKS5 代理

    我有一个客户端 服务器应用程序 它通过 Java 的 SSLSocket 远程连接到服务器 我正在尝试实现一种可选模式 通过经过身份验证的 SOCKS v5 代理启用连接 我尝试使用相关教程 http download oracle com
  • Eclipse 中缺少“注释处理”菜单

    我用这个手册https github com excilys androidannotations wiki Eclipse Only Configuration https github com excilys androidannota
  • 没有 jpa 的 Spring 和 Hibernate

    对于我的新项目 我计划使用 Hibernate 5 和 Spring 4 并且一如既往地喜欢分成不同的层 项目 梯度依赖 org springframework spring webmvc 4 2 1 RELEASE org springf
  • 为什么 JDBC 是动态加载而不是导入? [复制]

    这个问题在这里已经有答案了 在 JDBC 中 我只看到使用的示例 Class forName com mysql jdbc Driver true cl 还没有看到有人使用 import com mysql jdbc Driver 是不是因
  • OpenJDK 8:无法解析主机名

    我正在尝试奔跑slf4j with log4jopenJDK 8 上的 2 8 Ubuntu 上的最新版本8u131 b11 0ubuntu1 17 04 1 当通过 maven openjdk 运行简单的 java 类时 无法解析本地主机
  • iText PdfTextExtractor 结果文本中缺少连字

    我正在尝试获取 pdf 文件并从中获取文本 我发现了 iText 并一直在使用它 并取得了不错的成功 我剩下的一个问题是连字 起初我注意到我只是缺少字符 经过一些搜索后 我发现了这个 http support itextpdf com no
  • 应用程序在 Eclipse 中运行速度更快

    我在 eclipse 中有一个可运行的 java SE 应用程序 我引导 JPA 在正常的 java 6 SE 环境中工作 对数据库中不同表的每个请求不会超过 100 毫秒 问题是 当我导出可运行的 jar 并输入 java jar mya
  • 在 Java 7 和 8 中创建与现有列表不同的列表?

    如果我有 List
  • 在一致的环境中执行Java程序

    在我工作的地方 我们有一个 shell 脚本 它允许我们使用所有必要的库和设置执行任意 Java 类 例如 bin sh JAVA HOME bin java cp LONG LIST OF JARS Xmx6g XX MaxPermSiz
  • JPA 标准 API 按 NULL 最后排序

    我使用 JPA 标准 API 从数据库中获取记录 我有实体Record带字段dateTime可以为空 我会编码 public List
  • Eclipse RCP - 创建视图后立即添加侦听器

    问候 Stackoverflow 的同胞们 我正在开发 Eclipse RCP 应用程序 并且必须添加SelectionListener to the Project Explorer view创建后的那一刻 我意识到我无法在我的贡献插件的
  • 如何访问 json 数据中的嵌套数组

    我想访问leagueTable此数组内JSON数据 缩短的JSON看起来像这样 每个数组并不显示所有数据以保存滚动 如何访问 leagueTable 数组中的值 data fixtures fixtureId 4950418 fixture
  • ExecutorService 与休闲线程 Spawner

    我有一个关于如何的基本问题ExecutorService在 Java 中工作 很难看出简单创建之间的区别Threads并行执行一些任务并将每个任务分配给ThreadPool The ExecutorService使用起来也看起来非常简单和高

随机推荐

  • redis 配置

    root localhost hufh cd usr local src root localhost src ls redis 4 0 10 tar gz root localhost src tar zxvf redis 4 0 10
  • Vue 模拟通讯录列表用 js-pinyin 获取汉字首字母,形成字母索引

    效果图 流程 获取数据 提取首个字的拼音的首个字母 排序并分组 此功能用到Vant组件的 IndexBar 索引栏 1 安装 js pinyin npm地址 npm install js pinyin save 2 引入及使用
  • WindowsAPI 程序

    include
  • GZIP .gz 文件解压与压缩工具类

    package com ucf gatewaycheck utils import java util zip GZIPInputStream import java io FileOutputStream import java io F
  • 怎么提取图片里的颜色?图像颜色特征提取

    图像的颜色一直是研究和关注的热点 也是特征工程不可或缺的feature 今天就简单介绍一种非常基础的颜色的rgb特征 目的 我们希望图片的rgb特征转化成一个可衡量的指标 例如人的身高 体重 这样的指标173cm 60kg 用于后续工作 那
  • 在中断程序中,需要清中断标志,作用是什么?

    清中断标志的作用 响应中断条件是 中断使能和中断标志同时成立 一般来讲 响应中断后 有硬件清标志和软件清标志两种 如果硬件不能清标志 说明书会说明 单片机要靠查询中断标志来判断是否要进入中断 如果你不清除中断标志 本次中断退出 单片机又会检
  • ChatGPT 再遭禁用

    近日 三星电子宣布禁止员工使用流行的生成式AI工具 原因在于4月初三星内部发生的三起涉及 ChatGPT 误用造成的数据泄露事件 报道称 三星半导体设备测量资料 产品良率等内容或已被存入ChatGPT学习资料库中 去年11月上线以来 Cha
  • GoFrame系列:6、Swagger使用总结

    GoFrame系列 6 Swagger使用总结 文章目录 GoFrame系列 6 Swagger使用总结 1 swagger简述 2 GF框架使用swagger流程 3 示例 3 1 GET示例 3 2 POST示例 3 3 其它 4 最后
  • 各算法/协议知识理论笔记(fpga)

    一 利用fifo对3行数据求和 需要2个fifo保存第0行和第1行的数据 如下图 比如有20行数据 则将一行一行的输给fifo2 fifo2出来的数据再给fifo1 当fifo和fifo1有数据时 在准备给 fifo2输入新的一行数据时 同
  • python数据分析案例2

    load datasets import pandas as pd df 08 pd read csv all alpha 08 csv df 18 pd read csv all alpha 18 csv view 2008 datase
  • HTTP数据包

    HTTP协议和WEB应用 Web应用通常是指基于http的应用程序 HTTP协议简介 HTTP协议是HyperTextTransferProtocol 超文本传输协议 的缩写是用于 从万维网服务器传输超文本到本地浏览器的传 送协议 HTTP
  • 《Unix/Linux网络日志分析与流量监控》获2015年度最受读者喜爱的IT图书奖

    Unix Linux网络日志分析与流量监控 获2015年度最受读者喜爱的IT图书奖 刊登在 中华读书报 2015年01月28日 19 版 我的2015年新作刊登在 中华读书报 2015年01月28日 19 版 原文下载 http epape
  • Matlab中 pdist 函数详解(各种距离的生成)

    一 pdist Pairwise distance between pairs of objects Syntax D pdist X D pdist X distance Description D pdist X 计算 X 中各对行向量
  • [iOS开发]隐藏Tabbar顶部黑线

    define kIOS VERSION UIDevice currentDevice systemVersion floatValue define IOS8 OR LATER kIOS VERSION gt 8 0 define IOS9
  • 电力系统直流潮流分析【N-1】(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文档讲解 1 概述 该程序接受一个感受矩阵 B NxN
  • ensp解决virtualbox不兼容问题

    virtualbox版本5 2 44 这个版本很讲究 太高太低都不行 windows版本为20H2亲测有效 防火墙默认全关 另一台windows配置 系统型号 virtualbox型号 windows20h2 5 2 44 windows1
  • vite的依赖预构建

    一 什么是vite依赖预构建 依赖预构建是指 Vite 在启动时会对项目中的依赖进行分析并将其预构建成浏览器可识别的形式 这样在浏览器中加载组件时就无需再进行模块的编译和构建 大大提高了应用程序的运行速度 二 依赖预构建的目的 Common
  • BEVDet视觉检测方案

    github资源 GitHub HuangJunJie2017 BEVDet Official code base of the BEVDet series 源码解读 BEVDet系列源码解读 知乎
  • ansible报错:Failed to connect to the host via ssh: Permission denied

    原因 没有在ansible管理节点 即安装ansible的节点 上添加目标节点 即需要管理的节点 的ssh认证信息 解决办法 1 在管理节点生成公钥 ssh keygen 路径为 ssh id rsa pub 2 添加目标节点的SSH认证信
  • Findbugs中常见错误的分类和原因分析

    Findbugs 中的常用的bug pattern配置 Bug pattern description Bad practice 不好的习惯 Correctness 代码的正确性 Dodgy 小问题 Malicious code vulne