>
>
>
Уточнения о проверке проектов CPython и…

Павел Беликов
Статей: 10

Уточнения о проверке проектов CPython и Ruby

В одной из недавних статей мы сравнивали классические реализации языков 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.