Что показывают эти сообщения FindBug? - PullRequest
0 голосов
/ 16 апреля 2010

Не каждое описание из 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_IN?
  • Почему XXXX.class в WL_USING_GETCLASS_RATHER_THAN_CLASS_LITERAL лучше, чем getClass ()? GetClass () в суперклассе, вызываемом из подкласса, всегда будет возвращать объект Class из подкласса, что, на мой взгляд, хорошо.
  • Что именно делает EQ_UNUSUAL? Следует проверить, что аргумент относится к тому же типу самого класса, но это не так?
  • Были ли у вас проблемы с перерывами? Есть ли реальная ценность с SF_SWITCH_FALLTHROUGH? Звучит очень сильно для меня.
  • Понятия не имею, что могут быть TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_ALWAYS_SINK и TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_NEVER_SINK.

1 Ответ

8 голосов
/ 17 апреля 2010

Я могу комментировать некоторые из описаний 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:

...