2010-05-08 2 views
7

Вот несколько фрагментов кода, которые могут вызывать исключение NullPointerException.Сценарии аннотации NPE и инструменты статического анализа для Java

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] Параметр должен быть ненулевая, но помечается как обнуляемым
  • 02: [F] не сообщается
  • 03: [F] не сообщается

IntelliJ IDE 9.0.2 (Community Edition):

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

Checker Framework (1.0.7):

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

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

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

Поскольку вы просите нескольких людей внести свой вклад, вы можете пометить эту вики сообщества. – bmargulies

+0

укажите, из какого пакета @Nullable и @NotNull, из-за того, что они не являются частью Java 6. –

+0

1. Отмечено как сообщество wiki. 2. У разных инструментов есть свои собственные библиотеки аннотаций.Для IntelliJ они происходили из org.jetbrains.nnotes. *, А для FindBugs это были edu.ums.cs.findbugs.annotations. * Но в обоих случаях библиотека называлась annotations.jar. – alex2k8

ответ

2

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

+0

Да, хорошая точка ... Думаю, что предоставленные результаты тестов одинаковы, когда я использовал CheckForNull или Nullable для FindBug. – alex2k8

+0

@ alex2k8: интересно. Интересно, изменилась ли более новая версия FindBugs? –

+0

Текущая версия FindBugs - 1.3.9 (та, которую я использовал в своих тестах). – alex2k8

Смежные вопросы