Sonar报告了try-with-resources块中分支覆盖不足的误报

Boh*_*ian 3 false-positive try-with-resources sonarqube

使用SonarQube的最新版本(4.3.2),try-with-resources块会给catch线路的分支覆盖带来误报.例如:

public List<String> getLines(String filename) {
    try (InputStream inputStream = getInputStream(filename)){
        return IOUtils.readLines(inputStream);
    } catch (IOException e) { // <<<<<<< REPORTS AS BRANCH COVERAGE 2/8 
        throw new IllegalArgumentException(e);
    }
}
Run Code Online (Sandbox Code Playgroud)

但我的单元测试涵盖了每个点抛出的异常,所有其他线路都有100%覆盖 - 实际覆盖率为100%.那里的"8"来自哪里?抛出异常不是8个地方.

我尝试添加// NOSONAR到问题行,甚至尝试将其添加到每一行,但报告是相同的.

其他类型的问题使用的时候忽略了// NOSONAR,所以它不是一个声纳配置问题.

我怀疑这是因为声纳不允许try-with-resources块产生的字节码中的额外try-catch块.

有没有办法装饰成功导致声纳忽略这种特殊误报的代码?

Dar*_*gue 7

SonarQube不支持Java try-with-resources构造.

它还报告了使用时的虚假空检问题.

由于SonarQube正在使用其他工具(PMD/FindBugs等),并且他们使用字节码分析,他们(诚然)说有时这些都是假阳性."SonarQube方式"的答案是不要使用try-with-resources,直到他们正确处理生成的字节码.

然而,没有理智的开发者会建议让尾巴摇尾巴.我的建议是通过SonarQube插件标记为假定位,但它对测试覆盖率没有帮助,因为在这种情况下对字节码的分析是错误的.

SonarQube本身有数千个问题(他们吃自己的狗粮).