Idea代码走查工具FindBus使用以及缺陷分析

news2025/7/7 18:11:03

1. 简介

Findbugs是一个静态分析工具,它检查类或者jar文件,将字节码与一组缺陷模式进行对比以发现可能的问题。利用这个工具可以在不实际运行程序的情况下对软件进行分析。可以帮助改进代码质量。Findbugs提供了方便操作的可视化界面,同时,也可以作为idea插件来使用。

2. 安装

  1. 下载:https://plugins.jetbrains.com/plugin/3847-findbugs-idea/versions

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. Idea集成,File->Settings->Plugins

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 重启,装成功后在idea界面有相应findbugs标识和右键功能菜单.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3. 缺陷分类

Findbugs找出的bug有三种颜色:

  1. 黑色的臭虫标志是分类;

  2. 红色的臭虫标志表示严重bug,发现后必须修改代码;

  3. 橘黄色的臭虫标志表示潜在警告性bug,应尽量修改;

3.1 Bad practice

Bad practice:不好的做法,代码违反了公认的最佳实践标准,比如某个类实现了equals方法但未实现hashCode方法等;

1. Class names should start with an upper case letter

主要包括类名的命名,以大写字母开头。

2. Method names should start with a lower case letter

方法名以小写字母开头。

3. Field names should start with a lower case letter

字段名以小写字母开头。

4. equals()method does not check for null argument equals()

方法应该检查非空。

5. Class defines equals() and uses Object.hashCode()

一个类覆写了equals方法,没有覆写hashCode方法,使用了Object对象的hashCode方法。

6. Method ignores exceptional return value

方法忽略返回值的异常信息。

7. 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类型的对象。

8. Method might ignore exception

方法可能忽略异常。

9.Method invokes System.exit()

在方法中调用System.exit(…)语句,考虑用RuntimeException来代替。

10.Method ignores result of InputStream.read() InputStream.read

方法忽略返回的多个字符,如果对结果没有检查就没法正确处理用户读取少量字符请求的情况。

3.2 Malicious code vulnerbility

恶意的代码漏洞。

3.3 Correctness

可能不正确,比如错误的强制类型转换。

1. Nullcheck of value previously dereferenced

此代码之前废弃null值检查。解决办法 进行null检查。

2. Possible null pointer dereference

可能为null。

3. Null pointer dereference

对象赋为null值后没有被重新赋值。

4. Possible null pointer dereference in method on exception path

在异常null值处理分支调用的方法上,可能存在对象去除引用操作。

5. value is null and guaranteed to be dereferenced on exception path exception

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

6.Self comparison of value with itself

方法中对一个局部变量自身进行比较运算,并可说明错误或逻辑错误。请确保您是比较正确的事情。

7. An apparent infinite recursive loop

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

3.4 Performance

潜在的性能问题。

1. Boxing/unboxing to parse a primitive

类型转换,比如字符串转换成int 应该使用Integer.parseInt(“”) 代替Integer.valueOf(“”)。

2. Method concatenates string using + in aloop

每次循环里的字符串+连接,都会新产生一个string对象,在java中,新建一个对象的代价是很昂贵的,特别是在循环语句中,效率较低。解决办法:使用StringBuffer或者StringBuilder重用对象。

3. Private method is never called

私有方法没有被调用。

4. Explicit garbage collection;extremely dubious except in benchmarking code

在代码中显式的调用垃圾回收命名,这样做并不能起作用。在过去,有人在关闭操作或者finalize方法中调用垃圾回收方法导致了很多的性能浪费。这样大规模回收对象时会造成处理器运行缓慢。

5. Unread field:should this field be static?

没有用到的static 字段。

6. should be a static inner class

此内部类应该使用static修饰。

3.5 Security

安全性。

3.6 Dodgy code

糟糕的代码,FindBugs团队认为该类型下的问题代码导bug的可能性很高。

1. Switch statement found where default case is missing Switch

没有默认情况下执行的case语句。

2. Switch statement found where one case falls through to the next case Switch

语句中一个分支执行后又执行了下一个分支。通常case后面要跟break 或者return语句来跳出。

3. Dead store to local variable

该指令为局部变量赋值,但在其后的没有对她做任何使用。通常,这表明一个错误,因为值从未使用过。

4. Write to static field from instance method

在实例方法写入静态字段。

5. Redundant nullcheck of value known to be non-null

方法中对不为空的值进行为空的判断。

6. Method uses the same code for two branches

此方法使用相同的代码,以实现两个有条件的分支。检查以确保这是不是一个编码错误。

7. Exception is caught when Exception is not thrown

在try/catch块中捕获异常,但是异常没有在try语句中抛出而RuntimeException又没有明确的被捕获。

8. Integral division result cast to double or float

整形数除法强制转换为double或者float类型。

9. Possible null pointer dereference due to return value of called method

方法的返回值没有进行是否为空的检查就重新赋值,这样可能会出现空指针异常。

10. Useless object created

对象创建了并没有用。

11. Unread public/protected field

没有用到的字段。

12. Internationalization

关于代码国际化相关方面的。

13. Consider using Locale parameterized version of invoked method

使用平台默认的编码格式对字符串进行大小写转换,这可能导致国际字符的转换不当。使用以下方式对字符进行转换

3.7 Experimental

实验。

1. Method may fail to clean up stream or resource on checked exception
这种方法可能无法清除(关闭,处置)一个流,数据库对象,或其他资源需要一个明确的清理行动,解决方法:流的关闭都写在finally里面。

2. Malicious code vulnerability

关于恶意破坏代码相关方面的

3. May expose internal representation by incorporating reference to mutable object

此代码把外部可变对象引用存储到对象的内部表示。如果实例受到不信任的代码的访问和没有检查的变化危及对象和重要属性的安全。存储一个对象的副本,在很多情况下是更好的办法。

4. Field isn’t final but should be

此字段前应该加final。

5. Field isn’t final and can’t be protected from malicious code

此字段前应该加final。

6. Field should be package protected

一个静态字段是可以被恶意代码或其他的包访问修改。可以把这种类型的字段声明为final类型的以防止这种错误。

3.8 Multithreaded correctness

关注于同步和多线程问题。

1.Static DateFormat DateFormat

在多线程中本身就是不安全的,如果在线程范围中共享一个DateFormat的实例而不使用一个同步的方法在应用中就会出现一些奇怪的行为。

2.Call to static DateFormat DateFormats

多线程使用本事就是不安全的,改进方法:需要创建多实例或线程同步。

3.9 Internationalization

国际化。

更多缺陷说明可见https://blog.csdn.net/lmb55/article/details/79430927

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1320693.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[计网00] 计算机网络开篇导论

目录 前言 计算机网络的概念 计算机网络的分层 计算机网络的分类 网络的标准化工作和相关组织 计算机网络的性能指标 前言 计算机网络在我们的日常生活中无处不在 在网络会有各种各样的协议和封装 保证我们的信息完整,无误的在各个客户端之前传输 计算机网络的概念 四…

Unity与Android交互通信系列(2)

在上一篇文章中,我们介绍了Unity和Android交互通信的原理及在Unity中直接调用Java代码的方式,但没有给出代码示例,下面通过实际例子演示上篇文章中AndroidJavaClass、AndroidJavaObject两个类的基本用法,由于交互通信涉及到两端&a…

1KW逆变器UPS纯正弦波方案

硬件方案--110V方案 本套逆变器方案分110V输出以及220V输出,电池最大电压是48V,包括了LCD。110V方案主控使用的dsp是MICROCHIP(美国微芯)的dsPIC33FJ16GS504芯片,ACDC控制器是TOP250YN,运算放大器包含LM358、MCP6022,电…

Spring IOC 原理(二)

Spring IOC 原理 概念 Spring 通过一个配置文件描述 Bean 及 Bean 之间的依赖关系,利用 Java 语言的反射功能实例化Bean 并建立 Bean 之间的依赖关系。 Spring 的 IoC 容器在完成这些底层工作的基础上,还提供了 Bean 实例缓存、生命周期管理、 Bean 实…

【数据结构复习之路】图(严蔚敏版)两万余字超详细讲解

专栏:数据结构复习之路 复习完上面四章【线性表】【栈和队列】【串】【数组和广义表】【树和二叉树】,我们接着复习 图,这篇文章我写的非常详细且通俗易懂,看完保证会带给你不一样的收获。如果对你有帮助,看在我这么辛…

我愿称其为神器-vscode-vim自动切换输入法

我愿称其为神器-vscode-vim自动切换输入法 smartinput在linux下无效 首先在 文件->首选项->配置 找到setting.json 在这个github中给出了详细的config.json配置文件 https://github.com/daipeihust/im-select/blob/master/README_CN.md 因为我使用的是ibus,在将set…

javaSE学习-3-数组的定义与使用

1 数组的创建及初始化 int[] array1 new int[10]; // 创建一个可以容纳10个int类型元素的数组 double[] array2 new double[5]; // 创建一个可以容纳5个double类型元素的数组 String[] array3 new double[3]; // 创建一个可以容纳3个字符串元素的数组 2 基本类型变量与…

新人做自动化测试,记住这5点涨薪指日可待...

关于新人如何做好自动化测试,以下是我个人的一些思考。 01、测试基础的重要性 作为一名测试新人,测试基础非常非常重要。这里说的基础,不仅仅是什么是软件测试、软件测试的目的,而是测试用例的设计能力。 因工作的原因&#xf…

教育机构小程序管理系统的全方位优化

随着互联网的快速发展,线上教育也日益受到人们的关注和欢迎。为了满足广大学生和家长的需求,教育机构纷纷开发出自己的小程序管理系统。本文将详细介绍如何使用乔拓云平台,一键开发出自己的教育机构小程序管理系统。 1.进入乔拓云后台 首先&…

记一次java for循环改造多线程的操作

背景 今天在开发质量平台时需要获取某些数据,要请求公司某个工程的OpenAPI接口A。此接口为返回通用数据的接口,且接口本身的RT都在2~3秒之间。使用该接口,需要进行两次循环获取,然后对返回数据进行处理组装&#xff0…

弹窗“由于找不到xinput1_3.dll,无法继续执行代码”的几种解决方法分享

日常中,我们在使用电脑过程中,偶尔会遇到一些错误提示“由于找不到xinput1_3.dll,无法继续执行代码”,这个报错会让程序无法正常运行的情况。那么,xinput1_3.dll到底是什么?它丢失会对计算机产生什么影响呢&#xff1f…

健康卤味思想引领市场新潮流,卤味市场迎来健康变革

健康卤味思想正在逐渐渗透到卤味市场中,引领着消费者对于卤味产品的选择和需求。这一变革不仅为消费者带来了更加健康、美味的卤味产品,也为卤味市场注入了新的活力。 一、健康卤味思想的兴起 随着消费者对于健康饮食的关注度不断提高,健康卤…

频谱论文:基于张量Tucker分解的频谱地图构建算法

#频谱# [1]陈智博,胡景明,张邦宁 郭道省.(2023).基于张量Tucker分解的频谱地图构建算法.电子与信息学报(11),4161-4169. (陆军工程大学) 研究内容 将动态电磁环境的时变频谱地图建模为3维频谱张量,通过张量Tucker分解提取出具有物理意义的核…

Linux---Ubuntu软件卸载

1. 软件卸载的介绍 Ubuntu软件卸载有两种方式: 离线安装包的卸载(deb 文件格式卸载)在线安装包的卸载(apt-get 方式卸载) 2. deb 文件格式卸载 命令格式: sudo dpkg –r 安装包名 -r 选项表示安装的卸载 dpkg 卸载效果图: 3. apt-get 方式卸载 命令格式: …

svn 安装

安装系统 ubuntu 22 安装命令: sudo apt-get install subversion 创建第一个工程: 创建版本库、项目 1、先创建svn根目录文件夹 sudo mkdir /home/svn 2、创建项目的目录文件夹 sudo mkdir /home/svn/demo_0 svnadmin create /home/svn/demo_0 配置&a…

【Redis】五、Redis持久化、RDB和AOF

文章目录 Redis持久化一、RDB(Redis DataBase)触发机制如何恢复rdb文件 二、AOF(Append Only File)三、扩展 Redis持久化 面试和工作,持久化都是重点! Redis 是内存数据库,如果不将内存中的数据…

单元测试计划、用例、报告、评审编制模板

单元测试支撑文档编制模板,具体文档如下: 1. 单元测试计划 2. 单元测试用例 3. 单元测试报告 4. 编码及测试评审报告 软件项目相关资料全套获取:软件项目开发全套文档下载-CSDN博客 1、单元测试计划 2、单元测试用例 3、单元测试报告 4、编码…

使用数组模拟栈的相关操作【栈1.1】

public class ArrayStackDemo {public static void main(String[] args) {ArrayStack arrayStack new ArrayStack(4);Scanner sc new Scanner(System.in);boolean loop true;char key ;while (loop) {System.out.println("栈操作菜单项");System.out.println(&q…

python绘图总结

1 二维图像 1.1 二维曲线 plot(x, y, ls"-", lw1.5, labelNone)x, y:横坐标和纵坐标ls:颜色、点标记、线型列表,如 ls‘r*-’ 表示红色实线、*形点,ls‘g.’ 表示绿色散点lw:线宽度label:线标签…

ros2+在Ubuntu上安装gazebo

Binary Installation on Ubuntu(Ubuntu上binary方式安装gazebo) Harmonic binaries are provided for Ubuntu Jammy (22.04) and Ubuntu 24.04 (when its released). (在Ubuntu22.04或者24.04上都是安装Harmonic版本的gazebo)The Harmonic binaries are…