转自:http://blog.lichengwu.cn/java/2013/11/24/use-findbugs-code-review/

介绍

Findbugs是一个代码静态分析工具,用来找出Java代码中的bug。通过分析字节码并与一组缺陷模式匹配,找出代码中的问题。

目前Findbugs支持除了java 8以外的所有版本编译的字节码文件分析。

Findbugs不仅提供了可视化界面,还有Idea,Eclipse插件。

Findbugs有谷歌和SUM/(Oracle)支持,在JDK源码编译中,依赖了Findbugs对JDK源码的检查。也就是说,虽然可以自由编译JDK,但是如果修改后的代码太烂,不能通过Findbugs的检查,一样不能通过编译。

使用

项目地址:http://findbugs.sourceforge.net/

Findbugs支持命令行,ant,可视化界面和IDE插件方式运行,以IDEA的插件使用为例。

Eclipse插件安装地址:http://findbugs.cs.umd.edu/eclipse/

IDEA插件安装地址:http://plugins.jetbrains.com/plugin/3847


支持类型

在Findbugs中能找到下面类型的bug(有些不算是bug,应该说是不好的实践)。

Cateory
Number
Samples

Correctness

142

Illegal format string

Null value is guaranteed to be dereferenced

Call to equals() comparing unrelated class and interface

Bad practice

84

Confusing method names

Method may fail to close stream

Comparison of String parameter using == or !=

Dodgy code

71

Useless control flow

Integer remainder modulo 1

Redundant null check of value known to be null

Multithreaded Correctness

45

A thread was created using the default empty run method

Class's writeObject() method is synchronized but nothing else is

Performance

27

Method concatenates strings using + in a loop

Method invokes inefficient Boolean constructor

Malicious Code Vulnerability

15

Finalizer should be protected, not public

Field isn't final and can't be protected from malicious code

Security

11

Hardcoded constant database password

A prepared statement is generated from a variable String

Experimental

3

Method may fail to clean up stream or resource

Internationalization

2

Consider using Locale parameterized version of invoked method

发现代码中的问题
性能:

低效的迭代器:

修改后:

for (Integer groupKey : groupList.keySet())
    insertGroupedList(groupKey);
}

装箱/拆箱0L在java.lang.Long中是有缓存的,所以常量0L先拆箱成小long,然后赋值给agengId的时候装箱成大Long,两次操作就是没有必要的。

修改后:

agentId = (agentId == null) ? Long.valueOf(0) : agentId;

静态变量:

这个常量是在初始化的时候赋值的,在内存中没有必要存在多份,可以声明成static。

内部类,何不静态?

MuFlightInfoDO是MuFlightFareQuery的内部类,MuFlightInfoDO的实例保存了一份创建它的类(MuFlightFareQuery)的引用,这样不仅使MuFlightInfoDO类占用更大的空间,而且是外部的MuFlightFareQuery生命周期更长了。

不好的实践:

忽略异常:

集合使用removeAll来清理:

直接调用clear()或者是个bug?

流程:

else if里面有没任何代码,考虑删除。

集合:

hsfServices 声明成map:ConcurrentHashMap<String,HSFSpringConsumerBean hsfServices>

在这里hsfServices.contains(key)参数是String类型,但是声明的map是HSFSpringConsumerBean类型,应该永远不会返回true,应该是containsKey吧?

equal类型不匹配:

dfare.getAgentSupportType().equals(AgentSupportType.ONE) 左边Integer,右边enum。

线程安全:

DateFormat

DateFormat不是线程安装的,在这里声明为类成员,会有问题。

总结

有些代码问题在人为的review的时候很难发现,如果上线了会有很大的隐患,虽然当时没有出现bug。利用Findbugs在提交代码的时候自己进行review。让你的代码出更少的bug。

Keep the bar green, keep you code clean.

使用findbugs为自己的代码review的更多相关文章

  1. 部署代码review和CI

    公司原先搭了一个代码Review的服务器,由于历史原因,装的是一个32bit的Ubuntu系统,后来由于需要,需要安装gitlab,由于gitlab需要64位系统,所以临时凑合了个vagrant,本质 ...

  2. 前端代码质量保障之代码review

    经验丰富的程序员和一般程序员之间的最大区别,不仅体现在解决问题的能力上, 还体现在日常代码的风格上.掌握一门技术可能需要几月,甚至几周就够了. 好的习惯风格养成却需数年. 团队成员之间需要合作,代码需 ...

  3. 由学习《软件设计重构》所想到的代码review(一)

    前言 对于一个程序猿来讲怎样来最直接的来衡量他的技术能力和产出呢?我想最直观的作法是看他的代码编写能力,就拿我常常接触的一些程序猿来看,他们买了非常多技术重构类书籍.可是看完后代码编写能力并没有显著提 ...

  4. 对于近阶段公司代码 review 小结

    来新公司,给公司的SDK review了一下.发现了不少小问题,在此总结一下. (我下面说明问题可能是很简单,但是搞清楚某些问题还是花了些时间的,大家引以为戒吧) 先谈谈处理的问题: 1.某天QA说有 ...

  5. 代码review的流程

    以前我们一直都是如果要进行代码review的时候,要不我们就直接用idea来进行查看,根据不同的来查看 但是我们都是看代码的不同来进行来实现的,其实我们不需要这样,我们可以使用工具Phabricato ...

  6. 研发团队如何借助Gitlab来做代码review

    代码review是代码质量保障的手段之一,同时开发成员之间代码review也是一种技术交流的方式,虽然会占用一些时间,但对团队而言,总体是个利大于弊的事情.如何借助现有工具在团队内部形成代码revie ...

  7. Gitlab来做代码review

    Gitlab来做代码review 代码review是代码质量保障的手段之一,同时开发成员之间代码review也是一种技术交流的方式,虽然会占用一些时间,但对团队而言,总体是个利大于弊的事情.如何借助现 ...

  8. 代码review

    对于代码review个人也有些小小的看法: 1.首先我觉得我们所有开发人员要弄明白 现在Code Review 的目的 ,凡事不弄明白目的,无法做好完成一件事情,个人觉得有以下一些目的: a)可以在项 ...

  9. Gerrit代码Review实战

    代码审核(Code Review)是软件研发质量保障机制中非常重要的一环,但在实际项目执行过程中,却因为种种原因被Delay甚至是忽略.在实践中,给大家推荐一款免费.开放源代码的代码审查软件Gerri ...

随机推荐

  1. 使用java做paypal开发时购买东西支付不成功的原因

    使用java做paypal开发时购买东西支付不成功的原因 没有设置网站习惯设定,登陆自己的paypal账户,在网站习惯设定上填写回调的url路径,这样就可以 支付成功了并且异步修改订单的状态. 支付成 ...

  2. [转]关于docker包存储结构说明

    原文:http://blog.csdn.net/w412692660/article/details/49005631 前段时间与同事交流docker的安装包层次结构,并沟通相关每个文件的作用,但是一 ...

  3. b3_trcd_EDCD_new

    # -*- coding:utf-8 -*- import re year="17A" ss='./data/' filename = ss+'EDCD%s.txt'%year ' ...

  4. smarty-2014-02-28

    使用smarty,在tpl文件中如何使用相对路径调用css&javascript文件,实际上这个相对路径的参照物就是以调用该tpl文件的php文件来写. 假如,我在index.php这个文件中 ...

  5. EBS FORM 编译

    http://www.cnblogs.com/quanweiru/archive/2013/01/01/2841574.html EBS R11============================ ...

  6. JS代码指导原则

    一.什么是平稳退化? 如果含有JS代码的网页在用户浏览器不支持JS(或者禁用JS)时,用户仍然能够顺利浏览(网站功能正常,只是视觉效果可能差一些),那么这个网页就能够平稳退化 网页能够平稳退化是很必要 ...

  7. [翻译]ASP.NET Web API 2 中的全局错误处理

    目录 已存在的选项 解决方案预览 设计原则 什么时候去用 方案详情 示例 附录: 基类详情 原文链接 Global Error Handling in ASP.NET Web API 2 由于翻译水平 ...

  8. C# volatile 关键字

    volatile 就像大家更熟悉的const一样,volatile是一个类型修饰符(type specifier).它是被设计用来修饰被不同线程访问和修改的变量.如果不加入volatile,基本上会导 ...

  9. WireShark 查看UDP码流的丢包率

    1.用wireshark抓包之后,右击,点decode as,转化为RTP 2. 点show all streams 3.分析

  10. 关于Select选中问题

    jquery根据text选中option的问题: 网上找了好多,但发现因为jquery版本问题,很多并不能用.   最后成功了,写法如下:   $('#shop option:contains(' + ...