Как подавить предупреждения FindBugs для полей или локальных переменных

Я хотел бы подавить предупреждения FindBugs для определенных полей или локальных переменных. Документы FindBugs, что Target могут быть типом, полем, методом, параметром, конструктором, пакетом для его edu.umd.cs.findbugs.annotations.SuppressWarning аннотации [1]. Но для меня не работает, чтобы аннотировать поле, только когда я аннотирую метод, предупреждение будет подавлено.

Аннотирование целого метода кажется мне широким. Есть ли способ подавить предупреждения в определенных областях? Существует еще один смежный вопрос [2], но ответа нет.

[1] http://findbugs.sourceforge.net/manual/annotations.html

[2] Подавить предупреждения FindBugs в Eclipse

Демо-код:

public class SyncOnBoxed
{
    static int counter = 0;
    // The following SuppressWarnings does NOT prevent the FindBugs warning
    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DL_SYNCHRONIZATION_ON_BOXED_PRIMITIVE")
    final static Long expiringLock = new Long(System.currentTimeMillis() + 10);

    public static void main(String[] args) {
        while (increment(expiringLock)) {
            System.out.println(counter);
        }
    }

    // The following SuppressWarnings prevents the FindBugs warning
    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DL_SYNCHRONIZATION_ON_BOXED_PRIMITIVE")
    protected static boolean increment(Long expiringLock)
    {
        synchronized (expiringLock) { // <<< FindBugs warning is here: Synchronization on Long in SyncOnBoxed.increment()
            counter++;
        }
        return expiringLock > System.currentTimeMillis(); // return false when lock is expired
    }
}

Ответ 1

@SuppressFBWarnings в поле только подавляет предупреждения об ошибках findbugs для этого объявления поля, а не каждое предупреждение, связанное с этим полем.

Например, это подавляет предупреждение "Поле только когда-либо установленное на нуль":

@SuppressFBWarnings("UWF_NULL_FIELD")
String s = null;

Я думаю, что лучшее, что вы можете сделать, это изолировать код с предупреждением до наименьшего метода, который вы можете, а затем подавить предупреждение на весь метод.

Примечание: @SuppressWarnings отмечен устарел в пользу @SuppressFBWarnings

Ответ 2

Отметьте http://findbugs.sourceforge.net/manual/filter.html#d0e2318 Существует тег Local, который можно использовать с тегом Method. Здесь вы можете указать, какая ошибка должна быть исключена для конкретной локальной переменной. Пример:

<FindBugsFilter>
  <Match>
        <Class name="<fully-qualified-class-name>" />
        <Method name="<method-name>" />
        <Local name="<local-variable-name-in-above-method>" />
        <Bug pattern="DLS_DEAD_LOCAL_STORE" />
  </Match>
</FindBugsFilter>