Я недавно начал использовать инструмент статического анализа 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, и Кловер инструментировал код для покрытия кода. Когда я выключил это, все мои высокоприоритетные предупреждения исчезли. Это имеет смысл сейчас. Спасибо за отзыв.