Findbugs и сравнение

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

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

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

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

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

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

У этого есть я царапающий мою голову также.

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

Который дает следующее предупреждение findbugs:

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

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

7
задан Rob Goodwin 1 June 2010 в 17:03
поделиться

3 ответа

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

7
ответ дан 6 December 2019 в 23:01
поделиться

Примечание:

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

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

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

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

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

3
ответ дан 6 December 2019 в 23:01
поделиться

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

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

javap -v TheClassThatContainssetSpacerPerLevel

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

1
ответ дан 6 December 2019 в 23:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: