簡體   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