转自: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. T4系列文章之2:T4工具简介、调试以及T4运行原理(转)

    出处:http://www.cnblogs.com/damonlan/archive/2012/01/12/2320429.html 一.前言 经过第一篇,我想大家现在对T4有了基本的印象,应该对T4 ...

  2. python3.4用循环往mysql5.7中写数据并输出

    #!/usr/bin/env python # -*- coding:utf-8 -*- # __author__ = "blzhu" """ pyt ...

  3. UltraEdit配置

    1.如何在vivado中调用UltraEdit 1.语法高亮 支持不同的编程语言,但是要添加相就的文件,这样不同语言的关键字就可以高亮显示. 在高级-> 配置 –> 语法高亮,选择文档 2 ...

  4. Ansible 笔记 (3) - 编写 playbook

    playbook 相当于多个命令的编排组合然后一起运行,类似写脚本.在学习 playbook 之前需要了解 yaml 格式. 编写playbook的步骤: 定义主机与用户 编写任务列表 执行 play ...

  5. SSH:Struts + Spring + Hibernate 轻量级Java EE企业框架

    Java EE(Java Platform,Enterprise Edition)是sun公司(2009年4月20日甲骨文将其收购)推出的企业级应用程序版本.这个版本以前称为 J2EE.能够帮助我们开 ...

  6. Linux中的LVM和软RAID

        在实际工作中,会经常碰到所给的服务器硬盘容量太小,而实际的应用软件中却需要一个容量较大的分区进行数据存储等,除了通过硬件RAID卡来实现合并多硬盘外,其实我们也可以通过软件的方式来实现. 实验 ...

  7. Android-项目所有文件报红色j,状态栏无法Run 'app'

    项目所有文件报红色j,不可用状态 状态栏如下: 无法 Run 'app' 无法 Debug 'app' ........... 以下操作按钮灰色的,无法点击: 解决方案: 只需要:Sync Proje ...

  8. 探索TFS Git 库文件换行(CRLF)的处理方式

    (2018.12.29 更新,增加Git处理方式) 在计算机的技术中,所有文本信息都会涉及换行的问题.例如,你在键盘上敲击一次Enter(回车)键,系统将在文本重增加一行,实际上系统已经在文件中插入了 ...

  9. .NET高级代码审计(第一课)XmlSerializer反序列化漏洞

    0X00 前言 在.NET 框架中的 XmlSerializer 类是一种很棒的工具,它是将高度结构化的 XML 数据映射为 .NET 对象.XmlSerializer类在程序中通过单个 API 调用 ...

  10. Log4Net从Mvc转到.Net Core

    原项目用的Log4Net,不过版本比较旧,在Core里新版也进行了支持,本文用的是现在最新版本2.0.8 1.LogHelper帮助类放另一个类库中 Log/LogHelper.cs 2.单独建的配置 ...