2010-06-01 200 views
7

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

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

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

文件:Indenter.java,行:60,类型: BIT_AND_ZZ,优先顺序:高度,类别: 正确性检查,看是否((...)& 0)== 0 样本。 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的调用蚂蚁任务

UPDATE: 我有这个版本是由哈德森服务器执行,不得不由三叶草代码覆盖被仪表的代码。当我将其关闭时,所有高优先级警告都消失了。这是有道理的。感谢您的反馈。

+0

如果您要更改循环内的spacesPerLevel,这可能是一个无限循环,例如。 spacesPerLevel = spaces + 2;或减少空间。 – Anton 2010-06-01 16:02:37

+0

刚刚更新了包含更多代码片段的问题 – 2010-06-01 16:06:05

+0

您是否正在编译调试信息? – Anton 2010-06-01 16:28:16

回答

7

更新:我有一个哈德森服务器执行此构建,并已由代码覆盖率由Clover检测代码。当我将其关闭时,所有高优先级警告都消失了。这是有道理的。感谢您的反馈。

1

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

如果setSpacesPerLevel不是太长,后期的

输出javap的-v TheClassThatContainssetSpacerPerLevel

至于第二个错误,你必须显示整个循环之前可以说,如果它是一个问题。

+0

我从蚂蚁运行它。目标在进行任何构建或静态分析之前进行清理。处理javap输出... – 2010-06-01 16:07:07

3

一个侧面说明:

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

如果resultjava.lang.String,这可能是低效的,因为你做以下步骤为每个空格字符:

  1. 创建一个新的char[]举行级联结果
  2. 创建一个包含字符数组的java.lang.String实例

如果您重复执行此操作,尤其是result已经很长时间,则需要很长时间。

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

+0

谢谢!我从.NET移植了这段代码(我在java部门有点生疏)。在我们使用的.net字符串类上有一个构造函数,它允许你重复一个字符X次。这是我的快速和肮脏的解决方案,但它从一开始就是错误的。谢谢! – 2010-06-01 18:14:11