Компания Coverity, развивающая инструментарий для автоматического анализа кода на предмет наличия проблем безопасности и ошибок представила очередной ежегодный отчёт (PDF, 550 Кб) с результатами изучения 37 млн строк кода в 45 наиболее активно разрабатываемых открытых проектов и 300 млн строк кода из 41 анонимного проприетарного продукта. В среднем, в открытых проектах было выявлено 0.45 дефектов на 1000 строк кода, для проприетарных продуктов данный показатель составляет 0.64, при этом средний показатель качества для всей индустрии разработки ПО составляет 1 ошибка на 1000 строк кода.
Система Coverity Scan была создана в 2006 году по инициативе Министерства национальной безопасности США для обеспечения и усиления безопасности информационной инфраструктуры Соединенных Штатов, в которой используются различные Open Source проекты. В настоящее время программа тестирования Coverity Scan охватывает около 300 открытых проектов, суммарный размер кода которых превышает 61 млн строк. При автоматическом анализе данного кода было выявлено 49654 дефектов из которых уже исправлено 15278. Для анализа кода в этом году была использована новая версия Coverity Scan в которой были представлены дополнительные средства статического анализа кода и добавлены алгоритмы выявления новых типов ошибок.
В представленном отчёте подробно проанализированы выявленные ошибки в ядре Linux 2.6, PHP 5.3 и PostgreSQL 9.1. Проекты были выбраны исходя из различий в их типе (системное и прикладное ПО) и размере кодовой базы. Уровень качества кода данных проектов оказался значительно выше средних показателей по индустрии:
- В ядре Linux, объём кода которого составляет 6.8 млн строк кода, было выявлено 4261 ошибок из которых 1249 признаны ошибками с высокой степенью опасности (451 - повреждение памяти, 418 - некорректный доступ к памяти, 139 - утечка ресурсов, 266 - неинициализированные переменные). Показатель качества кода ядра составил 0.62 дефекта на 1000 строк кода, что оказалось сравнимым с средним показателем качества рассмотренных проприетарных продуктов (0.64). Примечательно, что данное сходство показателей качества коррелирует с размером кодовой базы - средний размер участвующих в оценке проприетарных продуктов составил около 7 млн строк кода. Если рассматривать отдельные подсистемы, то в дереве Staging и сетевом стеке уровень качества составляет 0.97, в звуковой подсистеме 0.38, файловых системах 0.65, драйверах 0.61, других компонентах 0.48;
- В PHP 5.3, объём кода которого составляет 538 тыc. строк кода, выявлено 97 ошибок из которых 15 признаны опасными (5 - повреждение памяти, 3 - некорректный доступ к памяти, 7 - утечка ресурсов). Показатель качества кода интерпретатора PHP составил 0.20 дефекта на 1000 строк кода. Наилучшее качество отмечено в Zend - 0.09, уровень качества основного кода и стандартных расширений - 0.14, ext_date - 0.17, PDO - 0.30, расширении с SQLite - 0.61;
- В PotgreSQL, объём кода которого составляет 1.1 млн строк кода, выявлено 233 ошибок из которых 116 опасных (22 - повреждение памяти, 36 - некорректный доступ к памяти, 50 - утечка ресурсов, 8 - неинициализированные переменные). Показатель качества кода СУБД PostgreSQL составил 0.21 дефекта на 1000 строк кода;
Некоторые наблюдения:
- Открытые проекты достаточно активно реагируют на выявленные системой Coverity дефекты. Например, команда разработчиков BRL-CAD устранила более 1600 дефектов в течение 5 дней после того как авторы исследования уведомили разработчиков;
- В сумме в 2011 году было исправлено 6133 выявленных дефектов, что больше чем в 2010 году;
- Всего в рассмотренных 45 открытых проектах было отмечено 16884 проблем, распределение которых выглядит следующим образом:
- Проблемы с управлением потоком (Control Flow Issues) 3,128
- Разыменование NULL-указателя (Null Pointer Dereferences) 2,818
- Неинициализированные переменные (Uninitialized Variables) 2,051
- Повреждения памяти (Memory Corruptions) 1,551
- Проблемы с обработкой ошибок (Error Handling Issues) 1,535
- Утечка ресурсов (Resource Leaks) 1,384
- Проблемы с обработкой целочисленных значений (Integer Handling Issues) 1,368
- Некорректный доступ к памяти (Memory - Illegal Access) 1,136
- Небезопасная обработка данных (Insecure Data Handling) 824
- Некорректные выражения (Incorrect Expression) 550
- Проблемы с одновременным доступом (Concurrent Access Violations) 253
- Ошибки использования API (API Usage Errors) 178
- Зависания программ (Program Hangs) 107
- Несоответствия иерархии класса (Class Hierarchy Inconsistencies) 1