FindBugs —— Java 静态代码检查

在使用 Jenkins 构建 Java Web 项目时候,有一项叫做静态代码检查,是用内置的 findBugs 插件,对程序源代码进行检查,以分析程序行为的技术,应用于程序的正确性检查、

安全缺陷检测、程序优化等,特点就是不执行程序。它有助于在项目早期发现以下问题:变量声明了但未使用、变量类型不匹配、变量在使用前未定义、不可达代码、死循环、数组越界、内存泄漏等。分为以下几种类型:

一、Bad Practice (糟糕的写法)

二、Correctness (不太的当)

三、Experimental (实验)

四、Internationalization (国际化)

五、Malicious code vulnerability (有漏洞的代码)

六、Multithreaded correctness (多线程问题)

七、Performance (执行)

八、Security (安全性)

九、Dodgy code (可疑代码)

具体描述,可以参加如下地址:问题列表以及描述

常见的比如:

SBSC: Method concatenates strings using + in a loop (SBSC_USE_STRINGBUFFER_CONCATENATION)

问题描述已经很清楚了,尽量不要在循环中使用 String,用 StringBuffer 来代替:

The method seems to be building a String using concatenation in a loop. In each iteration, the String is converted to a StringBuffer/StringBuilder, appended to, and converted back to a String. This can lead to a cost quadratic in the number of iterations, as the growing string is recopied in each iteration.

Better performance can be obtained by using a StringBuffer (or StringBuilder in Java 1.5) explicitly.

For example:

  // This is bad
  String s = "";
  for (int i = 0; i < field.length; ++i) {
    s = s + field[i];
  }

  // This is better
  StringBuffer buf = new StringBuffer();
  for (int i = 0; i < field.length; ++i) {
    buf.append(field[i]);
  }
  String s = buf.toString();写段代码比较下:
 1 Long preSecond = System.currentTimeMillis();
 2 String str = "";
 3 int length = 10000;
 4 for (int i = 0; i < length; i++) {
 5   str += i;
 6 }
 7 System.out.println("cost " + (System.currentTimeMillis() - preSecond) + " seconds.");
 8 Long posSecond = System.currentTimeMillis();
 9 StringBuffer buffer = new StringBuffer();
10 for (int i = 0; i < length; i++) {
11   buffer.append(i);
12 }
13 System.out.println("cost " + (System.currentTimeMillis() - posSecond) + " seconds.");

输出结果为:

cost 363 seconds.
cost 3 seconds.

在一款优秀的 Java IDE —— IntellijIDEA 中,也可以安装对应的插件,来将这些问题扼杀在项目上线之前,避免不必要的麻烦。

安装以后,右击要分析的Java文件,选择Analyzed Files 即可

分析之后,如果有bugs,就会显示,然后根据提示来修正即可

时间: 2024-08-09 21:08:46

FindBugs —— Java 静态代码检查的相关文章

ant + findbugs 安装及实现静态代码检查,并生成HTML检查报告

1.ant + findbugs安装 通过Eclipse或者MyEclipse继承ant.findbugs插件.插件可以到网上去下. 注:findbugs最好是下载1.3.9版本,如果是其他版本,可能在运行的时候会提示版本冲突错误! 2.通过findbugs做静态代码检查,此处可以说有两种方式. A.直接生成HTML报告形式,在项目根目录下新建文件build.xml,将如下代码复制进去 <project name="DHOME_ANDRIOD_CodeCheck" default

常用 Java 静态代码分析工具的分析与比较

转载自: http://www.oschina.net/question/129540_23043 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBugs,PMD,Jtest),最后从功能.特性等方面对它们进行分析和比较,希望能够帮助 Java 软件开发人员了解静态代码分析工具,并选择合适的工具应用到软件开发中. 引言 在 Java 软件开发过程中,开发团队往往要花费大量的时间和精力发现并修改代

【转载】常用 Java 静态代码分析工具的分析与比较

摘自:http://www.oschina.net/question/129540_23043常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBugs,PMD,Jtest),最后从功能.特性等方面对它们进行分析和比较,希望能够帮助 Java 软件开发人员了解静态代码分析工具,并选择合适的工具应用到软件开发中. 引言 在 Java 软件开发过程中,开发团

[转载] 常用 Java 静态代码分析工具的分析与比较

转载自http://www.oschina.net/question/129540_23043 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBugs,PMD,Jtest),最后从功能.特性等方面对它们进行分析和比较,希望能够帮助 Java 软件开发人员了解静态代码分析工具,并选择合适的工具应用到软件开发中. 引言 在 Java 软件开发过程中,开发团队往往要花费大量的时间和精力发现并修改代码缺

静态代码检查报告

今天在下面刊载一篇小王同学写的静态代码检查报告,图文并茂,条理清晰. 1. 工具说明 FindBugs 是一个静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题.有了静态分析工具,就可以在不实际运行程序的情况对软件进行分析.不是通过分析类文件的形式或结构来确定程序的意图,而是通常使用 Visitor 模式.Findbugs可以在多个环境中运行,同时也可以编写自己的检测器,功能比较完善.我们平时可以收集自己的或者是别人的开发经验,把它做成检测器来完善Findb

Java静态代码分析工具Infer

Java静态代码分析工具Infer 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 一.Infer介绍 Infer是Facebook最新开源的静态程序分析工具,用于在发布移动应用之前对代码进行分析,找出潜在的问题.目前Facebook使用此工具分析Facebook的App,包括Android.iOS.Facebook Messenger和Instagram等. Facebook称该工具帮助其每个月检查出应用潜在的数百个Bug,例如一些空指针访问.资源

静态代码检查工具 cppcheck 的使用(可分别集成到VS和QT Creator里)

CppCheck是一个C/C++代码缺陷静态检查工具.不同于C/C++编译器及其它分析工具,CppCheck只检查编译器检查不出来的bug,不检查语法错误.所谓静态代码检查就是使用一个工具检查我们写的代码是否安全和健壮,是否有隐藏的问题. 比如无意间写了这样的代码: [cpp] view plain copy int n = 10; char* buffer = new char[n]; buffer[n] = 0; 这完全是符合语法规范的,但是静态代码检查工具会提示此处会溢出.也就是说,它是一

Java静态代码块、构造代码块、构造方法的执行顺序

Java静态代码块.构造代码块.构造方法的执行顺序 静态代码优先于非静态的代码,是因为被static修饰的成员都是类成员,会随着JVM加载类的时候加载而执行,而没有被static修饰的成员也被称为实例成员,需要创建对象才会随之加载到堆内存.所以静态的会优先非静态的. 执行构造器(构造方法)的时候,在执行方法体之前存在隐式三步: 1,super语句,可能出现以下三种情况: 1)构造方法体的第一行是this语句,则不会执行隐式三步, 2)构造方法体的第一行是super语句,则调用相应的父类的构造方法

如何分析android的OOM,与java静态代码分析工具

用MAT分析OOM 很多OOM看似发生在bitmap 分配得时候,但它一般不是rootcause.根本原因都在于本应该自动释放的资源,因为代码的错误,而导致某些对象一直被引用(Reference),例如 Android 内存优化,如何避免OOM 文章中提到的Activity 的mContext 引用. 当代码量很庞大的时候,单靠读代码查找错误是很困难的,所以必须借助于工具,这里介绍一款很好用的分析工具MAT. 1.下载MAT http://www.eclipse.org/mat/download