繁体   English   中英

Java :(错误?)SonarQube 6.7.1 LTS中的肯定S2637

[英]Java: (false?) positive S2637 in SonarQube 6.7.1 LTS

我在Java项目上使用SonarQube 6.7.1 LTS,并使用Maven声纳插件对其进行了分析。

我有以下代码示例,该示例在方法testGregorianCalendar2发现一个S2637问题:

public static final @Nonnull Calendar testGregorianCalendar1() {
    return GregorianCalendar.getInstance();
}

public static final @Nonnull Calendar testGregorianCalendar2() {
    return setTimeZone2(GregorianCalendar.getInstance());
}

public static final Calendar setTimeZone2(final Calendar inputCalendar) {
    if (null == inputCalendar) {
        return null;
    }
    return inputCalendar;
}

public static final @Nonnull Calendar testGregorianCalendar3() {
    return setTimeZone3(GregorianCalendar.getInstance());
}

public static final Calendar setTimeZone3(final Calendar inputCalendar) {
    return inputCalendar;
}

在方法testGregorianCalendar1testGregorianCalendar3 ,Sonar找不到该问题。 我认为在testGregorianCalendar2 ,也不应该找到它,或者应该在所有3种方法testGregorianCalendar*找到它,因为:

Sonar应该自行决定是否GregorianCalendar.getInstance()可以返回null。 如果是,则所有3个方法都可以返回null,Sonar应该在所有这些方法中找到问题。

如果为否,则使用非空值调用方法setTimeZone2 ,然后它将返回非空值,因此testGregorianCalendar2将返回非空值。

那里出了什么问题?

我不确定,但是这是我想发生的事情: setTimeZone2有条件的return null ,因此如果不检查该null值,则不允许从@Nonnull方法返回setTimeZone2的返回值。

也就是说,分析器看到:

public static final Calendar setTimeZone2(final Calendar inputCalendar) {
    if (/* something */) {
        return null;
    }
    return /* null if inputCalendar is null */;
}

它确定: setTimeZone2的返回值(可能)是@Nullable

然后看到:

public static final @Nonnull Calendar testGregorianCalendar2() {
    return setTimeZone2(/* something */);
}

并且它看到一个潜在的@Nullable值从标记为@Nonnull的方法返回,从而产生警告。

您和我可以setTimeZone2除非inputCalendar为null,否则inputCalendar将永远不会返回null;而由于GregorianCalendar.getInstance()将永远不会返回null,则inputCalendar永远不会为null,但是分析器可能不会评估setTimeZone2什么条件下可以返回null,只是在某些情况下可以。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM