代码改变世界

[hyddd的Fortify SCA分析Java代码记录][Control Flow]Missing Check for Null Parmater

2009-02-25 14:39  hyddd  阅读(1101)  评论(0编辑  收藏

  这个和Findbugs的[M C NP] Method call passes null for unconditionally dereferenced parameter比较类似,可以参考一下。

  虽然都是同一类的问题,但Fortify和Findbugs对问题的侧重点不一样,可能是规则不一样。先看看下面代码:

   public static Map.Entry[] getSortedHashtableByValue(Hashtable h) {
        Set set 
= h.entrySet();
        Map.Entry[] entries 
= (Map.Entry[]) set.toArray(new Map.Entry[set
                .size()]);

        Arrays.sort(entries, 
new Comparator() {
            
public int compare(Object arg0, Object arg1) {
                
int key1 = (Integer) ((Map.Entry) arg0).getValue();  //需要检查arg0是否为null
                
int key2 = (Integer) ((Map.Entry) arg1).getValue();  //需要检查arg1是否为null
                
return ((Comparable) key2).compareTo(key1);
            }
        });

        
return entries;
    }

上面这段代码,在注释处要判断传入参数arg0和arg1是否为null,否则直接使用有可能会抛异常。这个问题Fortify能发现,而FindBugs没找到。但是FindBugs认为有需要检查的地方,Fortify却没有找到,示例代码在[M C NP] Method call passes null for unconditionally dereferenced parameter里面。大家可以品味一下两者的区别,Fortify是在调用函数后使用变量前检查,FindBugs是在调用函数前检查,所以两者发现的问题不一样。