Findbugs и сравнение - PullRequest
       8

Findbugs и сравнение

7 голосов
/ 01 июня 2010

Я недавно начал использовать инструмент статического анализа findbugs в сборке Java, которую я делал. Первый отчет вернулся с множеством предупреждений высокого приоритета. Будучи одержимым человеком, я был готов пойти на то, чтобы выбить их всех. Тем не менее, я должен что-то упустить. Я получаю большинство предупреждений при сравнении вещей. Например, следующий код:

   public void setSpacesPerLevel(int value)
   {
      if( value >= 0)
      {
         spacesPerLevel = value;
      }
      else
      {
         spacesPerLevel = 0;
      }
   }

выдает предупреждение с высоким приоритетом в операторе if, который читает.

Файл: Indenter.java, строка: 60, тип: BIT_AND_ZZ, приоритет: высокий, категория: ПРАВИЛЬНОСТЬ Проверьте, если ((...) & 0) == 0 в sample.Indenter.setSpacesPerLevel (INT)

Я сравниваю int с int, похоже на обычную вещь. Я получаю довольно много ошибок такого типа с аналогичными простыми сравнениями.

У меня есть много других высокоприоритетных предупреждений о том, что кажется простыми блоками кода. Я что-то здесь упускаю? Я понимаю, что статический анализ может давать ложные срабатывания, но ошибки, которые я вижу, кажутся слишком тривиальными для случая, чтобы быть ложным срабатыванием.

В этот раз я тоже почесал голову.

    for(int spaces = 0;spaces < spacesPerLevel;spaces++)
    {
       result = result.concat(" ");
    }

Что выдает следующее предупреждение о найденных ошибках:

File: Indenter.java, Line: 160, Type: IL_INFINITE_LOOP, Priority: High, Category: CORRECTNESS

There is an apparent infinite loop in sample.Indenter.indent()

This loop doesn't seem to have a way to terminate (other than by perhaps throwing an exception).

Есть идеи?

Так что в основном у меня есть несколько файлов и 50-60 высокоприоритетных предупреждений, похожих на приведенные выше. Я использую findbugs 1.3.9 и вызываю его из задачи findbugs ant

UPDATE: У меня есть эта сборка, выполняемая сервером Hudson, и Кловер инструментировал код для покрытия кода. Когда я выключил это, все мои высокоприоритетные предупреждения исчезли. Это имеет смысл сейчас. Спасибо за отзыв.

Ответы [ 3 ]

7 голосов
/ 01 июня 2010

ОБНОВЛЕНИЕ: у меня есть эта сборка, выполняемая сервером hudson, и код был инструктирован Clover для покрытия кода. Когда я выключил это, все мои высокоприоритетные предупреждения исчезли. Это имеет смысл сейчас. Спасибо за отзыв.

3 голосов
/ 01 июня 2010

Примечание:

for(int spaces = 0;spaces < spacesPerLevel;spaces++)
{
   result = result.concat(" ");
}

Если result - это java.lang.String, это может быть неэффективно, так как вы делаете следующие шаги для каждого пробела:

  1. создайте новый char[] для хранения результата конкатенации
  2. создать новый java.lang.String экземпляр, который обернут вокруг массива символов

Если вы делаете это несколько раз, особенно когда result уже длинный, это займет много времени.

Если для этого метода важна производительность (время и память), вам следует рассмотреть возможность использования StringBuilder (не поточно-ориентированного) или StringBuffer (поточно-ориентированного).

1 голос
/ 01 июня 2010

Вы используете Findbugs через плагин Eclipse, Ant или GUI? Возможно ли, что код не перекомпилировался с момента его запуска (до внесения изменений)?

если setSpacesPerLevel не слишком длинный, опубликовать вывод

javap -v TheClassThatContainssetSpacerPerLevel

Что касается второй ошибки, вам нужно будет показать весь цикл, прежде чем можно будет сказать, если это была проблема.

...