2017-09-14 70 views
8

這似乎是規則的誤報的一個新例子「有條件執行的塊應該可到達」(squid:S2583)。有誰知道爲什麼SonarQube聲稱if(this.x == 0)總是在以下Java類中評估爲falseSonarQube聲稱對於使用「this」訪問的字段總是評估爲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插件SonarQube服務器5.6.6上執行4.13.0.11627)

更新:如Absurd-Mind所述,當this.x縮短爲x時,SonarQube很高興。在我看來,這是一個假陽性。

+0

這不應該有影響,但是當你移除'this.'時你會得到相同的結果嗎? –

+0

我在沒有'this.'的情況下試過了,這真的有所作爲!只有荒謬的想法纔會想到這個...... – dokaspar

+5

這聽起來像一個錯誤。你應該考慮通過https://jira.sonarsource.com/browse/SONARJAVA/?selectedTab=com.atlassian.jira.jira-projects-plugin:issues-panel發佈一個bug來作爲回答併發佈一個鏈接到你的bugticket還有更新「刪除這個」。在答案中。這真的會幫助其他人,並會給你一個更新:) –

回答

6

這實際上是由SonarJava插件4.13.0.11627版本引發的錯誤肯定(FP)。

經過調查,FP是由我們的符號執行(SE)引擎中的一元運算符處理中的錯誤引起的。下面的車票將解決這個問題:SONARJAVA-2460(預計修復版本:4.14)

有關爲什麼問題發生的細節:當使用this.xsuper.x訪問,都沒有處理,因爲他們應該是類字段。目前它們純粹被簡單地忽略(將由JIRA票據修復)。它有一個副作用,即SEE引擎沒有註冊this.x--發生的字段更新:與符號x關聯的符號值未被更新。因此,當測試x == 0完成時,引擎此時唯一知道的是(錯誤)約束條件x > 0。在這種狀態下,這種情況將永遠是錯誤的。解決這個問題將使發動機知道x在該條件下的測試與用於檢查x > 0的測試不一樣。

相關問題