Я недавно начал использовать 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 для покрытия кода. Когда я выключил это, все мои высокоприоритетные предупреждения исчезли. Это имеет смысл теперь. Спасибо за обратную связь.
ОБНОВЛЕНИЕ. У меня эта сборка выполняется на сервере Hudson, а код обрабатывается Clover для покрытия кода. Когда я выключил это, все мои высокоприоритетные предупреждения исчезли. Теперь это имеет смысл. Спасибо за ответ.
Примечание:
for(int spaces = 0;spaces < spacesPerLevel;spaces++)
{
result = result.concat(" ");
}
Если результат
представляет собой java.lang.String
, это может быть неэффективным, поскольку вы выполняете следующие шаги для каждого символа пробела:
char []
для хранения результата конкатенации java.lang.String
, который обернут вокруг символьный массив Если вы делаете это неоднократно, особенно когда результат
уже длинный, это займет много времени.
Если для этого метода важна производительность (как время, так и память), следует рассмотреть возможность использования StringBuilder
(небезопасный для потоков) или StringBuffer
(безопасный для потоков).
Вы запускаете Findbugs через плагин Eclipse, ant или gui? Возможно ли, что код не перекомпилировался с момента запуска (до внесения изменений)?
Если setSpacesPerLevel не слишком длинный, опубликуйте вывод
javap -v TheClassThatContainssetSpacerPerLevel
Что касается второй ошибки, вам нужно показать весь цикл, прежде чем можно будет сказать, является ли это проблемой.