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

2023-12-19 04:28

本文主要是介绍Idea代码走查工具FindBus使用以及缺陷分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

这篇关于Idea代码走查工具FindBus使用以及缺陷分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/510888

相关文章

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学

Python实现文件下载、Cookie以及重定向的方法代码

《Python实现文件下载、Cookie以及重定向的方法代码》本文主要介绍了如何使用Python的requests模块进行网络请求操作,涵盖了从文件下载、Cookie处理到重定向与历史请求等多个方面,... 目录前言一、下载网络文件(一)基本步骤(二)分段下载大文件(三)常见问题二、requests模块处理

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.

IDEA如何让控制台自动换行

《IDEA如何让控制台自动换行》本文介绍了如何在IDEA中设置控制台自动换行,具体步骤为:File-Settings-Editor-General-Console,然后勾选Usesoftwrapsin... 目录IDEA如何让控制台自http://www.chinasem.cn动换行操作流http://www

使用TomCat,service输出台出现乱码的解决

《使用TomCat,service输出台出现乱码的解决》本文介绍了解决Tomcat服务输出台中文乱码问题的两种方法,第一种方法是修改`logging.properties`文件中的`prefix`和`... 目录使用TomCat,service输出台出现乱码问题1解决方案问题2解决方案总结使用TomCat,

IDEA运行spring项目时,控制台未出现的解决方案

《IDEA运行spring项目时,控制台未出现的解决方案》文章总结了在使用IDEA运行代码时,控制台未出现的问题和解决方案,问题可能是由于点击图标或重启IDEA后控制台仍未显示,解决方案提供了解决方法... 目录问题分析解决方案总结问题js使用IDEA,点击运行按钮,运行结束,但控制台未出现http://

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

vscode保存代码时自动eslint格式化图文教程

《vscode保存代码时自动eslint格式化图文教程》:本文主要介绍vscode保存代码时自动eslint格式化的相关资料,包括打开设置文件并复制特定内容,文中通过代码介绍的非常详细,需要的朋友... 目录1、点击设置2、选择远程--->点击右上角打开设置3、会弹出settings.json文件,将以下内

Java中使用Java Mail实现邮件服务功能示例

《Java中使用JavaMail实现邮件服务功能示例》:本文主要介绍Java中使用JavaMail实现邮件服务功能的相关资料,文章还提供了一个发送邮件的示例代码,包括创建参数类、邮件类和执行结... 目录前言一、历史背景二编程、pom依赖三、API说明(一)Session (会话)(二)Message编程客

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(