如何强制执行squid的正确行为:S1161规则:" @ Override"注释应该用于任何方法

时间:2015-07-16 17:27:08

标签: java sonarqube

我开发了一个Java库,适用于基于 JDK5 的应用程序。用于构建应用程序的工具需要JDK7或更大版本。我使用的是版本8更新45:

java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

在分析之后,我收到了很多关于实现接口规范的方法的误报,例如:

public interface FileScanner {

    Collection<File> getFiles(File directory, String[] includes, String[] excludes);
}

False Positive Example

(参阅完整资料来源:https://github.com/gabrysbiz/maven-plugin-utils

我发现该规则基于字节码做出决策(参见Jira ticket)。我的主要版本等于49,与JDK5相关(参见major version numbers

$ javap -verbose AntFileScanner.class
Classfile /D:/Projects/maven-plugin-utils/sources/plugin-utils/target/classes/biz/gabrys/maven/plugin/util/io/AntFileScanner.class
  Last modified 2015-07-16; size 1881 bytes
  MD5 checksum 7ea340377469b44df88d5936c2ff4134
  Compiled from "AntFileScanner.java"
class biz.gabrys.maven.plugin.util.io.AntFileScanner implements biz.gabrys.maven.plugin.util.io.FileScanner
  minor version: 0
  major version: 49
  flags: ACC_SUPER

我使用Jenkins 1.619和SonarQube Plugin 2.2.1运行分析。我将SonarQube 5.1.1与Java Plugin 3.4。

一起使用

我该如何纠正?

2 个答案:

答案 0 :(得分:2)

其他人也有同样的问题,您可以在链接中看到:

http://blog.gmane.org/gmane.comp.java.sonar.general/page=91

我尝试使用&#39; sonar.java.source&#39;和&#39; sonar.java.target&#39;建议:

http://docs.sonarqube.org/display/SONAR/Features+details

但我认为它现在只适用于PMD插件:

http://docs.sonarqube.org/display/PLUG/PMD+Plugin

然后,我看到了JIRA票。所以,实际上在这种情况下存在一个错误。 JIRA CR已关闭,但问题仍然发生在Java 5上: https://jira.sonarsource.com/browse/SONARJAVA-249

&#34;事实上,我们现在无法实施此规则。 @Override注释具有源保留,并由编译器删除。 所以我们检测它的唯一机会来自AST。 但是,我们可以检测一个方法是否实际上只覆盖了当前字节码中的另一个方法。 因此,此规则取决于检查中可用的符号表。&#34;

有一个新的未解决的CR来解决此问题,https://jira.sonarsource.com/browse/SONARJAVA-818

修复后,它将使用属性&#39; sonar.java.source&#39;我之前说过。

因此,要解决此问题,修复尚未准备好,我们有两个选择:

1)将其标记为“误报”&#39;在服务器上;
2)使用&#39; @ SuppressWarnings&#39;使用规则参考的注释(S1161):

http://docs.sonarqube.org/display/PLUG/Java+FAQ

在这种情况下,您的代码将是:

public class FileScannerImpl implements FileScanner {
    @SuppressWarnings("squid:S1161")
    Collection<File> getFiles(File directory, String[] includes, String[] excludes) {
         [...]
    }
}

答案 1 :(得分:1)

这已在Java插件3.9(SONARJAVA-818中修复,请参阅release notes)。