?

Log in

No account? Create an account
Speaker Rabbit

abbra


CIFS: curious information funneled sometimes


Previous Entry Share Next Entry
Анализмус Два
Speaker Rabbit
abbra
С 2005 года Coverity и Department Homeland Security проводят работу по усовершенствованию свободного кода. DHS выделила около 300000 долларов США, а Coverity за эти деньги обеспечила для отобранных 250 свободных проектов бесплатный доступ к своему средству статического анализа исходного программного кода, Prevent.

Prevent, ранее известный как Stanford Checker, довольно хорошо отлавливает разные ошибки вроде переполнения буферов и обращения по неправильным указателям, средний показатель ошибок там, где их на самом деле нет, составляет около 14%, это довольно низкое значение. Samba Team имеет доступ к результатам прогона Prevent по разным веткам Samba, мы даже попали в "круг второй" -- проекты, хорошо реагирующие на найденные ошибки и получающие доступ к более продвинутым функциям Prevent (11 проектов). Coverity периодически (обычно раз-два в день) запускает Prevent и делает доступным протоколы запуска участникам проекта. Например, у нас сейчас показатель 0.018 ошибок на 1000 строк кода, то есть, приблизительно одна ошибка на 56 тысяч строк кода, если я не ошибся с расчетами.

Coverity подвела итоги проекта за последние два года в отчете "Scan Open Source" (PDF, документ этот требует бесплатной регистрации на сайте Coverity). Некоторые интересные факты из него:
  • за два года общее количество обнаруживаемых ошибок в проектах сократилось на 16%;
  • между размером проекта и количеством ошибок существует всего-лишь линейная зависимость, а не экспоненциальная, как считалось раньше;
  • усложнение функций не ведет к увеличению количества ошибок в них, несмотря на то, что так думают практически все программисты;
  • наибольшее число ошибок приходится на обращения по нулевому указателю (27.95%) и утечку памяти (25.73%), а наименьшее -- на переполнение динамически распределенных буферов (0.31%) и использование негативных смещений до тестирования (0.21%).


Интересно, что на текущий момент общая база проанализированного кода в Prevent составляет около двух миллиардов уникальных строк, из которых 250 миллионов уникальных строк кода доступно под свободными лицензиями. Coverity, правда, отказывается проводить какие-либо сравнения качества между проприетарным и свободным кодом, ссылаясь на "несравнимость" в тех условиях, которые у них есть. К тому же, аудитории программистов пересекаются, поскольку многие "днем" пишут проприетарный код, а "ночью" -- свободный. Так что судить производительность доктора Джекилла и мистера Хайда Coverity не решается.

  • 1
Мне всегда казалось, что утверждения об экспоненциальном росте количества ошибок с размером проекта и росте ошибок с ростом количества функций относятся к ошибкам в логика алгоритма. Которые Prevent-ом и прочими valgrind-ами нифига не ловятся.

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

Вообщем, как оказалось, длина функции не коррелирует с количеством ошибок такого рода в ней. Алгоритмическую корректность, увы, мало кто умеет проверять. :-)

Просто рад за проект SAMBA. Надеюсь при такой красоте кода вы скоро вытесните виндовые сервера окончательно:)

Жаль, увидел ваш пост только сегодня. Дополнил и опубликовал:
<http://doka.info/researches/world/opensource/20080526.1730>

Надо пользоваться языками со сборкой мусора - половина ошибок изчезает!

Вторая половина появляется в полный рост. :-) Это так, чтобы ответить. На самом деле, чудесных языков не бывает, бывают нечудесные программисты.

Чудесных не бывает. Но бывают близкие к ним :-).
Например Haskell отлавливает очень много ошибок. Правда не для всех задач подходит.
Для сетевых файловых систем я бы использовал OCaml. Соотношение производительность/надежность у него очень хорошее - C++ он заменить способен. Чудестность программистов часто определяется способностью выбрать/выучить подходящий язык :-).

Я совершенно не против. :-) Да и удается пока избегать всяких нехороших языков вроде C++. C меня устраивает -- я знаю как и что в нем нужно и можно делать.

  • 1