В одной из недавних статей мы сравнивали классические реализации языков Python и Ruby по плотности ошибок. При этом ошибку допустили в самой статье: в список ошибок CPython попали ошибки из сторонних библиотек. Поэтому перепроверим проекты и посчитаем заново всю статистику.
Часть ошибок (фрагменты N2, N4, N5, N6), найденных в предыдущей статье относятся к OpenSSL. Стоит отметить, что эти ошибки так или иначе оказывают влияние и на проекты, использующие эту библиотеку, включая CPython. Однако причислять их к ошибкам самого проекта будет неправильно. Естественно в PVS-Studio есть функционал для игнорирования такого рода срабатываний: можно просто добавить каталог с вашими externals или 3rd_party в список игнорируемых и больше при проверке своего проекта срабатываний оттуда вы не увидите.
На этот раз для проверки CPython и Ruby воспользуемся разрабатываемой сейчас Linux версией. Работает она очень просто: просто запускаем сборку из PVS-Studio и ждём её окончания. PVS-Studio отслеживает все запуски компилятора, поэтому не зависит от способа сборки проекта. На выходе получаем лог.
В этот раз каких-то новых ошибок, достаточно интересных для описания в статье я не нашёл. Есть ошибки, связанные с некорректной обработкой аварийных ситуаций. Они часто встречаются даже в хорошо протестированных проектах, потому что на такие ситуации тесты пишут реже. Вот такой пример можно найти в CPython:
int
_PyState_AddModule(PyObject* module, struct PyModuleDef* def)
{
PyInterpreterState *state;
if (def->m_slots) {
....
return -1;
}
state = GET_INTERP_STATE();
if (!def)
return -1;
....
}
Предупреждение PVS-Studio: V595 The 'def' pointer was utilized before it was verified against nullptr. Check lines: 286, 292. pystate.c 286
Есть просто не очень хорошо оформленный код. Есть условные выражения, которые выглядят странно после раскрытия макросов: например, одно и то же условие может проверяться несколько раз. Но в целом, всё хорошо.
Что касается новой статистике, то вот она:
Картина очень похожа на ту, что мы видели раньше, за исключением того, что пропали ошибки из сторонних библиотек и целый класс ошибок, относящийся к Windows-only коду.
Ошибок в проектах удалось найти немного. Но это и неудивительно: обо всём самом подозрительном было написано совсем недавно. Но статический анализ нужно использовать не только для контроля качества, но и при непосредственном написании кода: на этой стадии находить ошибки проще и дешевле.
Предлагаю всем желающим попробовать PVS-Studio и записаться на бета-версию для Linux.