Что показывают эти сообщения FindBug?

Не все описания из http://findbugs.sourceforge.net/bugDescriptions.html понятны. мне. Конечно, я могу изучить реализацию, но если кто-то более опытен, чем я, некоторые объяснения и примеры были бы замечательными.

  • У вас есть несколько примеров для UI_INHERITANCE_UNSAFE_GETRESOURCE, когда возникает проблема?
  • В BX_UNBOXED_AND_COERCED_FOR_TERNARY_OPERATOR тоже не вижу проблемы. Если один тип «больше», чем другой, например, int и float, то результатом будет float. Если это Integer и Float, то это и оболочка Float. Это то, что я ожидаю.
  • Действительно ли GC_UNRELATED_TYPES помогает находить ошибки? Разве компилятор не должен проверять, если, взяв данный пример, Foo не может войти в Collection<String>.
  • Означает ли HE_SIGNATURE_DECLARES_HASHING_OF_UNHASHABLE_CLASS что-то вроде bla(Foo f){hashtable.put(f);}, где «Foo» не хэшируется? FingBugs тоже «видит» подклассы?
  • NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH сильнее «неправильно», чем NP_ALWAYS_NULL_EXCEPTION? Почему два случая ошибки, а с NP_NULL_ON_SOME_PATH_EXCEPTION еще один? Очень похоже на меня.
  • Что является примером SIO_SUPERFLUOUS_INSTANCEOF? Что-то вроде foo(String s){if (s intenceof String) .... Это также выполняет нулевую проверку, но здесь это не тест...
  • NN_NAKED_NOTIFY. На мой взгляд описание не понятное. Смена состояния не требуется. Если я использую new Object() для ожидания и уведомления, я не изменяю состояние объекта. Или состояние является состоянием блокировки? Я не понимаю.
  • SP_SPIN_ON_FIELD. Может ли случиться так, что компилятор вынесет это за пределы цикла? Для меня это не имеет смысла, потому что извне поток всегда может изменить значения. И если переменная равна volatile, JVM не может кэшировать значение. Так в чем смысл?
  • В чем разница между STCAL_STATIC_CALENDAR_INSTANCE и STCAL_INVOKE_ON_STATIC_CALENDAR_INSTANCE или STCAL_INVOKE_ON_STATIC_DATE_FORMAT_INSTANCE/STCAL_STATIC_SIMPLE_DATE_FORMAT_INSTANCE?
  • Почему XXXX.class в WL_USING_GETCLASS_RATHER_THAN_CLASS_LITERAL лучше, чем getClass()? getClass() в суперклассе, вызванном из подкласса, всегда будет возвращать объект класса из подкласса, что, я думаю, хорошо.
  • Что именно делает EQ_UNUSUAL? Он должен проверять, что аргумент имеет тот же тип, что и сам класс, но это не так?
  • Были ли у вас когда-нибудь проблемы с перерывами? Есть ли реальная ценность с SF_SWITCH_FALLTHROUGH? Звучит сильно для меня.
  • Понятия не имею, что такое TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_ALWAYS_SINK и TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_NEVER_SINK.

person Community    schedule 16.04.2010    source источник


Ответы (1)


Я могу прокомментировать некоторые упомянутые вами описания FindBugs, основываясь на своем опыте и тестировании, не обращаясь к исходному коду FindBugs.

  • UI_INHERITANCE_UNSAFE_GETRESOURCE: если вы используете this.getClass().getResource(...) с относительным URI, этот URI разрешается относительно класса this. Когда подкласс находится в другом пакете и вы получаете ресурс для подкласса, вы в конечном итоге смотрите в другое место (относительно подкласса). Я знаю примеры, когда класс ищет ресурс, о котором известно, что он находится в том же пакете, вызывая getResource() с относительным URI, содержащим только имя файла. Если в этом классе использовать this.getClass() вместо ClassName.class, а фактический экземпляр относится к подклассу, ресурс не будет найден.

  • BX_UNBOXED_AND_COERCED_FOR_TERNARY_OPERATOR: речь идет о типах чисел в коробках, таких как Integer и Float, в отличие от примитивных типов чисел, таких как int и float. Для примитивов ваше ожидание верно: в boolean ? int : float int приводится к float. Но для обернутых чисел происходит нечто неожиданное: в boolean ? Integer : Float Integer распаковывается и преобразуется в float. Я ожидал, что объекты будут возвращены без изменений, как в boolean ? (Number)Integer : Float.

    boolean b = Boolean.TRUE;
    final Integer i = 123456789;
    final Float f = 1.0f;
    final Number x = b ? i : f;
    System.out.println("wrapped coerced: " + x); // 1.23456792E8
    final Number y = b ? (Number) i : f;
    System.out.println("wrapped uncoerced: " + y); // 123456789
    
  • GC_UNRELATED_TYPES: FindBugs знает о некоторых методах сбора, которые не могут быть сгенерированы для Java 1.5, например Collection.contains(Object). Здесь аргумент должен быть типа Object, иначе существующий исходный код может сломаться. Но любой объект, не относящийся к типу коллекции, обязательно не будет содержаться, поэтому запрос на включение Integer в коллекцию String, вероятно, является ошибкой.

    Collection<String> coll = new ArrayList<String>();
    System.out.println(coll.contains(42));
    
  • HE_SIGNATURE_DECLARES_HASHING_OF_UNHASHABLE_CLASS: ?

  • NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH: ?

  • SIO_SUPERFLUOUS_INSTANCEOF: ?

  • NN_NAKED_NOTIFY: ?

  • SP_SPIN_ON_FIELD: если вы вращаете поле, которое не равно volatile, JIT может оптимизировать код (путем перемещения чтения из цикла), пока поток, выполняющий цикл, дает тот же результат, не принимая во внимание существование и действия других потоков. Вот почему есть ключевое слово volatile. Я не знаю ни одного примера, где это на самом деле привело бы к ошибке.

  • STCAL_STATIC_CALENDAR_INSTANCE: ?

  • WL_USING_GETCLASS_RATHER_THAN_CLASS_LITERAL: в примере FindBugs метод синхронизируется getClass() для доступа к статическому члену своего класса. Подкласс будет синхронизироваться в подклассе, поэтому суперкласс и подкласс могут войти в синхронизированный блок одновременно, поскольку они синхронизируются на разных мониторах, что приводит к состоянию гонки.

  • EQ_UNUSUAL: ?

  • SF_SWITCH_FALLTHROUGH: Иногда это помогает мне, потому что я часто пропускаю break. Интересно, что в только что выполненном тестовом случае я получил в дополнение к этому сообщению FindBugs сообщение SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH.

  • TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_ALWAYS_SINK: ?

person Community    schedule 16.04.2010
comment
для STCAL_STATIC_CALENDAR_INSTANCE вот ответ stackoverflow.com/q/2409657/579646 - person max4ever; 28.06.2012