Сценарии аннотации NPE и инструменты статического анализа для Java

Вот много фрагментов кода, которые могут бросить NullPointerException.

01:

public void m1(@Nullable String text) {
    System.out.print(text.toLowerCase()); // <-- expect to be reported.
}

02:

private boolean _closed = false;

public void m1(@Nullable String text) {
    if(_closed)
       return;

    System.out.print(text.toLowerCase()); // <-- expect to be reported.
}

03:

public void m1(@NotNull String text) {
    System.out.print(text.toLowerCase());
}

public @Nullable String getText() {
    return "Some text";
}

public void m2() {
    m1(getText());  // <-- expect to be reported.
}

У различных людей есть доступ к различным инструментам статического анализа. Было бы хорошо собрать информацию, какие инструменты могут обнаружить и сообщить о проблемах, и что перестало работать. Кроме того, если у Вас есть свои собственные сценарии, опубликуйте их.

Здесь мои результаты

FindBugs (1.3.9):

  • 01: [S] Параметр должно быть непустым, но отмечен как nullable
  • 02: [F] не сообщаемый
  • 03: [F] не сообщаемый

IntelliJ IDE 9.0.2 (Общественный выпуск):

  • 01: [S] Вызов метода text.toLowerCase () может произвести java.lang. NullPointerException
  • 02: [S] Вызов метода text.toLowerCase () может произвести java.lang. NullPointerException
  • 03: [S] Аргумент getText () могло бы быть пустым

Платформа средства проверки (1.0.7):

  • 01: [S] разыменовывают текста возможно-нулевой-ссылки
  • 02: [S] разыменовывают текста возможно-нулевой-ссылки
  • 03: [S] несовместимые типы. найденный: Строка @Nullable, требуемая: Строка @NonNull

Пакеты аннотаций:

javax.annotation.* // JSR 305
edu.umd.cs.findbugs.annotations.* // FindBugs
org.jetbrains.annotations.* // IntelliJ
checkers.nullness.quals.* // Checker Framework

7
задан 6 revs, 3 users 98% 21 January 2017 в 20:55
поделиться

1 ответ

Обратите внимание, что FindBugs совершенно по-разному воспринимает @Nullable и @CheckForNull - первый в основном говорит "Я понятия не имею, должен ли этот метод допускать null или нет", а второй говорит "Этот метод явно допускает null". У моей команды было гораздо больше полезных результатов FindBugs, когда мы глобально изменили все @Nullable на @CheckForNull в нашем коде, так как последнее - это то, что мы действительно имели в виду.

2
ответ дан 7 December 2019 в 18:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: