2017-09-19 7 views
0

Est-ce que quelqu'un sait pourquoi SonarQube détecte une violation de la règle "Les blocs conditionnellement exécutés doivent être accessibles" (squid:S2583) dans l'exemple suivant? Est-ce un faux positif?Sonar semble ignorer les variables définies dans le bloc catch

Dans ce morceau de code Java, un fichier est lu et un EOFException (ou plusieurs d'entre eux) peut apparaître dans le processus de lecture du flux d'entrée. Ainsi, l'exception est interceptée et gérée, et un drapeau est défini pour se souvenir que cela s'est produit. Cependant, Sonar ne considère pas la ligne exHappened = true; dans le premier bloc de capture et affirme que la variable est toujours 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; 
    } 
} 

Pour le rendre encore plus clair, ajouter un throw new EOFException() dans le try { }, la condition sera toujours être vrai et Sonar prétend encore que toujours faux ...

(J'utilise sonarqube 5.6.6 et plug-in SonarJava 4.13.0.11627)

+1

Selon https://www.sonarqube.org/community/feedback/, sonarqube Google Group est mieux de mettre à signaler des bugs, et leur JIRA est probablement le meilleur. –

+0

Vous avez raison. La prochaine fois que je publierai des questions sur les faux positifs possibles dans le groupe Google de SonarQube (leur JIRA est en lecture seule, soit dit en passant). – dokaspar

+0

Vous pouvez poser des questions à Google Group ou ici, les deux chaînes sont surveillées par la communauté. Quelle est la version du plugin SonarJava et de SonarQube que vous utilisez? –

Répondre

1

Cela semble être un problème dans la façon dont les blocs catch sont traitées au cours de flux de données w analyse dans SonarJava. Le sous-type catch catching de l'exception déclarée dans la déclaration throws de la méthode appelée n'est pas pris en compte, donc l'affectation à la variable n'est jamais vue par le moteur.

I créé billet suivant pour corriger ce problème https://jira.sonarsource.com/browse/SONARJAVA-2483