Sonarqube对“使用try-with-resources或在“ finally”子句中关闭此“ ResultSet”进行了错误肯定”

时间:2018-10-26 12:47:53

标签: java sonarqube false-positive

Sonarqube一直用这个问题标记代码,我认为这是一个错误的肯定。 代码如下:

try(PreparedStatement st=con.prepareStatement(myQuery)){
    st.setInt(1, myValue);
    ...
    ResultSet rs = st.executeQuery();
    ...
}

如果我没记错的话,PreparedStatement实现Closeable,并且在关闭自身时也会关闭基础ResultSet。

此行为将阻止ResultSet保持打开状态,但是Sonarqube分析将其标记为严重错误。

我误会了吗? 有什么方法可以使Sonarqube在这种情况下忽略

在Sonarqube 6.7.3和JDK 8下测试。

ResultSet Javadoc:

  

当ResultSet对象关闭,重新执行或用于从多个结果序列中检索下一个结果时,将自动关闭ResultSet对象。

4 个答案:

答案 0 :(得分:3)

期望代码分析器知道这些事情可能是不合理的。工具可以随时知道在任何地方编写的所有库中所有Closeable的所有-additional-语义吗?

doco确实提到“当前的ResultSet(如果有)也已关闭”。

注意“当前”。如果您碰巧有两个不同的executeQuery()调用,会发生什么?它会因为状态不好或类似原因而失败吗?是否会有两个不同的ResultSet对象,都未关闭并且其中一个现在未引用?

(注意:两种截然不同的executeQuery()调用听起来似乎很疯狂,但是请记住“编码器可以做任何事情”,这甚至就是 原因 的原因,因为SonarQube是首先写的。)

我并不是说这完全是值得商bat的,但是对我来说,如果分析工具只是看到您得到一个Closeable而没有关闭它而只是抱怨它,这似乎并不奇怪。

答案 1 :(得分:2)

实际上这是一个误报。已经报告了该问题,并且有待修复的https://jira.sonarsource.com/browse/SONARJAVA-2060

您可以在SonarQube UI中将该问题标记为误报,或在引发该问题的行上添加import React from 'react'; import { createDrawerNavigator, createStackNavigator } from 'react-navigation'; import { MenuIcon } from '../../components'; import DrawerSideMenu from './drawerSideMenu'; import { ABOUT_US, PROFILE, width } from '../../utilities'; import styles, { COLOR } from '../../styles'; import Profile from '../profile/profile'; import AboutUs from '../aboutUs/aboutUs'; const DRAWER_ROUTES = { [PROFILE]: { screen: Profile, navigationOptions: ({ navigation }) => { console.log("= inside navigationoptions") return { title: 'Profile', headerLeft: <MenuIcon navigation={navigation} /> }; } }, [ABOUT_US]: { screen: AboutUs, navigationOptions: ({ navigation }) => { return { title: 'About Us', headerLeft: <MenuIcon navigation={navigation} /> }; } } }; const DRAWER_ROUTES_CONFIG = { initialRouteName: PROFILE, drawerWidth: width - 50, contentComponent: props => <DrawerSideMenu {...props} />, navigationOptions: { headerStyle: styles.bgApp, headerBackTitleStyle: COLOR.WHITE, headerTintColor: COLOR.WHITE, headerTitleStyle: styles.cWhite } }; export default createDrawerNavigator(DRAWER_ROUTES, DRAWER_ROUTES_CONFIG); 评论以忽略它。

答案 2 :(得分:0)

  

pom.xml文件中没有属性文件或任何配置

请查看此documentation,您可以在根项目目录中创建sonar-project.properties文件,并设置许多影响分析的不同属性。 sonar.java.source是其中之一,它允许您特定的concreate java版本。 (details

  

在这种情况下,使Sonarqube忽略此规则的任何方法   情况?

我遇到过这样的情况,即声纳引擎将代码块标记为问题,但是从开发人员的角度来看并不是这样,因此在这种情况下,可以将其标记为假阳性。要设置允许/禁止在特定文件上标记问题的规则,请参阅此声纳documentation

答案 3 :(得分:0)

6.7 版本开始,Sonarqube 团队终于解决了这个问题。