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

В одной из недавних статей мы сравнивали классические реализации языков Python и Ruby по плотности ошибок\. При этом ошибку допустили в самой статье: в список ошибок CPython попали ошибки из сторонних библиотек\. Поэтому перепроверим проекты и посчитаем заново всю статистику\.

![0418_RubyCPythonDisclaimer_ru/image1.png](https://import.viva64.com/docx/blog/0418_RubyCPythonDisclaimer_ru/image1.png)

## В предыдущей серии

![0418_RubyCPythonDisclaimer_ru/image2.png](https://import.viva64.com/docx/blog/0418_RubyCPythonDisclaimer_ru/image2.png)

Часть ошибок \(фрагменты N2, N4, N5, N6\), найденных в [предыдущей статье](https://pvs-studio.ru/ru/blog/posts/cpp/0414/) относятся к OpenSSL\. Стоит отметить, что эти ошибки так или иначе оказывают влияние и на проекты, использующие эту библиотеку, включая CPython\. Однако причислять их к ошибкам самого проекта будет неправильно\. Естественно в PVS\-Studio есть функционал для игнорирования такого рода срабатываний: можно просто добавить каталог с вашими externals или 3rd\_party в список игнорируемых и больше при проверке своего проекта срабатываний оттуда вы не увидите\.

## О новой проверке

На этот раз для проверки CPython и Ruby воспользуемся разрабатываемой сейчас [Linux версией](https://pvs-studio.ru/ru/blog/posts/0415/)\. Работает она очень просто: просто запускаем сборку из PVS\-Studio и ждём её окончания\. PVS\-Studio отслеживает все запуски компилятора, поэтому не зависит от способа сборки проекта\. На выходе получаем лог\.

## Плотность ошибок

В этот раз каких\-то новых ошибок, достаточно интересных для описания в статье я не нашёл\. Есть ошибки, связанные с некорректной обработкой аварийных ситуаций\. Они часто встречаются даже в хорошо протестированных проектах, потому что на такие ситуации тесты пишут реже\. Вот такой пример можно найти в CPython:

```cpp
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

Есть просто не очень хорошо оформленный код\. Есть условные выражения, которые выглядят странно после раскрытия макросов: например, одно и то же условие может проверяться несколько раз\. Но в целом, всё хорошо\.

Что касается новой статистике, то вот она:

![0418_RubyCPythonDisclaimer_ru/image3.png](https://import.viva64.com/docx/blog/0418_RubyCPythonDisclaimer_ru/image3.png)

Картина очень похожа на ту, что мы видели раньше, за исключением того, что пропали ошибки из сторонних библиотек и целый класс ошибок, относящийся к Windows\-only коду\.

![0418_RubyCPythonDisclaimer_ru/image4.png](https://import.viva64.com/docx/blog/0418_RubyCPythonDisclaimer_ru/image4.png)

## Заключение

Ошибок в проектах удалось найти немного\. Но это и неудивительно: обо всём самом подозрительном было написано совсем недавно\. Но статический анализ нужно использовать не только для контроля качества, но и при непосредственном написании кода: на этой стадии находить ошибки проще и дешевле\.

Предлагаю всем желающим попробовать [PVS\-Studio](https://pvs-studio.ru/ru/pvs-studio/) и записаться на [бета\-версию для Linux](https://pvs-studio.ru/ru/blog/posts/0415/)\.