2016-04-12 12 views
5

Nella nostra base di codice otteniamo Sonar riporta violazione per la regola del calamaro: S2095 sul codice come il seguente:Sonarqube calamaro: S2095 falso positivo

PreparedStatement ps = null; 
    try { 
     ps = connection.prepareStatement(DML); 
     ps.setString(1, externalDeviceId); 
     ps.setInt(2, internalDeviceId); 
     ps.execute(); 
     return ps.getUpdateCount() > 0; 
    } finally { 
     Utilities.close(ps); 
    } 

con Utilities.close implementato come

public static final void close(final AutoCloseable ac) { 
     if(ac != null) { 
      try { 
       ac.close(); 
       } catch(Exception e) { 
      } 
     } 
    } 

Is c'è un modo per evitare questi falsi positivi?

+0

quale versione del plug-in Java stai usando? – benzonico

+0

versione plug-in java è 3.11 –

+0

C'è stato qualche miglioramento in questo senso durante 3.12 e il rilascio di 3.13 sarà reso pubblico molto presto. Vi consiglio di provare almeno con la versione 3.12 per trarre vantaggio da questa correzione: https://jira.sonarsource.com/browse/SONARJAVA-1538 – benzonico

risposta

3

Risposta breve, non c'è modo di evitare quelli per il momento.

Risposta più lunga: Normalmente, passare un valore aperto a un metodo dovrebbe contrassegnarlo come chiuso per evitare falsi positivi. Dovresti specificare la versione del plug-in java di sonar che stai utilizzando.

Questa regola si basa sul motore di esecuzione simbolica ed è limitata ai limiti di un metodo e come tale, non è possibile determinare per il momento che una chiamata a questo metodo di utilità chiuderà sicuramente la risorsa aperta.

Si noti tuttavia che il team di java sonar sta lavorando per rendere questo limite andare via.

+0

Come posso contrassegnare il valore come chiuso? –

+0

Questo non è qualcosa disponibile per gli utenti, i valori sono aperti/chiusi durante l'analisi. È tuttavia possibile contrassegnare il problema come falso positivo nell'interfaccia SonarQube. – benzonico

+0

Lo so, ma ho oltre 200 violazioni segnalate di regola calamaro: S2095 nella nostra base di codice in quanto questo modello è usato in luoghi may. La mia preoccupazione è che potremmo avere alcuni problemi reali nascosti nel rumore –

4

Se si utilizza Java 7+, c'è un modo molto semplice per utilizzare le risorse try-with che sono in grado di chiudere la risorsa stessa e non è più necessario occuparsene. See visita (PreparedStatement ps = connection.prepareStatement (DML)), un tutorial: https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

try (PreparedStatement ps = connection.prepareStatement(DML)) { 
    ps.setString(1, externalDeviceId); 
    ps.setInt(2, internalDeviceId); 
    ps.execute(); 
    return ps.getUpdateCount() > 0; 
} 
Problemi correlati