FindBugs详解

Find bugs误报告警的消除方法

背景介绍

在java工程中,Find bugs的静态检查能够帮助我们挖掘出代码可能存在的缺陷。在我实际使用的过程中,也确实发现了两处由于“缺少else分支”导致“引入未初始化对象”的错误。与之相对应的是,通过Find bugs也发现四处对象中使用静态成员导致Find bugs告警的情况。通过仔细阅读和分析代码逻辑,可以确认代码本身没有问题,这个是属于Find bugs误报的情况。既然我们打算使用Find bugs来做代码的静态检查,那么就有必要保持一个干净的代码环境,这里面没有任何的Find bugs告警。如果确定是代码问题,毫无疑问需要马上纠正。如果确认是Find bugs误报,也应该进行消除,以便后续的检查能够基于一个干净的环境,同样的误报不需要反复确认。Find bugs告警误报的消除非常容易,只需要在两个级别(类级别和方法进行)加上Find bugs的注解就可以消除。这里建议误报消除尽量在方法级别上进行,以控制误报消除的范围,最大限度放置将真正的代码问题也作为误报给隐藏掉了。

方法

  • 在工程添加注解依赖的jar包:使用Find bugs注解需要用到两个jar包,annotations.jar和jsr305.jar。在eclipse中装完Find bugs插件后,在eclipse目录下可以找到这两个jar包文件。
  • 添加注解:在疑问代码所在的类或者方法前面添加注解。其中,value的值就是前面提到的find bugs告警信息中的模式,因为value是一个数组,所以可以同时添加多个模式。justification的值是一句描述信息,你可以理解为是这条注解的注释,内容可以是任意的。
    @edu.umd.cs.findbugs.annotations
    SuppressWarnings(value={"NM_CONFUSING"}, justification="remove findbugs")
  • 重新运行Find bugs进行检查:添加完注解后,接下来应该重新运行find bugs工具进行检查,以确定误报已经被消除。

MS: Field should be package protected (MS_PKGPROTECT)

A mutable static field could be changed by malicious code or by accident. The field could be made package protected to avoid this vulnerability.

我这样定义了多个数组,均使用了 public final static 修饰符:

    public final static double[][][] Y_MIN_SCOPE=
    {
        {{-120, -25}},
        {{0, 254}},
        {{0, 254}},
        {{0, 254}}

    };
    public final static double[] GRID_HEIGHT = {1,1,1,1};

    public final static String[][] TAG_NAMES=
    {
        {"RSRQ(dB)","RSRP(dBm)"},
        {"TA(16*Ts)","UE TxPower(dBm)"},
        {"TA(16*Ts)","RSRP(dBm)"},
        {"TA(16*Ts)","RSRQ(dB)"}
    };

findbugs给的修改提示是:

    In LTE3DConstant
    Field LTE3DConstant.Y_MIN_SCOPE
    At LTE3DConstant.java:[line 53]
    Y_MIN_SCOPE should be package protected
    Bug Type: MS_PKGPROTECT
    Bug Category:MALICIOUS_CODE (Malicious code vulnerability)
    Source File:
    Line:53

修改成这样就不报错了。

    protected final double[][][] Y_MIN_SCOPE=
    {
        {{-120, -25}},
        {{0, 254}},
        {{0, 254}},
        {{0, 254}}

    };

可能原因是因为其它地方没有使用到这个类的变量,所以最好将public改成protected,但是为什么要去掉static还是不理解。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据小魔方

左手用R右手Python系列——循环中的错误异常规避

上一讲讲了R语言与Pyhton中的异常捕获与错误处理基本知识,今天以一个小案例来进行实战演练,让你的程序遇水搭桥,畅通无阻。 本案例目标网址,今日头条的头条指数...

35560
来自专栏coder修行路

《深入理解计算机系统》阅读笔记--程序的机器级表示(上)

编译器基于编程语言的规则,目标机器的指令集和操作系统遵循的惯例,经过一系列的阶段生成机器代码。GCC c语言编译器以汇编代码的形式产生输出,汇编代码是机器代码的...

11400
来自专栏QQ音乐技术团队的专栏

一种Android App在Native层动态加载so库的方案

这篇文章通过实战案例,介绍了一种有条理的组织Native层代码层级结构的方法。并且,在良好的代码层级、作用分工的基础上,实现了动态的按需加载、卸载so库。文章...

1.2K60
来自专栏极客编程

Nodejs和Mongodb的连接器Mongoose

今天我们将学习Mongoose,什么是Mongoose呢,它于MongoDB又是什么关系呢,它可以用来做什么呢,介绍Mongoose之前,我们先简单了解一下Mo...

18540
来自专栏架构之路

wait方法和sleep方法的区别

一.概念、原理、区别 Java中的多线程是一种抢占式的机制而不是分时机制。线程主要有以下几种状态:可运行,运行,阻塞,死亡。抢占式机制指的是有多个线程处于可运...

37050
来自专栏微信公众号:Java团长

Java虚拟机:Java内存区域及对象

为以后写文章考虑,也为巩固自己的知识和一些基本概念,这里要理清楚几个计算机中的概念。

12820
来自专栏IT技术精选文摘

sed、awk——运维必须掌握的两个工具

12360
来自专栏技术随笔

Bufbomb缓冲区溢出攻击实验详解-CSAPP

66380
来自专栏编程

享学课堂谈-Python初学者的设计模式入门

有没有想过设计模式到底是什么?通过本文可以看到设计模式为什么这么重要,通过几个Python的示例展示为什么需要设计模式,以及如何使用。 设计模式是什么? 设计模...

19180
来自专栏FreeBuf

Nebula漏洞利用包CVE-2016-0189漏洞利用分析

1. 引言 在最近的一年里, 漏洞利用工具包(EK/Exploit Kit)市场风云变幻。2016年六月初,曾经极为猖獗的Angler EK 销声匿迹,Neut...

28460

扫码关注云+社区

领取腾讯云代金券