Findbugs和比较

时间:2010-06-01 15:56:10

标签: java static-analysis findbugs

我最近开始在我正在做的java构建中使用findbugs静态分析工具。第一份报告带来了大量高优先级警告。作为一个迷恋型人,我已经准备好全力以赴。但是,我必须遗漏一些东西。在比较事情时,我得到了大部分警告。如下面的代码:

   public void setSpacesPerLevel(int value)
   {
      if( value >= 0)
      {
         spacesPerLevel = value;
      }
      else
      {
         spacesPerLevel = 0;
      }
   }

在if语句中生成高优先级警告。

  

文件:Indenter.java,行:60,类型:   BIT_AND_ZZ,优先级:高,类别:   正确检查是否((...)&   0)== 0 in   sample.Indenter.setSpacesPerLevel(INT)

我将int与int进行比较,看起来很常见。我通过类似的简单比较得到了相当多的错误。

对于看似简单的代码块,我有很多其他高优先级警告。我在这里错过了什么吗?我意识到静态分析会产生误报,但我所看到的错误似乎过于微不足道,是一种误报。

这个让我也摸不着头脑。

    for(int spaces = 0;spaces < spacesPerLevel;spaces++)
    {
       result = result.concat(" ");
    }

这给出了以下findbugs警告:

File: Indenter.java, Line: 160, Type: IL_INFINITE_LOOP, Priority: High, Category: CORRECTNESS

There is an apparent infinite loop in sample.Indenter.indent()

This loop doesn't seem to have a way to terminate (other than by perhaps throwing an exception).

有什么想法吗?

所以基本上我有一些文件和50-60个高优先级警告类似于上面的那些。我正在使用findbugs 1.3.9并从findbugs ant任务中调用它

更新 我有一个由hudson服务器执行的构建,并且代码覆盖了Clover的代码。当我关闭它时,我的所有高优先级警告都消失了。这是有道理的。感谢您的反馈。

3 个答案:

答案 0 :(得分:7)

更新:我有一个由hudson服务器执行的构建,并且代码覆盖了Clover的代码。当我关闭它时,我的所有高优先级警告都消失了。这是有道理的。感谢您的反馈。

答案 1 :(得分:3)

旁注:

for(int spaces = 0;spaces < spacesPerLevel;spaces++)
{
   result = result.concat(" ");
}

如果resultjava.lang.String,这可能效率低下,因为您对每个空格字符执行以下步骤:

  1. 创建一个新的char[]来保存连接结果
  2. 创建一个围绕字符数组
  3. 的新java.lang.String实例

    如果你反复这样做,特别是当result已经很长时,这需要花费很多时间。

    如果性能(时间和内存)对于该方法很重要,则应考虑使用StringBuilder(非线程安全)或StringBuffer(线程安全)。

答案 2 :(得分:1)

你是通过Eclipse插件,蚂蚁还是gui运行Findbugs?是否有可能代码在运行之后没有重新编译(在进行更改之前)?

如果setSpacesPerLevel不太长,请发布

的输出

javap -v TheClassThatContainssetSpacerPerLevel

至于第二个错误,你必须先显示整个循环才能说出它是否有问题。