`
小网客
  • 浏览: 1218854 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

eclipse插件FindBugs各种bug描述及解决方法

    博客分类:
  • Java
阅读更多

1 )原代码如下:

protected String[] a = null;

public void test(String[] str){

    this.a = str;

}

findbugs描述为:

This code stores a reference to an externally mutable object into the internal representation of the object. If instances are accessed by untrusted code, and unchecked changes to the mutable object would compromise security or other important properties, you will need to do something different. Storing a copy of the object is better approach in many situations.

网上翻译如下:

可能因使引用可指向多个对象而暴露内部存储结构。 
这代码使一个指向外部多个对象的引用指向了一个内部对象存储地址。 
如果实例被未被信任代码访问或多个对象发生了未经检查的改变就会危及安全性或其它重要属性, 
你需要去做一些不同的事情。存储一个对象的拷贝在许多情况下会是一个更好的方法。

修改如下:

public void test(String[] str){

 

    if(str!=null)

    this.a = str.clone();

}

--------------------------------------------------------------------------------

2 )在bean中定义数组类型的bug

[参考]http://topic.csdn.net/u/20080115/20/c8893ce0-5546-4762-97bb-9b00d10885cc.html

原代码:

private String[] name; 

public String[] getName() { 
return name; 


public void setName(String[] name) { 
this.name = name; 
}

bug描述:

[EI] May expose internal representation by returning reference to mutable object [EI_EXPOSE_REP]

解决:

private String[] name; 

public String[] getName() { 
String[] temp = name; 
return temp; 


public void setName(String[] name) { 
String[] temp = name; 
this.name = temp; 
}

说明:

    所有容器类型如ArrayList和数组类型,如果你都自动生成get set,都会有这个警告。 
    这个警告的主要目的是:一般的get set直接把此对象中某一容器的引用放到外部,可以随便更改,违反了封装的原则,至于那个temp的方法,由于不是直接对内部容器进行操作,故没有警告,但没有实际意义,自己知道即可。

 

Returning a reference to a mutable object value stored in one of the object's fields exposes the internal representation of the object. If instances are accessed by untrusted code, and unchecked changes to the mutable object would compromise security or other important properties, you will need to do something different. Returning a new copy of the object is better approach in many situations.

--------------------------------------------------------------------------------

3) 序列化问题

源码:

private Obj[] obj;

public void getObj(){

Obj[] tep = obj;

return tep;

}

public Obj[] setObj(Obj[] o){

Obj[] tep = o;

this.obj = tep;

}

bug描述:

This Serializable class defines a non-primitive instance field which is neither transient, Serializable, or java.lang.Object, and does not appear to implement the Externalizable interface or the readObject() and writeObject() methods. Objects of this class will not be deserialized correctly if a non-Serializable object is stored in this field.

修改:

public class Obj implements Serializable {

...

}

 

4 ) new Integer(int) 和 Integer.valueOf(int)  

bug描述:

[Bx] Method invokes inefficient Number constructor; use static valueOf instead [DM_NUMBER_CTOR]

Using new Integer(int) is guaranteed to always result in a new object whereas Integer.valueOf(int) allows caching of values to be done by the compiler, class library, or JVM. Using of cached values avoids object allocation and the code will be faster.

说明:

[参考]http://www.cnblogs.com/hyddd/articles/1391318.html

FindBugs推荐使用Integer.ValueOf(int)代替new Integer(int),因为这样可以提高性能。如果当你的int值介于-128~127时,Integer.ValueOf(int)的效率比Integer(int)快大约3.5倍。

下面看看JDK的源码,看看到Integer.ValueOf(int)里面做了什么优化:

public static Integer valueOf(int i) {
  
final int offset = 128;
  
if (i >= -128 && i <= 127) { // must cache
    return IntegerCache.cache[i + offset];
   }
  
return new Integer(i);




private static class IntegerCache {
  
private IntegerCache(){}
    
  
static final Integer cache[] = new Integer[-(-128+ 127 + 1];
  
static {
  
for(int i = 0; i < cache.length; i++)
      cache 
= new Integer(i - 128);
   }

从源代码可以知道,ValueOf对-128~127这256个值做了缓存(IntegerCache),如果int值的范围是:-128~127,在ValueOf(int)时,他会直接返回IntegerCache的缓存给你。

 

所以你会看到这样的一个现象:

public static void main(String []args) {
      Integer a 
= 100;
      Integer b 
= 100;
      System.out.println(a
==b);

      Integer c 
= new Integer(100);
      Integer d 
= new Integer(100);
      System.out.println(c
==d);
}

结果是:

true
false

因为:java在编译的时候 Integer a = 100; 被翻译成-> Integer a = Integer.valueOf(100);,所以a和b得到都是一个Cache对象,并且是同一个!而c和d是新创建的两个不同的对象,所以c自然不等于d。

 

再看看这段代码:

 

public static void main(String args[]) throws Exception{
         Integer a 
= 100;
         Integer b 
= a;
         a 
= a + 1;  //或者a++;
         System.out.println(a
==b);
}

结果是:false

 

因为在对a操作时(a=a+1或者a++),a重新创建了一个对象,而b对应的还是缓存里的100,所以输出的结果为false。

--------------------------------------------------------------------------------

5) toString() 和 String

源码:

return a.toString();

bug描述

[Dm] Method invokes toString() method on a String [DM_STRING_TOSTRING]
Calling String.toString() is just a redundant operation. Just use the String.

修改为:

return (String) a;

***************************************************************************

未解决bug

1、

[DMI] Code contains a hard coded reference to an absolute pathname [DMI_HARDCODED_ABSOLUTE_FILENAME]

This code constructs a File object using a hard coded to an absolute pathname (e.g., new File("/home/dannyc/workspace/j2ee/src/share/com/sun/enterprise/deployment");

分享到:
评论

相关推荐

    eclipse插件 findBugs 最新版

    帮助查找bug的 eclipse插件 findBugs

    android eclipse 插件 findbugs 3.0 linux

    eclipse 插件 findbugs 更方便的来找出bug。 更有用的是在andorid 中可以帮助找到闪退的原因,修复闪退 使用方法:直接解压到eclipse目录下的plugin 目录下

    Eclipse集成findBugs步骤

    Eclipse集成findBugs步骤,包含:FindBugs介绍,在Eclipse中安装FindBugs插件,在Eclipse中使用FindBugs,配置FindBugs,其它分析工具(PMD,CheckStyle),配套的Bug解释模式,实际项目中Bug类型统计

    Eclipse集成findBugs步骤.doc

    Eclipse集成findBugs,一款很好用的查找BUG的插件,希望对大家有所帮助,提高代码质量!

    findBugs插件 正式版eclipse,附带说明使用以及下载好的附件,直接替换即可完成

    一款EcliPSe插件,能够发现java代码中的bug,针对各种问题,它并且提供了简单的修改意见供我们重构时进行参考; 通过使用它,可以一定程度上降低我们code review的工作量,并且会提高review效率。 通过findbugs找到...

    findbugs eclipse 插件 及使用

    NULL 博文链接:https://knight-black-bob.iteye.com/blog/2330285

    findbugs-3.0.1.ta

    FindBugs是一个匹配编译代码模式,而非使用bug数据库的工具。当提供源代码时,FindBugs还可高亮显示检测出bug的代码行。...除了图形用户界面,FindBugs还提供一个命令行界面,Ant任务,以及Eclipse插件。

    kepler_Eclipse插件安装

    kepler_Eclipse插件安装、SVN插件安装、Jetty插件安装、3、JQUERY提示插件安装、4、FindBugs-BUG分析工具的安装和使用、FindBugs的配置、JSHint JS分析工具的安装和使用

    java代码检查工具 findBugs eclipse插件1.39最新

    图 1 显示了分析一个匿名项目的结果(为防止可怕的犯罪,这里不给出它的名字): 在FindBugs的GUI中,需要先选择待扫描的.class文件(FindBugs其实就是对编译后的class进行扫描,藉以发现一些隐藏的bug。)。如果你...

    eclipse find bugs插件

    用于eclipse工程中,发现程序中存在的bug。

    findbgus eclipse 插件下载

    一款Eclipse插件,能够发现java代码中的bug,针对各种问题,它并且提供了简单的修改意见供我们重构时进行参考; 通过使用它,可以一定程度上降低我们code review的工作量,并且会提高review效率。 通过findbugs找到...

    findbugs-3.0.1.tar.gz

    FindBugs supports Java 8 now (both as runtime and target platform). FindBugs requires minimum Java 7 as runtime environment!...FindBugs是一个能静态分析源代码中可能会出现Bug的Eclipse插件工具。

    edu.umd.cs.findbugs.plugin.eclipse_2.0.3.20130809

    FindBugs是一个能静态分析源代码中可能会出现Bug的Eclipse插件工具。 下载之后 将文件解压到plugins下面。 FindBugs地执行: 选中 所在项目,鼠标右键 &gt; Find Bugs &gt; Find Bugs执

    findbugs源码

    FindBugs是一个能静态分析源代码中可能会出现Bug的Eclipse插件工具。FindBugs的设置: 安装好之后,可以通过 Projects &gt; Property &gt; FindBugs标签对其进行设置。设置方法可以根据自己的需要进行调整。 另外在 问题...

    findbugs-1.3.5

    查找bug的eclipse插件,findbugs-1.3.5 相当好用

    findBugs插件

    一款Eclipse插件,能够发现java代码中的bug

    findbugs检查工具

    findbugs是一个开源的eclipse 代码检查工具;它可以简单高效全面地帮助我们发现程序代码中存在的bug,bad smell,以及潜在隐患. 下载的文件包含如下: 1.findbugs的eclipse插件source包 2.安装及使用说明文档

    FindBugs错误码对照表

    findbugs对照表。错误表,eclipsebug表。这个用于在eclipse中使用findbugs插件,后显示的错误对照表。可以帮助快速查询原因

    FindBugs安装及使用说明

    findBugs是一款代码质量控制工具,能帮助程序员找出程序中隐藏bug的是插件

    Idea代码走查工具FindBus使用以及缺陷分析(含插件)

    FindBugs不注重代码风格和格式,而是专注于检测真正的bug及潜在的性能问题,并尽可能地抑制误报(false positives)。 FindBugs提供了一个可视化的界面,方便用户操作,也可以作为Eclipse的一个插件来使用。...

Global site tag (gtag.js) - Google Analytics