7

我最近开始在我正在做的 java 构建中使用 findbugs 静态分析工具。第一份报告带有大量高优先级警告。作为一个痴迷型的人,我已经准备好将他们全部击倒。但是,我一定错过了什么。在比较事物时,我会收到大部分警告。比如下面的代码:

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

在读取的 if 语句中产生高优先级警告。

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

我正在将 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 检测代码以进行代码覆盖。当我关闭它时,我所有的高优先级警告都消失了。现在这是有道理的。感谢您的反馈。

4

3 回答 3

7

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

于 2010-06-01T17:07:25.020 回答
3

旁注:

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

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

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

如果您反复执行此操作,尤其是在result已经很长的情况下,这将花费大量时间。

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

于 2010-06-01T18:00:48.650 回答
1

您是否通过 Eclipse 插件、ant 或 gui 运行 Findbugs?自您运行代码以来(在进行更改之前),代码是否可能没有重新编译?

如果 setSpacesPerLevel 不是太长,则发布

javap -v TheClassThatContainssetSpacerPerLevel

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

于 2010-06-01T16:01:34.333 回答