﻿# Один день из поддержки пользователей PVS\-Studio

Мы рады любым тематическим общениям на тему качества кода\. Нам пишут клиенты, студенты и любые другие пользователи со всех уголков интернета\. Независимо от страны, часового пояса или языка\. Языка разговорного, конечно\. Среди языков программирования нам всё же интересен ограниченный набор\. Сейчас это C, C\+\+, C\# и Java\. Выгоды от общений очень много\. Некоторые предложения пользователей мы реализуем сразу, т\.к\. они действительно полезные\. Часто мы просто выручаем чей\-то проект, объясняя предупреждения анализатора, которые в итоге оказываются ошибкой\. Эта заметка об одном таком случае\.

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

## Об анализаторе

[PVS\-Studio](https://pvs-studio.ru/ru/pvs-studio/download/) \- это инструмент для выявления ошибок и потенциальных уязвимостей в исходном коде программ, написанных на языках С, C\+\+, C\# и Java\. Работает в среде Windows, Linux и macOS\.

Для связи существует 3 формы обратной связи:

1. [Обратная связь](https://pvs-studio.ru/ru/about-feedback/)
1. [Запрос триала](https://pvs-studio.ru/ru/pvs-studio/download/)
1. [Запрос цен](https://pvs-studio.ru/ru/order/)

## Вечер четверга

Один активный пользователь, который попробовал анализатор на своём коде, активно начал присылать ложные предупреждения\. Прежде чем я успел ответить, накопилось 3 письма\. Это был конец рабочего дня и сил уже оставалось мало \(к вопросу о надёжности ручного ревью кода\)\. Наша команда активно готовилась к большому релизу, до которого оставалось несколько дней\.

Я решил отложить ответ на пятницу или даже на следующую неделю:

_Здравствуйте, Константин\._

_Разбираем предупреждения\. На следующей неделе прокомментирую подозрительные места :\-\)_

Это заметка о том, что статический анализ кода очень эффективен, и ручной обзор кода будет уступать автоматической проверке во многих случаях, особенно в конце рабочего дня\.

С разрешения пользователя расскажу о состоявшейся переписке:

**Письмо 1**

_Ложно\-позитивные срабатывания V712:_

```cpp
uint32_t StartUpCounter = 0, HSEStatus = 0;
RCC->CR |= ((uint32_t)RCC_CR_HSEON);
/* Wait till HSE is ready and if Time out is reached exit */
{
  HSEStatus = RCC->CR & RCC_CR_HSERDY;
  StartUpCounter++;
} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); // V712...
```

**Письмо 2**

_Там же ложное срабатывание V715:_

```cpp
{ // V715 ... lpmode.cpp 356
  HSEStatus = RCC->CR & RCC_CR_HSERDY;
  StartUpCounter++;
} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
```

**Письмо 3**

_Ёлки\-палки, заколдованное место\! Всё там же, ругается \(см\. код от предыдущих писем\):_

_V560 A part of conditional expression is always true: \(StartUpCounter \!\= \(\(uint16\_t\) 0x5000\)\)\. lpmode\.cpp 356_

_V776 Potentially infinite loop\. The variable in the loop exit condition 'HSEStatus \=\= 0' does not change its value between iterations\. lpmode\.cpp 356_

_Может я чего\-то не понимаю? Но на практике всё работает, и если кварц не запускается, то мы выходим из этого участка по тайм\-ауту ;\-\)_

**Письмо 4 \(ответ\)**

_Здравствуйте, Константин\._

_Разбираем предупреждения\. На следующей неделе прокомментирую подозрительные места :\-\)_

**Письмо 5**

_Чёрт\! Я только после вашего письма код увидел боковым зрением \- оператор do пропущен\.\.\. Всё встало на свои места\! Совсем глаз замылился %\)_

_**do** \{\.\.\.\} while \(\.\.\.\);_

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

Как вы могли заметить, было 4 предупреждения анализатора на одно и то же место, но всё равно понадобилось время, чтобы убедить пользователя в наличии ошибки\. В такой ситуации у ручного ревью даже шансов не было бы\.

Похожая история со счастливым концом: "[Как PVS\-Studio оказался внимательнее, чем три с половиной программиста](https://pvs-studio.ru/ru/blog/posts/cpp/0587/)"\.

Используйте статические анализаторы в своём проекте\. Они не являются заменой ревью кода с коллегой, а являются полезным дополнением к контролю качества кода\.