2016-04-12 8 views
5

:次のようなコードにS2095を:Sonarqubeはイカ:S2095は、我々はソナーがルールイカのための違反報告取得我々のコードベースで偽陽性

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

Utilities.closeでは

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

ですとして実装しましたこれらの誤認を避ける方法がありますか?

+0

いるJavaプラグインのバージョンを使用していますか? – benzonico

+0

javaプラグインのバージョンは3.11 –

+0

です。これは3.12の間に改善され、3.13のリリースはすぐに公開される予定です。少なくとも、この修正プログラムの恩恵を受けるには、バージョン3.12で試すことをお勧めします。https://jira.sonarsource.com/browse/SONARJAVA-1538 – benzonico

答えて

3

短期間の回答では、現時点でそれらを避ける方法はありません。

長い回答: 通常、開かれた値をメソッドに渡すと、誤った陽性を避けるために閉じたものとしてマークする必要があります。使用しているソナーのJavaプラグインのバージョンを正確に調べる必要があります。

このルールはシンボリック実行エンジンに依存しており、メソッドの境界に限定されているため、このユーティリティメソッドを呼び出すとオープンリソースを確実に閉じることができません。

しかし、ソナーのJavaチームはこの制限をなくすように取り組んでいます。

+0

値をクローズとしてマークするにはどうすればよいですか? –

+0

これはユーザーにとって利用可能なものではなく、解析中に値が開いたり閉じたりします.SonarQubeインターフェイスでは、この問題を誤検出とマークできます。 – benzonico

+0

私は知っていますが、このパターンは5月の場所で使用されているため、ルールベースの違反を200件以上報告しています。私の懸念は、ノイズに隠されたいくつかの実際の問題があるかもしれないということです。 –

4

Java 7+を使用している場合は、リソース自体を閉じることができるtry-with-resourcesを使用する簡単な方法があります。それ以上注意する必要はありません。 (PreparedStatementのpsの=のConnection.prepareStatement(DML))を試してみてください参照してください、チュートリアル: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; 
}