为某些代码关闭声纳

Posted

技术标签:

【中文标题】为某些代码关闭声纳【英文标题】:Turning Sonar off for certain code 【发布时间】:2012-06-13 21:04:05 【问题描述】:

是否可以关闭不希望测量的特定代码块的声纳 (www.sonarsource.org) 测量?

Findbugs 输出的“保留堆栈跟踪”警告就是一个例子。离开服务器时,我可能只想将消息传递回客户端,不包括我刚刚捕获的实际异常,如果客户端不知道该异常(因为客户端没有其中的 JAR例如包含异常)。

【问题讨论】:

【参考方案1】:

您可以使用 SuppressWarnings 注释类或方法

@java.lang.SuppressWarnings("squid:S00112")

squid:S00112 在这种情况下是 Sonar 问题 ID。您可以在 Sonar UI 中找到此 ID。转到问题钻取。找到一个你想禁止警告的问题。在代码中的红色问题框中,有一个带有给定问题定义的规则链接。单击该按钮后,您将在页面顶部看到 ID。

【讨论】:

我可以确认这也适用于特定的 FindBugs 规则 ID,例如@SuppressWarnings("findbugs:UI_INHERITANCE_UNSAFE_GETRESOURCE"). 问题是Eclipse显示警告Unsupported @SuppressWarnings("squid:S00112")。您可以将 Eclipse 配置为忽略这一点,但不会检测到诸如 @SuppressWarnings("uncheckedd") 中的拼写错误。 有关@SuppressWarnings 和 Sonar 的文档,请参阅 docs.codescan.io/hc/en-us/articles/…。 我们压制的时候如何添加cmets/justification? 看起来这个答案应该被标记为接受。【参考方案2】:

我建议您尝试使用 @SuppressWarnings("squid:S2078") 来抑制特定警告。

要抑制多个警告,您可以这样做 @SuppressWarnings("squid:S2078", "squid:S2076")

还有 //NOSONAR 注释告诉 SonarQube 忽略特定行的所有错误。

最后,如果您对用户界面拥有适当的权限,您可以直接从界面发出一个误报标志。

我建议禁止特定警告的原因是,最好阻止特定问题,而不是使用 //NOSONAR 并冒着意外在您的代码中出现 Sonar 问题的风险。

您可以在FAQ 中阅读更多相关信息

编辑:2016 年 6 月 30 日 SonarQube 现在称为 SonarLint

如果您想知道如何找到鱿鱼编号。只需点击 Sonar 消息(例如Remove this method to simply inherit it.),Sonar 问题就会展开。

在左下角,它将显示 squid 编号(例如 squid:S1185 可维护性 > 可理解性)

那么你可以通过@SuppressWarnings("squid:S1185")压制它

【讨论】:

感谢您提示 ingnoe 多个声纳立方体警告 在界面上将其标记为误报的另一个问题是,如果出于某种原因删除并再次添加项目,您设置的所有标志都将消失。 @annedroiid - 如果可以在 pom.xml 文件中完成相同的操作,有什么办法吗?我在这里提出问题:***.com/questions/57789832/…【参考方案3】:

这是FAQ。您可以将//NOSONAR 放在触发警告的行尾。

//NOSONAR

对于大多数语言,SonarQube 支持使用通用机制://NOSONAR 在问题行的末尾。这将抑制现在和将来可能在线提出的所有问题。

我更喜欢使用 FindBugs 机制,它包括添加 @SuppressFBWarnings 注释:

@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
    value = "NAME_OF_THE_FINDBUGS_RULE_TO_IGNORE",
    justification = "Why you choose to ignore it")

【讨论】:

同意。但是,我不确定 Sonar 是否正确解释 @SuppressFBWarnings(添加以避免与 java.lang.SuppressWarnings 冲突)并且也忽略它。 AFAIK,Sonar 使用 FindBugs。因此,如果 FindBugs 处理这些注释,我不明白为什么它们在通过 Sonar 运行 FindBugs 时不起作用。无论如何应该不难测试。 常见问题解答链接已过时。这是新的FAQ 您能否提供其他指向 SonarQube 常见问题解答的链接?我看到的是登录表单而不是常见问题解答 docs.sonarqube.org/latest/faq/#header-1【参考方案4】:

如果您无法帮助您的代码,请在收到警告的行上使用 //NOSONAR。有效!

【讨论】:

【参考方案5】:

我无法在声纳 5.6 中找到 squid 编号,使用此注释也可以:

@SuppressWarnings("pmd:AvoidCatchingGenericException", "checkstyle:com.puppycrawl.tools.checkstyle.checks.coding.IllegalCatchCheck")

【讨论】:

squid 用于声纳来源的 Java 数据库 (SonarAnalyzer Java)。 pmdcheckstyle 位于其他规则存储库中。【参考方案6】:

实际上很难理解哪个是问题的 ID,所以我使用了 @SuppressWarnings("all") 注释,它基本上适用于所有规则,但更准确地说,最好使用 ID。点击查看图片-> Sonar Issue ID

所以当点击“为什么这是一个问题?”在红色框中,您将进入一个带有解释的屏幕。在左侧的屏幕顶部,您可以看到规则名称,左侧是该规则的 ID。 因此,要申请此规则,您只需将此注释添加到您的类或方法中。

@SuppressWarnings("common-java:DuplicatedBlocks")

【讨论】:

以上是关于为某些代码关闭声纳的主要内容,如果未能解决你的问题,请参考以下文章

仅为声纳扫描仪添加某些规则而不是排除

声纳 - 如何跳过新代码的条件覆盖

多个 Maven 模块声纳代码覆盖率在 sonarqube 中显示为零

声纳不显示代码覆盖率

以下声纳问题的解决方案?

SonarQube 代码覆盖率 - 排除某些类