关于静态代码分析

  找出代码中已有的缺陷,提高代码质量,排除潜在隐患是每个程序员的责任,不管是入门者还是资深者都被这个问题困扰着。

实际开发中会有特别多的伪问题存在,伪问题就是一些不是问题的问题,也可理解成误报。 本来不是问题的地方被当作成问题,无疑会耽误大量时间去发现和排除。由此可见所以静态代码分析尤为重要。

 

  这里推荐一款我正在使用的工具: Findbugs

 

Find bugs - This is the web page for FindBugs, a program which uses static analysis to look for bugs in Java code. 

 

http://findbugs.sourceforge.net/

 

  它的特点是不重视格式和样式。

 

 

 

 

网上有些资料可供参考:

 

 

下面的列表没有包括  FindBug  可以找到的 所有 问题。相反,我侧重于一些更有意思的问题。
检测器:找出  hash equals  不匹配  
这个检测器寻找与 equals() 和 hashCode() 的实现相关的几个问题。这两个方法非常重要,因为几乎所有基于集合的类 —— List 、 Map 、 Set  等都调用它们。一般来说,这个检测器寻找两种不同类型的问题 —— 当一个类:
  • 重写对象的equals()方法,但是没有重写它的hashCode方法,或者相反的情况时。
  • 定义一个 co-variant 版本的equals()或compareTo()方法。例如,Bob类定义其equals()方法为布尔equals(Bob),它覆盖了对象中定义的equals()方法。因为 Java 代码在编译时解析重载方法的方式,在运行时使用的几乎总是在对象中定义的这个版本的方法,而不是在Bob中定义的那一个(除非显式将equals()方法的参数强制转换为Bob类型)。因此,当这个类的一个实例放入到类集合中的任何一个中时,使用的是Object.equals()版本的方法,而不是在Bob中定义的版本。在这种情况下,Bob类应当定义一个接受类型为Object的参数的equals()方法。
检测器:忽略方法返回值  
这个检测器查找代码中忽略了不应该忽略的方法返回值的地方。这种情况的一个常见例子是在调用 String 方法时,如在清单  1  中:
 1.  忽略返回值的例子
1  String aString = "bob";
2  b.replace('b', 'p');
3  if(b.equals("pop"))
 
这个错误很常见。在第  2  行,程序员认为他已经用  p  替换了字符串中的所有  b 。确实是这样,但是他忘记了字符串是不可变的。所有这类方法都返回一个新字符串,而从来不会改变消息的接收者。
检测器: Null  指针对  null  的解引用( dereference )和冗余比较  
这个检测器查找两类问题。它查找代码路径将会或者可能造成  null  指针异常的情况,它还查找对  null  的冗余比较的情况。例如,如果两个比较值都为  null ,那么它们就是冗余的并可能表明代码错误。 FindBugs  在可以确定一个值为  null  而另一个值不为  null  时,检测类似的错误,如清单  2  所示:
 2. Null  指针示例
1  Person person = aMap.get("bob");
2  if (person != null) {
3      person.updateAccessTime();
4  }
5  String name = person.getName();
 
在这个例子中,如果第  1  行的 Map 不包括一个名为 “bob” 的人,那么在第  5  行询问 person 的名字时就会出现  null  指针异常。因为  FindBugs  不知道  map  是否包含 “bob” ,所以它将第  5  行标记为可能  null  指针异常。
检测器:初始化之前读取字段  
这个检测器寻找在构造函数中初始化之前被读取的字段。这个错误通常是 —— 尽管不总是如此 —— 由使用字段名而不是构造函数参数引起的,如清单  3  所示:


 3.  在构造函数中读取未初始化的字段
1  public class Thing {
2      private List actions;
3      public Thing(String startingActions) {
4          StringTokenizer tokenizer = new StringTokenizer(startingActions);
5          while (tokenizer.hasMoreTokens()) {
6              actions.add(tokenizer.nextToken());
7          }  
8      }
9  }
在这个例子中,第  6  行将产生一个  null  指针异常,因为变量 actions 还没有初始化。
FindBugs 暂时 提供总共  35  个检测器。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值