Открытые проекты опередили проприетарные продукты по уровню качества кода

Компания Coverity, развивающая инструментарий для автоматического анализа кода на предмет наличия проблем безопасности и ошибок, опубликовала отчёт (PDF, 390 Kб) с результатами изучения 936 млн строк кода на C/C++, охватывающих 740 наиболее активно разрабатываемых открытых проектов (252 млн строк кода) и 493 проприетарных продуктов (684 млн строк кода). Впервые за многолетнюю практику проведения аналогичных исследований, по уровню качества открытое ПО заметно опередило проприетарное — средний уровень дефектов в открытом коде составил 0.59 ошибок на 1000 строк кода, в то время как в проприетарном ПО данный показатель составил 0.72 (в прошлом году соотношение было 0.69 против 0.68).

Если рассматривать корреляцию уровня качества в зависимости от размера проектов, то наибольший уровень ошибок наблюдается в проектах размером от 500 тысяч до 1 млн строк — 0.70 ошибок на 1000 строк для открытого кода и 0.84 для проприетарного. Для проектов размером более 1 млн строк кода уровень качества составляет 0.65 для открытого кода и 0.71 для проприетарного, от 100 до 500 тысяч — 0.50 и 0.81, до 100 тысяч строк — 0.35 и 0.38. При этом, следует иметь в виду, что требования промышленных стандартов качества допускают наличие 1 ошибки на 1000 строк кода.

37% всех выявленных проблем относятся к категории ошибок высокой степени опасности. Распределение типов проблем выглядит следующим образом:

Утечка ресурсов (Resource Leaks) 9,503 Разыменование NULL-указателя (Null Pointer Dereferences) 6,573 Проблемы с порядком вычислений (Control Flow Issues) 5,175 Проблемы с обработкой ошибок (Error Handling Issues) 4,500 Неинициализированные переменные (Uninitialized Variables) 3,398 Некорректный доступ к памяти (Memory — Illegal Access) 2,591 Повреждения памяти (Memory Corruptions) 2,555 Проблемы с обработкой целочисленных значений (Integer Handling Issues) 2,448 Неинициализированные переменные (Uninitialized variables) 1,997 Некорректные выражения (Incorrect Expression) 1,912 Проблемы с сопровождением кода (Code maintainability issues) 982 Игнорирование рекомендаций по безопасному программированию (Security best practices violations) 759 Небезопасная обработка данных (Insecure Data Handling) 705 Ошибки использования API (API Usage Errors) 619 Зависания программ (Program Hangs) 324 Проблемы с одновременным доступом (Concurrent Access Violations) 164 Проблемы с производительностью (Performance inefficiencies) 153 Предупреждения при парсинге (Parse warnings) 260 Несоответствия иерархии класса (Class Hierarchy Inconsistencies) 17 При рассмотрении тенденций в изменении качества кода ядра Linux в 2013 году отмечается сокращение среднего времени на устранения выявленных ошибок со 122 до 6 дней. Уровень дефектов в ядре составляет 0.61 ошибок на 1000 строк кода, при том, что этот показатель впервые спустился ниже 1 в 2008 году, а в прошлом году составлял 0.66. Из других интересных выводов упоминается то, что разработчики на C/C++ устраняют важные ошибки более активно, чем разработчики на Java. Если для проектов на C/C++ устранено 46% выявленных утечек ресурсов, то для Java-проектов было исправлено всего 13% таких проблем. Подобное поведение объясняется излишним доверием Java-разработчиков к предоставляемым языком средствам защиты, таким как сборщик мусора.

Система Coverity Scan была создана в 2006 году по инициативе Министерства национальной безопасности США для обеспечения и усиления безопасности информационной инфраструктуры Соединённых Штатов, в которой используются различные Open Source проекты. В настоящее время программа тестирования Coverity Scan охватывает около 1700 открытых проектов. С марта прошлого года в число проверяемых проектов включены разработки на языке Java, в том числе были проверены проекты Apache Hadoop, HBase и Cassandra. При автоматическом анализе кода открытых проектов с 2006 год выявлено более 94 тысяч дефектов, при этом в 2013 году авторами проектов было исправлено 50 тысяч проблем. Более 11 тысяч исправлений приходятся на 4 крупнейших проекта — NetBSD, FreeBSD, LibreOffice и ядро Linux.

©  OpenNet