Lab4经验小结-关于Idea中spotbugs的安装使用与错误分析

2020-6-14更新

看到评论区有小伙伴存在搜不到本插件的情况,可以访问官网插件库手动配置spotbugs。

第一步 找到所有插件选项

idea配置中的scopes idea spot_idea配置中的scopes

第二步 搜索spotbugs

idea配置中的scopes idea spot_迭代_02

第三步 选择好本地IDE,安装即可

idea配置中的scopes idea spot_迭代_03


本次实验中使用spotbugs工具对代码进行静态检查。发现了许多编译器发现不了的隐藏bug。本文记录了在Idea环境下spotbugs的配置与使用。以及一些常见错误提示。

目录

  • Lab4经验小结-关于Idea中spotbugs的安装使用与错误分析
  • 2020-6-14更新
  • 第一步 找到所有插件选项
  • 第二步 搜索spotbugs
  • 第三步 选择好本地IDE,安装即可
  • spotbugs的安装
  • spotbugs的使用
  • 错误类型
  • 实验中遇到的常见错误
  • 总结


spotbugs的安装

打开Idea,依次打开file->settings

idea配置中的scopes idea spot_idea配置中的scopes_04


然后找到plugins栏,搜索spotbugs:

idea配置中的scopes idea spot_连接字符串_05


安装即可。

spotbugs的使用

在想要进行静态代码检查的工程或者类中右键spotbugs,根据需要选择不同的文件进行分析即可。

idea配置中的scopes idea spot_搜索_06


执行后:

idea配置中的scopes idea spot_idea配置中的scopes_07


这里由于我已经处理完所有的错误,显示found 0 bug

错误类型

阅读了官方的文档后,了解到spotbugs主要包括10大类bug,他们分别是:
1.Bad practice(90余种)不良的实践,违反常识性的或者必要的代码惯例,比如重写了equals却没有重写hashcode。
2.Correctness (150余种) 此处的代码有可能在运行时导致错误,与预期不符,比如空指针错误。
3.Experimental(9种)spotbugs在此处不适用,大概是匹配模式不太适用于此处。
4.Internationalization(2种)原文是:code flaws having to do with internationalization and locale,没有遇到过类似的错误。
5.Malicious code vulnerability(17种)代码具有被恶意代码攻击的风险。比如返回一个可变类型引用并保存在对象字段中。
6.Multithreaded correctness(46种)线程安全,比如可能造成死锁的代码。
7.Bogus random noise(4种)并不是软件中的实际错误。
8.Performance(37种)性能不好的代码,比如在迭代中使用“+”连接字符串。
9.Security(11种)使用了不安全的外部输入,可能导致远程控制的漏洞。
10.Dodgy(87种)导致自身混乱的代码

实验中遇到的常见错误

1.Comparison of String objects using == or !=(Bad Practice)

String对象进行比较的时候:只有两种情况可以使用== or !=的,这两种情况是;在源文件中是个常数或者是调用String.intern()方法,使用String的规范化表示形式来进行比较,如果不是这两中情况的话推荐使用equals方式。

2.Boxing/unboxing to parse a primitive init (Performance)

代码中使用的Integer.valueOf()经历了String - int - Integer - int的过程,使用Integer.paseInt()可以节约int 转Integer的过程。

3.Method names should start with a lower case letter(Performance)

方法名应该以小写字母开头,不好的编程习惯。

4.Method concatenates strings using + in a loop(Performance)

在迭代的时候使用了“+”来连接字符串。这样的话在每次迭代中,字符串转换为一个StringBuffer / StringBuilder的,连接起来,并转换回为String。这可能导致成本的二次迭代,因为不断增长的字符串是在每次迭代中重新复制。可使用StringBuffer(或StringBuilder的)会拥有更好的性能。

比如:

idea配置中的scopes idea spot_迭代_08


------------------------------------->

idea配置中的scopes idea spot_连接字符串_09


5.Call to equals() with null argument

在调用equals的时候参数传递了空值。

6.Unread field

代码中存在没有使用过的域,虽然不会造成编译失败,但这个字段是不必要的且容易造成误解,应当删除。

7.Dead store to local variable

代码中存在没有使用过的多余的变量。建议删除。

总结

spotbugs的使用不仅帮我们消除了许多潜在的bug。在解决许多的很蠢的错误后(比如本地的变量没有使用)写代码就会更加小心。同时善于使用spotbugs也助于培养好的编程习惯(以后就不会再在迭代中使用+号来连接字符串了)。
不要对自己的代码过于自信,小心翼翼,草木皆兵地对待自己的代码才是从编程菜鸟成长为一个靠谱的优秀程序员的好方法。