【问题标题】:Cobertura changes Sonar violationsCobertura 更改声纳违规
【发布时间】:2016-01-07 18:43:48
【问题描述】:

我的同事今天早上发现,在启用 Cobertura 的情况下编译项目会改变同一项目的声纳结果。

在这个特定项目中,我们使用sonar:sonar 运行构建,然后使用cobertura:cobertura sonar:sonar 再次运行它。

比较中的声纳结果现在显示,在没有 Cobertura 的情况下,我们有 5 个严重性的 7/78/153/24/0 违规,但使用 Cobertura,它会更改为 7/81/94/24/0,特别是发现 3 个新的严重违规和 15 个新的重大违规没有 Cobertura 就找不到。

最大的变化之一是,在没有 Cobertura 的情况下,有 60 次违反针对空方法(其中许多是构造函数)的规则,而使用 Cobertura 时只有 3 次被报告。

如果 Cobertura 只阻止发现违规行为,我们可以独立运行这两个,但由于只有启用 Cobertura 才能发现一些违规行为,因此我们似乎必须进行两次单独的声纳分析。

这是已知的交互吗?除了在单独的版本中执行 Cobertura 和 Sonar 之外,还有其他解决方法吗?并使用两组结果来获得最佳数据?

【问题讨论】:

  • 新增的 3 个关键点是什么?
  • 类不应按名称进行比较 公共枚举方法无条件设置其字段 Dodgy - 已知非空值的冗余空检查

标签: java sonarqube cobertura


【解决方案1】:

根据您的评论,让我解释一下它似乎正在发生的事情: 您正在通过 SonarQube 使用 FindBugs(您提到的规则是 findbugs 规则)

首先让我们考虑一下这里涉及的两个工具以及它们是如何工作的(大致):

  • FindBugs : 它是一个基于 bytecode 的静态分析工具:它会读取字节码并在检测到错误模式时引发问题。

  • Cobertura:覆盖工具:它是如何工作的?它检测字节码以放置探针,并在运行测试时跟踪哪些探针被命中或未命中。

然后您可以了解问题可能出在哪里:FindBugs 最终会分析 Cobertura 检测的字节码。这将解释为什么您有一些新问题以及为什么在使用 cobertura 进行分析时会删除一些空方法问题。

为避免此问题,您必须确保在使用 FindBugs 分析字节码文件时未对其进行检测,但是(免责声明,我开发了声纳 java 插件,因此我可能在这里有点偏颇;))我建议您停止使用 FindBugs 来支持 SonarQube Java Analyzer,因为它的分析器处理方式略有不同(参见blog post

【讨论】:

  • “类不应按名称进行比较”是 squid:s1872,而不是 FindBugs 规则。正在使用的规则集是升级到 Java 插件 3.8 并替换所有不推荐使用的规则的结果。我们使用的是 Sonar 4.5.4,所以这是最新的插件。我想我们会用 3.9 和更高版本得到更准确的替换。 Cobertura 停止了空方法报告,我们并不感到惊讶,但为什么不是全部 60 个呢?为什么它会允许检测看似合法的其他问题?
  • 您的帖子信息不足。回答这些问题。你如何运行分析?哪个版本的maven插件?您可以发布分析的两个日志吗?也可能发生的是(由于某种原因)字节码没有以相同的方式提供给分析器,导致分析器的差异。
【解决方案2】:

用户错误。 :-(

事实证明,用户在使用 cobertura 运行 sonar:sonar 之前已经运行了 mvn clean,因此,正如benzonico 所暗示的,必须分析编译代码的 findbugs 规则没有运行。只有在源代码上运行的规则(如 java 插件)才会生成结果。这就是为什么我们错过了一堆规则和结果。

我们仍然在 Bamboo 和手动构建之间存在不一致,但这将是一个单独的帖子的主题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 2011-09-12
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    相关资源
    最近更新 更多