SonarQube 声称条件对于使用"this."访问的字段始终计算为 false。



这似乎是规则"有条件执行的块应该是可访问的"(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();
}

(在SonarQube服务器5.6.6上使用SonarJava插件4.13.0.11627执行)

更新:正如荒谬的头脑所指出的,当this.x缩短为x时,SonarQube很高兴。在我看来,这是一个误报。

这确实是由SonarJava插件版本4.13.0.11627引发的误报(FP)。

经过调查,FP 是由我们的符号执行 (SE) 引擎中处理一元运算符的错误引起的。以下票证将解决此问题:SONARJAVA-2460(预期修复版本:4.14)

有关发生此问题的原因的详细信息:使用this.xsuper.x访问类字段时,不会按应有的方式处理。它们目前被完全忽略(将由JIRA票证修复)。SE 引擎未注册与this.x--一起发生的字段更新,这会产生副作用:与符号x关联的符号值不会更新。因此,当测试x == 0完成时,引擎此时唯一知道的是x > 0的(错误的)约束。在这种状态下,条件将始终为假。解决此问题将使发动机知道在该条件下测试的x不再与用于检查x > 0的相同。

最新更新