Comments 58
Спасибо. Интересно посмотреть на другой язык. Прочитал как-бы свою статью со стороны. Интересное ощущение. :) Глядишь, и заинтересуются российские программисты методологией статического анализа. У нас явно в этом какой-то пробел. Хотя, пожалуй, это следствие, что огромная часть решаемых задач — аутсорс.
P.S. Главное, не признавайтесь в заговоре. Тссс! :)
P.S. Главное, не признавайтесь в заговоре. Тссс! :)
+12
Вы забыли спросить «А сообщили ли об ошибках разработчику?»
+6
Как-то так:
sourceforge.net/p/cdk/bugs/1314/
Всё описывать не стал, просто прорекламировал FindBugs в конце. Зато не поленился вычислить подходящий random seed (0x260E92790EB7L)!
sourceforge.net/p/cdk/bugs/1314/
Всё описывать не стал, просто прорекламировал FindBugs в конце. Зато не поленился вычислить подходящий random seed (0x260E92790EB7L)!
+2
Было бы интересно посмотреть на результат статического анализа самого статического анализатора:)
+5
Думаю, это довольно скучное занятие: авторы анализатора сами анализатором проверяют свой код постоянно и всё интересное исправляют сразу даже до коммита в репозиторий.
+4
Может уже спрашивали в других статьях, но есть ли подобный анализатор для C#?
0
Resharper же. Очень много всего подсказывает прямо в коде и предлагает прямо на месте исправить с помощью Quick Fixes.
+1
Не ну мне кажется что Resharper «не так крут» как специализированная программа. До Resharper-а всё руки не доходят купить его и покатать на своих прогах.
0
«не так крут» как специализированная программа
Интересно, что есть тогда решарпер?
0
Решарпер хорош тем, что показывает подозрительные места прямо во время разработки. Это удобно тем, что ошибка привязана к контексту: легче исправить баг в том конкретном участке, с которым вы работаете сейчас, чем в произвольном месте всего проекта.
Кроме того, можете посоветовать им на Issue Tracker'е свой quickfix или inspection, если есть идеи. Правда, мой до сих пор не запилили :(
Кроме того, можете посоветовать им на Issue Tracker'е свой quickfix или inspection, если есть идеи. Правда, мой до сих пор не запилили :(
+1
У них command line tools вышли с 8 R#, там есть анализатор. Да, и оно вроде как бесплатное.
+1
FxCop есть в комплекте.
+1
10. Стоит добавить что в таких случаях надо оборачивать строку в java.util.regex.Pattern.quote
Буквально сегодня обнаружил похожий инструмент, types.cs.washington.edu/checker-framework/, выглядит даже круче FindBugs
Буквально сегодня обнаружил похожий инструмент, types.cs.washington.edu/checker-framework/, выглядит даже круче FindBugs
+1
Используем s 2007 года вместе с Jenkins. Помогает сильно!
0
По поводу номера 3.
Разве Java не оптимизирует проверку условий? Это же логическое «И». Получается, что если первое выражение вернет false, то вычислять вторую часть нет смысла.
Разве Java не оптимизирует проверку условий? Это же логическое «И». Получается, что если первое выражение вернет false, то вычислять вторую часть нет смысла.
0
Используя & мы сами говорим — «Обязательно проверь и остальное!»
+7
Это называется Short-circuit evaluation или «сокращенные логические операции»
В Java при использовании & и/или | второй опреанд вычисляется всегда, даже если результат известен исходя из значения первого операнда. При Short-circuit evaluation(&& ||) лишних вычислений не производится.
В Java при использовании & и/или | второй опреанд вычисляется всегда, даже если результат известен исходя из значения первого операнда. При Short-circuit evaluation(&& ||) лишних вычислений не производится.
+3
SonarQube + Jenkins — отличная связка для автоматического статического анализа кода
Помимо анализа на ошибки, есть еще куча настраиваемых метрик, по которым даже прогресс можно отслеживать
Помимо анализа на ошибки, есть еще куча настраиваемых метрик, по которым даже прогресс можно отслеживать
+2
А ещё Sonar использует не только FindBugs, но и Checkstyle и PMD. А если ещё прикрутить это в виде плагина к IDE для проверки в реальном времени — вообще получается сказка.
+1
А напомните мне пожалуйста, в таком случае —
— байт код вообще будет генерироваться, или компилятор просто выкинет данный вызов?
line.trim();
— байт код вообще будет генерироваться, или компилятор просто выкинет данный вызов?
0
Байт код сгенерируется. Но потом — во время выполнения, на этапе оптимизации, вполне может выкинуть.
+2
Останется. Проверил на 1.7_21
+1
почему же ему не генерироваться? возвращаемое значение можно игнорировать, но это не значит, что метод ничего не делает и его можно спокойно вырезать, даже если он просто занимает процессорное время.
0
почему не значит? если метод без сайд эффектов и его возвращаемое значение не используется, этот метод оптимизирующему компилятору можно и нужно выкинуть. что собственно в ряде языков и делается.
trim логически выглядит как метод который должен быть методом без сайд эффектов :)
собственно вопрос в яве новая строка появится в string pool в какой момент, уже внутри вызов trim или только в момент возвращение значения, если в момент то логически trim это метод без сайд эффектов, просто компилятор явы не может это выяснить, хотя хотелось бы
trim логически выглядит как метод который должен быть методом без сайд эффектов :)
собственно вопрос в яве новая строка появится в string pool в какой момент, уже внутри вызов trim или только в момент возвращение значения, если в момент то логически trim это метод без сайд эффектов, просто компилятор явы не может это выяснить, хотя хотелось бы
0
Компилятор Java в байт-код практически ничего не оптимизирует. Зато ваши .class-файлы довольно независимы. К примеру, в рантайме вы можете подсунуть другой rt.jar и подменить реализацию .trim() на такую, которая уже даст side-effect. Практически все оптимизации выполняются на уровне JIT-компиляции.
+2
Компилятор Java в байт-код практически ничего не оптимизируетЕсть определённые исключения (которые, кстати, очень мешают). Например (классический пример), при компиляции подставляются значения публичных констант, описанных в других классах. В итоге может получиться такая ситуация, что ты константу переопределил, класс, в котором она описана, перекомпилировал (а остальные не стал), а в месте использования реальное значение осталось старое.
+3
>> константу переопределил
мм?
мм?
0
Читайте «изменил её значение в исходнике».
+1
Скажем, есть у нас класс A:
И есть класс B:
Компилируем, запускаем, получаем ожидаемый результат:
Теперь меняем класс A следующим образом:
Компилируем _только_ его (не перекомпилируя класс B), заменяем файл A.class, запускаем — и получаем не то, чего ожидали:
public class A {
public static final String SOME_CONSTANT = "1";
}
И есть класс B:
import A;
public class B {
public static void main(String[] args) {
System.out.println("A.SOME_CONSTANT = " + A.SOME_CONSTANT);
}
}
Компилируем, запускаем, получаем ожидаемый результат:
A.SOME_CONSTANT = 1
Теперь меняем класс A следующим образом:
public class A {
public static final String SOME_CONSTANT = "2";
}
Компилируем _только_ его (не перекомпилируя класс B), заменяем файл A.class, запускаем — и получаем не то, чего ожидали:
A.SOME_CONSTANT = 1
вместоA.SOME_CONSTANT = 2
0
С 1.) есть другая серъёзная проблема: если была цель получить равномерно распределённое число в диапазоне [low, hi], то она не достигнута.
Например, если low==0 и hi==(2/3 от максимального int), то в полученном распределении числа в диапазоне [0, max_int/3] встречаются в два раза чаще, чем в диапазоне [max_int/3, 2*max_int/3]
Например, если low==0 и hi==(2/3 от максимального int), то в полученном распределении числа в диапазоне [0, max_int/3] встречаются в два раза чаще, чем в диапазоне [max_int/3, 2*max_int/3]
+4
> 6. Сравнение объектов разных типов
Может в atom.equals определено сравнение со строкой? Правда это было бы нарушением контракта Object.equals
Может в atom.equals определено сравнение со строкой? Правда это было бы нарушением контракта Object.equals
+1
Большинство ошибок на уровне детского сада.
-3
Вы не поверите: большинство ошибок в программировании вообще — на уровне детского сада. Даже у самых крутых разработчиков (разумеется, кроме Джеффа Дина).
+1
Какую версию FindBug использовали? По моему опыту версия 2 стала находить ошибок гораздо больше
0
Такое ощущение, что разработчики не только не пользуются статическим анализом, но и вообще пишут код в Блокноте. Вроде, все современные IDE проверяют, не пытается ли разработчик подсунуть в equals значения не приводимых типов.
+2
Запустил на пробном проекте (который с нуля сам пишу), только пару спорных вещей нашел. Все же в IDEA тоже встроен анализатор.
На рабочем проекте нашло около 2000, быстро проглядел группы проблем, есть парочка серьезных. Буду встраивать в наш Jenkins.
На рабочем проекте нашло около 2000, быстро проглядел группы проблем, есть парочка серьезных. Буду встраивать в наш Jenkins.
0
Советую сразу SonarQube. В нём есть не только FindBugs, но ещё и Checkstyle с PMD, плюс свои проверки. С Jenkins-ом SonarQube вполне дружит — можно либо установить плагин для Jenkins-а, либо воспользоваться плагином для maven-а и при сборке добавить в параметры мавена
sonar:sonar
(мы сделали именно так). Ну и опять же — история проекта с красивыми табличками и графиками, уведомления по почте, назначение замечаний на конкретных людей (можно заводить соответствующие задачи в issue tracker-ах) и т.д.0
Хм, так это отдельное приложение? Т.е. нельзя взять и просто добавить плагин в Jenkins, нужно его ставить отдельно?
Через maven не получится, проект древний, на ant :(
Через maven не получится, проект древний, на ant :(
0
FindBugs крайне полезен. К тому же, помимо eclipse плагина, у него есть maven плагин и возможность запускаться во время билда CI сервером. В общем-то, как и у Checkstyle и PMD (о которых уже упоминали в комментах).
Checkstyle, кстати, стоит использовать одновременно с FindBugs. Если FB анализирует байт-код, то CS анализирует исходники и находит различные проблемы с стандартами именования, форматирования кода — FindBugs'у неведомые.
Помимо этой троицы, есть CodePro Analytix. Который умеет намного больше предыдущих. Но, к сожалению, после того как он перешел к Google, его перестали поддерживать. Оффициально, существует только версия плагина для eclipse 3.6 (что не мешает ему почти полностью работать и под 3.7 и под 4.2.2). И у него, к сожалению, нет maven плагина (или же я плохо искал). Но CodePro помимо статического анализа (с большим количеством правил чем у FB и CS), умеет анализировать покрытие кода тестами, различные метрики, анализировать зависимости и находить похожий код (т.е. потенциально дублирование кода). Еще вроде умеет генерить юнит тесты, но пользоваться этим мне никогда не доводилось. А так, очень удобный комбайн.
Checkstyle, кстати, стоит использовать одновременно с FindBugs. Если FB анализирует байт-код, то CS анализирует исходники и находит различные проблемы с стандартами именования, форматирования кода — FindBugs'у неведомые.
Помимо этой троицы, есть CodePro Analytix. Который умеет намного больше предыдущих. Но, к сожалению, после того как он перешел к Google, его перестали поддерживать. Оффициально, существует только версия плагина для eclipse 3.6 (что не мешает ему почти полностью работать и под 3.7 и под 4.2.2). И у него, к сожалению, нет maven плагина (или же я плохо искал). Но CodePro помимо статического анализа (с большим количеством правил чем у FB и CS), умеет анализировать покрытие кода тестами, различные метрики, анализировать зависимости и находить похожий код (т.е. потенциально дублирование кода). Еще вроде умеет генерить юнит тесты, но пользоваться этим мне никогда не доводилось. А так, очень удобный комбайн.
0
Большое спасибо за статью! Прочитал про FindBugs и решил его попробовать, но не получилось, помогите пожалуйста запустить. Eclipse Juno Service 2. Делаю Help — Install new Siftware — work with «findbugs.cs.umd.edu/eclipse-daily», Next, Yes, Next, Finish. Перезапускаю Eclipse, вижу перспективу FindBugs, слева BugExplorer, но он пустой. Как запустить проверку кода проекта?
0
Sign up to leave a comment.
FindBugs против CDK