我在Maven中使用Findbugs插件但是当我执行这个插件时,并没有检测到所有无限循环..
我正在测试的代码是下一个:
public void infinite_1(){
while(true){
System.out.println( "Hello World!" );
}
}
public void infinite_2(){
boolean x = true;
while(x){
System.out.println( "Hello World!" );
}
}
public void infinite_3(){
int x = 2;
while(x == 2){
System.out.println( "Hello World!" );
}
}
public void infinite_4(){
while(1 < 2){
System.out.println( "Hello World!" );
}
}
public void infinite_5(){
for(int i = 0; i < 10; i--){
System.out.println( "Hello World!" );
}
}
Findbugs只检测第二种和第三种方法.. 问题是什么?我应该使用其他Maven插件来检测所有无限循环吗?
感谢。
答案 0 :(得分:1)
无法创建检测每个无限循环的程序,因此findbugs和其他任何东西都无法执行。这些工具在某些情况下有效,在大多数情况下都会失败。
这个问题很快导致停止问题,最近在这里讨论了类似的话题:https://cs.stackexchange.com/questions/49332/proof-that-dead-code-cannot-be-detected-by-compilers?newsletter=1&nlcode=415593%7ca8d0如果你对理论背景感到好奇,你可以阅读它。
答案 1 :(得分:1)
有时候你确实希望有一个无限循环,它没有任何问题。例如,您启动了一些守护程序线程,它应该始终有效,直到您的应用程序完成。或者你依赖于应该打破你的循环的InterruptedException
(或其他一些例外)。当你写while(true)
时,你表达清楚的意图以使循环无限,所以它不太可能是一个错误。毕竟FindBugs是一个检测可能的错误的工具,而不是一个检测无限循环的工具。这就是为什么不报告案例#1的原因。
另一方面,情况#2和#3看起来像错误,因为看起来开发人员实际上想要在循环中修改变量,但是忘了这样做。所以FindBugs会报告它。即使它是无限的,您也应该考虑使用while(true)
或for(;;)
语法使其更清晰。
案例#4有点棘手。 1 < 2
表达式是compile time constant expression:在编译到字节码期间它被评估为true
,因此查看字节码无法区分while(true)
和{{1} }。 FindBugs是一个字节码分析工具,几乎从不查看源代码,所以它根本看不出差异。由于决定不报告每个while(1 < 2)
,因此FindBugs也无法报告while(true)
。另一方面,我几乎无法想象有人在实际代码中错误地写了while(1 < 2)
。 FindBugs是一个在真实代码中找到真正错误的工具,而不是人为的&#34;思考&#34;错误。
对于案例#5,分析它并说出循环是否无限是非常困难的(尽管不是不可能)。即使对你来说也很困难:你认为这个循环是无限的,但实际上并非如此。它将有大约2亿次迭代,直到while(1 < 2)
溢出并且条件将变为false。但看起来像一个bug。 FindBugs没有现成的模式来检测它。您可以向开发人员推荐补丁。