2017-09-19 90 views
0

有誰知道爲什麼SonarQube檢測到違反規則「在以下示例中應該可以訪問有條件執行的塊」(squid:S2583)?這是否爲假?Sonar似乎忽略在catch塊中設置的變量

在這段Java代碼中,讀取文件並在讀取輸入流的過程中可能會發生EOFException(或其中多個)。因此,異常被捕獲並處理,並設置一個標誌以記住它發生了。然而,聲納不考慮行exHappened = true;在第一個catch塊,並聲稱變量始終是false

public static boolean doSomething() { 
    boolean exHappened = false; 
    try (DataInputStream s = new DataInputStream(new FileInputStream("test"))) { 
     LOGGER.info("Doing something..."); 
    } 
    catch (EOFException eof) { // this Exception can definitely happen 
     exHappened = true; 
    } 
    catch (IOException io) { 
     LOGGER.error("sorry", io); 
    } 

    if (exHappened) {   // Sonar thinks this condition is always false 
     return false; 
    } 
    else { 
     return true; 
    } 
} 

爲了使它顯得更加清晰,增加throw new EOFException()try { },那麼情況將總是是真實的和聲納仍然聲稱,它總是假的... ...

(我使用SonarQube 5.6.6和SonarJava插件4.13.0.11627)

+1

據https://www.sonarqube.org/community/feedback/,SonarQube谷歌集團是一個更好的地方報告錯誤,他們的JIRA可能最好的。 –

+0

你說得對。下次我會發布有關SonarQube Google Group中可能出現誤報的問題(順便提一下,他們的JIRA是隻讀的)。 – dokaspar

+0

您可以將問題發佈到Google羣組或這裏,這兩個渠道都由社區進行監控。您正在使用的SonarJava插件和SonarQube的版本是什麼? –

回答

1

這似乎是在catch塊期間如何處理的問題數據flo在SonarJava中進行分析。沒有考慮在被調用方法的throws聲明中聲明的異常的catch塊捕獲子類型,因此引擎永遠不會看到該變量的賦值。

我創建以下票來解決這個問題https://jira.sonarsource.com/browse/SONARJAVA-2483