代码之家  ›  专栏  ›  技术社区  ›  Rob Goodwin

查找和比较

  •  7
  • Rob Goodwin  · 技术社区  · 15 年前

    我最近开始在我正在做的Java构建中使用FiffBug静态分析工具。第一份报告带来了大量高优先级的警告。作为一个痴迷型的人,我准备把他们全部击倒。不过,我一定是错过了什么。在比较东西时,我得到了大部分的警告。如以下代码:

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

    在读取的if语句处生成高优先级警告。

    文件:indner.java,行:60,类型: 位_和_zz,优先级:高,类别: 正确性检查以查看(…)& 0)=0 sample.indiner.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任务调用它

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

    3 回复  |  直到 15 年前
        1
  •  7
  •   Rob Goodwin    15 年前

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

        2
  •  3
  •   Roland Illig    15 年前

    旁注:

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

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

    1. 创建新的 char[] 保存连接结果
    2. 创建新的 java.lang.string字符串 环绕字符数组的实例

    如果你反复这样做,尤其是在 结果 已经很长了,这需要很多时间。

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

        3
  •  1
  •   MeBigFatGuy    15 年前

    您是否通过Eclipse插件、Ant或GUI运行findbugs?是否有可能自运行代码后(在进行更改之前)代码没有重新编译?

    如果setspacesPerLevel不太长,请将

    javap-v classhatchontainsSetspacerPerLevel

    至于第二个bug,在一个人说出它是否有问题之前,您必须显示整个循环。

    推荐文章