Coverity, компания, специализирующаяся на системах анализа исходных текстов, опубликовала отчет о проверке более чем 250 открытых проектов. Общий объем проанализированного кода составил 55 миллионов строк. В отчете представлена суммарная статистика частых ошибок, детализация доступна для разработчиков каждого из проектов, принимающих участие в тестировании.
В общем, качество кода заметно улучшилось, по сравнении с прошлогодним отчетом число ошибок уменьшилось на 16%. Проекты самым малым количеством ошибок ("чистым кодом"): Amanda, NTP, OpenPAM, OpenVPN, Perl, PHP, Python и Samba.
Отдельно отмечается тенденция повышения интереса к open source продуктам со стороны разработчиков коммерческого ПО, по прогнозу консалтинговой компании Gartner, к 2012 году ожидается, что 80% всего коммерческого ПО будет содержать элементы open-source технологий.
Самая "популярная", часто встречающаяся ошибка - разыменование нулевого указателя. На втором месте - утечка ресурса, по мнению Coverity, такие ошибки связаны с неправильным использованием связанных указателей и неправильным использованием API. Из других интересных выводов можно отметить линейный рост зависимости числа ошибок от размера проекта, а не экспоненциальная, как считалось раньше. Увеличение сложности функций не отражается на числе ошибок.
Итоговая таблица выглядит так:
Тип ошибок
| Количество ошибок
| Процент
|
Разыменование пустого указателя
(NULL Pointer Dereference)
| 6448
| 27.95%
|
Утечка ресурса
(Resource Leak)
| 5852
| 25.73%
|
Неумышленно Игнорируемые Выражения
(Unintentional Ignored Expressions)
| 2252
| 9.76%
|
Использование до проверки на пустой указатель
(Use Before Test (NULL))
| 1867
| 8.09%
|
Выход за пределы статического буфера
(Buffer Overrun (statically allocated))
| 1417
| 6.14%
|
Использование памяти после ее высвобождения
(Use After Free)
| 1491
| 6.46%
|
Опасное использование возвращенного пустого указателя.
(Unsafe use of Returned NULL)
| 1349
| 5.85%
|
Чтение неинициализированного значения.
(Uninitialized Values Read)
| 1268
| 5.50%
|
Небезопасное использование возвращенного отрицательного
значения.
(Unsafe use of Returned Negative)
| 859
| 3.72%
|
Несоответствие типа и выделенного размера под этот тип.
(Type and Allocation Size Mismatch)
| 144
| 0.62%
|
Выход за границы динамически выделенного буфера
Buffer Overrun (dynamically allocated)
| 72
| 0.31%
|
Использование до проверки на отрицательное значение.
Use Before Test (negative)
| 49
| 0.21%
|
|