SonarLint、SonarScanner Bug(非空注解)

SonarLint, SonarScanner Bug (NonNull annotation)

我发现 bug/issue 使用 SonarLint、SonarScanner,它显示 false-positive 与 NonNull 注释 (Java)、规则:"squid:S2637"、标题:“对于以下代码,“@NonNull”值不应设置为空值:

public class MyObject {
  @NonNull
  public final String text;

  public MyObject(@NonNull final String text) {
    this.text = text; // SonarLint shows issue in this place
  }
}

但是下面的代码没有问题(我同意):

public class MyObject {
  private final String text;

  public MyObject(@NonNull final String text) {
    this.text = text;
  }

  @NonNull
  public String getText() {
    return text;
  }
}

使用 Java Analyzer 4.8.0.9441,我发现另一个问题 class:

   public class DeviceInfo {
      public final long id;
      @NonNull
      public final String model;
      @NonNull
      public final String osVersion;

      public DeviceInfo(@NonNull final String model, @NonNull final String osVersion) {
        this(0, model, osVersion); //ISSUE: In this place Squid reports about uninitialized non-null fields
      }

      public DeviceInfo(final long id, @NonNull final String model, @NonNull final String osVersion) {
        this.id = id;
        this.model = model;
        this.osVersion = osVersion;
      }
  }

您在 MyObject class 中报告的第一个 FP 是一个已知错误,已在 SonarJava 4.7 中修复(参见 SONARJAVA-1776)。这与使用 this. 访问的字段未被我们的符号执行引擎正确识别的事实有关。最新版本的 SonarJava 包含修复程序,因此问题在更新后消失是合乎逻辑的。

您在 DeviceInfo class 中报告的第二个 FP 与以下问题有关 SONARJAVA-2227。该问题尚未得到解决,目前计划用于 SonarQube SonarJava 分析器的 4.10 版本。