find函数介绍java,FindBugs简单介绍即使用

FindBugs是一款开源的Java代码检查工具,它通过对比字节码和缺陷模式来检测潜在问题,包括空指针、无限递归、死锁等。工具涵盖了恶意代码、性能、多线程正确性等多个方面的检查。用户可以在Android Studio或IDEA中安装插件使用,通过设置检查范围查看不同类型的错误详情,并进行修复。错误详情包括错误类型、位置、严重等级和描述,帮助开发者改进代码质量。
摘要由CSDN通过智能技术生成

FindBug 是一款开源的 Java 代码检查工具,遵循GNU 公共许可协议。它可以检查 Java 类或者 JAR 文件,运行的是 Java 字节码而不是源码,

检查原理是:将字节码与一组缺陷模式进行对比来发现可能存在的问题。这些问题包括空指针引用、无限递归循环、死锁等。

检查的 bug 类型包括:

54250b669a2e

findBugs_demo.png

Malicious code vulnerability:恶意代码

Dodgy code:不符合规范的代码

Internationalization:国际化相关问题,如错误的字符串转换;

Bad practice:坏的实践:常见代码错误,序列化错误,用于静态代码检查时进行缺陷模式匹配;

Multithreaded correctness:多线程的正确性:如多线程编程时常见的同步,线程调度问题;

Performance:运行时性能问题,如由变量定义,方法调用导致的代码低效问题。

Correctness:可能导致错误的代码,如空指针引用等;

Experimental:可能受到的恶意攻击,如访问权限修饰符的定义等;

Security:安全性

在线安装FindBugs:

首先打开 Android Studio或IDEA 的设置中的插件,输入 FindBugs,如下图所示,点击 Browse查找,选择 FindBugs-IDEA然后单击右侧的 Install 按钮进行安装(因为这里已经安装了 FindBugs所以右侧没有 Install 按钮);安装完后重启

54250b669a2e

安装

findBugs基本使用

FindBugs的界面窗口,如下图:

54250b669a2e

基本使用

图上标注的含义:

检查范围

标注1:检查当前类(只有在选中类的时候可点击)。

标注2:检查当前包。

标注3:检查当前模块。

标注4:检查当前项目。

标注5:自定义设置检查范围。

结果查看方式

标注6:按照bug类型查看。

标注7:按照类查看。

标注8:按照包结构查看。

标注9:按照bug等级查看。

错误详情说明

先看下图

54250b669a2e

错误详情说明

图中编号标注的含义

标注1 错误详情标题描述

标注2 所在的类 、行数

标注3 错误类型

标注4 错误所在的方法

标注5 错误笔记,可以看到是那个地方的错误

标注6 错误所在的区域,明确指出是那个地方出的错

标注7 priority 代表了严重等级,红色最严重

标注8 对错误的描述,及可能出现的问题

标注9 错误在代码中的位置

标注10 错误在代码中的位置

在标注9和标注10处修改会互相同步

FindBugs的Bug种类说明

Bad practice 坏的实践

一些不好的实践,下面列举几个:

HE: 类定义了equals(),却没有hashCode();或类定义了equals(),却使用Object.hashCode();或类定义了hashCode(),却没有equals();或类定义了hashCode(),却使用Object.equals();类继承了equals(),却使用Object.hashCode()。

SQL:Statement 的execute方法调用了非常量的字符串;或Prepared Statement是由一个非常量的字符串产生。

DE: 方法终止或不处理异常,一般情况下,异常应该被处理或报告,或被方法抛出。

Malicious code vulnerability 可能受到的恶意攻击

如果代码公开,可能受到恶意攻击的代码,下面列举几个:

FI: 一个类的finalize()应该是protected,而不是public的。

MS:属性是可变的数组;属性是可变的Hashtable;属性应该是package protected的。

Correctness 一般的正确性问题

可能导致错误的代码,下面列举几个:

NP: 空指针被引用;在方法的异常路径里,空指针被引用;方法没有检查参数是否null;null值产生并被引用;null值产生并在方法的异常路径被引用;传给方法一个声明为@NonNull的null参数;方法的返回值声明为@NonNull实际是null。

Nm: 类定义了hashcode()方法,但实际上并未覆盖父类Object的hashCode();类定义了tostring()方法,但实际上并未覆盖父类Object的toString();很明显的方法和构造器混淆;方法名容易混淆。

SQL:方法尝试访问一个Prepared Statement的0索引;方法尝试访问一个ResultSet的0索引。

UwF:所有的write都把属性置成null,这样所有的读取都是null,这样这个属性是否有必要存在;或属性从没有被write。

Dodgy 危险的

具有潜在危险的代码,可能运行期产生错误,下面列举几个:

CI: 类声明为final但声明了protected的属性。

DLS:对一个本地变量赋值,但却没有读取该本地变量;本地变量赋值成null,却没有读取该本地变量。

ICAST: 整型数字相乘结果转化为长整型数字,应该将整型先转化为长整型数字再相乘。

INT:没必要的整型数字比较,如X <= Integer.MAX_VALUE。

NP: 对readline()的直接引用,而没有判断是否null;对方法调用的直接引用,而方法可能返回null。

REC:直接捕获Exception,而实际上可能是RuntimeException。

ST: 从实例方法里直接修改类变量,即static属性。

Performance 性能问题

可能导致性能不佳的代码,下面列举几个:

DM:方法调用了低效的Boolean的构造器,而应该用Boolean.valueOf(…);用类似Integer.toString(1) 代替new Integer(1).toString();方法调用了低效的float的构造器,应该用静态的valueOf方法。

SIC:如果一个内部类想在更广泛的地方被引用,它应该声明为static。

SS: 如果一个实例属性不被读取,考虑声明为static。

UrF:如果一个属性从没有被read,考虑从类中去掉。

UuF:如果一个属性从没有被使用,考虑从类中去掉。

Multithreaded correctness 多线程的正确性

多线程编程时,可能导致错误的代码,下面列举几个:

ESync:空的同步块,很难被正确使用。

MWN:错误使用notify(),可能导致IllegalMonitorStateException异常;或错误的使用wait()。

No: 使用notify()而不是notifyAll(),只是唤醒一个线程而不是所有等待的线程。

SC: 构造器调用了Thread.start(),当该类被继承可能会导致错误。

Internationalization 国际化

当对字符串使用upper或lowercase方法,如果是国际的字符串,可能会不恰当的转换。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值