我最近开始在我正在做的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的代码。当我关闭它时,我的所有高优先级警告都消失了。这是有道理的。感谢您的反馈。
答案 0 :(得分:7)
更新:我有一个由hudson服务器执行的构建,并且代码覆盖了Clover的代码。当我关闭它时,我的所有高优先级警告都消失了。这是有道理的。感谢您的反馈。
答案 1 :(得分:3)
旁注:
for(int spaces = 0;spaces < spacesPerLevel;spaces++)
{
result = result.concat(" ");
}
如果result
是java.lang.String
,这可能效率低下,因为您对每个空格字符执行以下步骤:
char[]
来保存连接结果java.lang.String
实例
醇>
如果你反复这样做,特别是当result
已经很长时,这需要花费很多时间。
如果性能(时间和内存)对于该方法很重要,则应考虑使用StringBuilder
(非线程安全)或StringBuffer
(线程安全)。
答案 2 :(得分:1)
你是通过Eclipse插件,蚂蚁还是gui运行Findbugs?是否有可能代码在运行之后没有重新编译(在进行更改之前)?
如果setSpacesPerLevel不太长,请发布
的输出javap -v TheClassThatContainssetSpacerPerLevel
至于第二个错误,你必须先显示整个循环才能说出它是否有问题。