﻿# Как PVS\-Studio защищает от поспешных правок кода

Хотя только недавно была заметка про проект CovidSim, есть хороший повод вновь про него вспомнить и продемонстрировать пользу регулярного использования PVS\-Studio\. Бывает, что все мы спешим и вносим правки в код, потеряв сосредоточенность\. Статический анализатор может оказаться здесь хорошим помощником\.

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

Всё началось с написания вот этих двух небольших заметок про открытый проект COVID\-19 CovidSim Model:

* [Пример, как в PVS\-Studio появляются новые диагностики](https://pvs-studio.ru/ru/blog/posts/cpp/0814/);
* [Исследование COVID\-19 и неинициализированная переменная](https://pvs-studio.ru/ru/blog/posts/cpp/0796/)\.

После этого мы подумали и решили мониторить и этот проект с целью популяризации регулярного использования статических анализаторов кода\. Подробнее про эту затею мой коллега писал в этой [статье](https://pvs-studio.ru/ru/blog/posts/cpp/0799/)\.

Только мы начали проверять этот проект, как результаты не заставили себя ждать :\)\. Сейчас я покажу свежую ошибку, вызванную недавними неаккуратными правками кода\. Конечно, мы не станем описывать в дальнейшем каждый баг и недочёт, обнаруженный анализатором\. Будем писать только про что\-то интересное\.

Вот что получилось, после недавних [модификаций](https://github.com/mrc-ide/covid-sim/commit/db3f71372a0b0d39e97a17fb3681507bf9c09fba#diff-5700978f162548f093fdc93e4525f5fdc1c812c5db97fa1a3f3c55779ebe2d2c) файла CovidSim\.cpp:

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

Кто\-то решил создавать массивы не на стеке, а в куче\. Но был невнимателен, внося изменения\. Обратите внимание, что освобождение памяти находится после оператора _return_:

```cpp
int GetXMLNode(....)
{
  char* buf = new char[65536];
  char* CloseNode = new char[2048];
  char* CloseParent = new char[2048];
  ....
  if (ResetFilePos) fseek(dat, CurPos, 0);
  return ret;                                // <=
  delete[] buf;
  delete[] CloseNode;
  delete[] CloseParent;
}
```

В результате перед нами фрагмент недостижимого кода \(unreachable code\)\. И заодно утечка памяти\.

Хорошо, что PVS\-Studio тут же сообщает про эту ошибку: V779 Unreachable code detected\. It is possible that an error is present\. CovidSim\.cpp 675

Используйте статический анализ регулярно и сможете устранить множество ошибок на самом раннем этапе\! Согласитесь, лучше сразу исправить этот мелкий баг, чем гадать, почему вдруг программа начала потреблять слишком много оперативной памяти\.

И последнее, что хочется отметить\. Эта ошибка была бы невозможна, если не вручную управлять выделением и освобождением памяти, а применить [RAII](https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D0%B0_%D0%B5%D1%81%D1%82%D1%8C_%D0%B8%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F) подход и использовать умные указатели\.

Правильный и надёжный вариант кода:

```cpp
std::unique_ptr<char[]> buf(new char[65536]);
std::unique_ptr<char[]> CloseNode(new char[2048]);
std::unique_ptr<char[]> CloseParent(new char[2048]);
```

Спасибо за внимание\. Следуйте за мной в мир С\+\+ и багов :\)\. [Twitter](https://twitter.com/Code_Analysis)\.