SonarQube声称条件总是对使用"this"访问的字段求值为false.

dok*_*par 8 java sonarqube

这似乎是"有条件执行的块应该可以到达"规则的误报的新例子(鱿鱼:S2583).有谁知道为什么SonarQube声称if(this.x == 0)总是false在以下Java类中进行求值?

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
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

显然,变量x可以设置为1,然后decrementX()将进入这个确切的条件:

@Test
public void testDecrement() {
    MyClass c = new MyClass();
    c.setX(1);
    c.decrementX();
}
Run Code Online (Sandbox Code Playgroud)

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

更新:如Absurd-Mind所述,SonarQube在this.x缩短时很高兴x.在我看来,这是假阳性.

Mic*_*eam 6

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

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

有关问题出在何处的详细信息:使用this.x或访问时,类字段super.x不应按原样处理.它们目前被纯粹而简单地忽略(将由JIRA票证修复).它具有副作用,即this.x--SE引擎未注册发生的字段的更新:x不更新与符号相关联的符号值.因此,当测试x == 0完成时,引擎此时唯一知道的是(错误的)约束x > 0.在这种状态下,条件总是假的.解决问题将使引擎知道x在条件下测试的测试不再与用于检查的测试相同x > 0.