这似乎是“有条件执行的块应该可以到达”(squid:S2583)这一规则误报的新例子。有谁知道为什么SonarQube声称if(this.x == 0)
总是在以下Java类中评估为false
?
public class MyClass {
private long x;
void setX(long x) {
this.x = x;
}
public void decrementX() {
if(this.x > 0) {
this.x--;
if(this.x == 0) { // <-- Always false?!
// apparently dead code
}
}
}
}
显然,变量x
可以设置为1
,然后decrementX()
将进入该确切条件:
@Test
public void testDecrement() {
MyClass c = new MyClass();
c.setX(1);
c.decrementX();
}
(使用SonarJava插件4.13.0.11627在SonarQube服务器5.6.6上执行)
更新:正如Absurd-Mind所述,当this.x
缩短为x
时,SonarQube很高兴。在我看来,这是假阳性。
答案 0 :(得分:6)
这确实是SonarJava插件版本4.13.0.11627引发的误报(FP)。
经过调查,FP是由我们的符号执行(SE)引擎中处理一元运算符的错误引起的。以下故障单将解决此问题:SONARJAVA-2460(预期修复版本:4.14)
有关问题出在何处的详细信息:使用this.x
或super.x
访问时,类字段不会按原样处理。它们目前被纯粹而简单地忽略(将由JIRA票证修复)。副作用是SE引擎未注册this.x--
发生的字段更新:不更新与符号x
关联的符号值。因此,当测试x == 0
完成时,引擎此时唯一知道的是x > 0
的(错误)约束。在这种状态下,条件总是假的。修复此问题将使引擎知道在条件中测试的x
不再与用于检查x > 0
的那个相同。