2016-04-12 22 views
5

W naszej bazie kodu otrzymujemy Sonar informuje o naruszenie przepisów kalmarów: S2095 na kodzie jak poniżej:Sonarqube squid: S2095 fałszywie dodatni

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); 
    } 

z Utilities.close realizowane jako

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

Czy istnieje sposób na uniknięcie fałszywych alarmów?

+0

która wersja wtyczki Java używasz? – benzonico

+0

Wersja wtyczki Java 3.11 –

+0

Było to pewną poprawę w ciągu około 3.12 i uwalnianie 3,13 zostanie upublicznione bardzo szybko. Polecam spróbować z wersją 3.12 przynajmniej skorzystać z tej poprawki: https://jira.sonarsource.com/browse/SONARJAVA-1538 – benzonico

Odpowiedz

3

Krótka odpowiedź, nie ma sposobu, aby ich uniknąć na chwilę.

Dłuższa odpowiedź: Zwykle przekazanie otwartej wartości do metody powinno oznaczać ją jako zamkniętą, aby uniknąć fałszywych trafień. Powinieneś sprecyzować wersję sonaru java, której używasz.

Ta reguła opiera się na symbolicznym mechanizmie wykonawczym i jest ograniczona do granic metody i jako taka nie ma możliwości określenia na razie, że wywołanie tej metody narzędzia z pewnością zamknie otwarty zasób.

Pamiętaj jednak, że zespół sonar java pracuje nad tym, aby ten limit zniknął.

+0

Jak mogę oznaczyć wartość jako zamknięte? –

+0

To nie jest coś dostępne dla użytkowników, wartości są otwarte/zamknięte podczas analysis.You może oznaczać problem jako fałszywy alarm w interfejsie SonarQube chociaż. – benzonico

+0

wiem, ale mam 200 + zgłoszonych naruszeń przepisów kalmarów: S2095 w naszej bazie kodu jak ten wzór jest stosowany w maju miejscach. Obawiam się, że możemy mieć pewne rzeczywiste problemy ukryte w szumie –

4

Jeśli używasz środowiska Java 7+, istnieje prosty sposób użycia funkcji "wypróbuj za pomocą zasobów", która może zamknąć sam zasób i nie musisz już o niego dbać. Zobacz spróbować (PreparedStatement ps = connection.prepareStatement (DML)), 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; 
}