Хабрахабр

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

Picture 1

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

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

PVS-Studio — это инструмент для выявления ошибок и потенциальных уязвимостей в исходном коде программ, написанных на языках С, C++, C# и Java. Работает в среде Windows, Linux и macOS.

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

  1. Обратная связь
  2. Запрос триала
  3. Запрос цен

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

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

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

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

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

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

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

Письмо 1

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

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:

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

Письмо 3

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

lpmode.cpp 356 V560 A part of conditional expression is always true: (StartUpCounter != ((uint16_t) 0x5000)).

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

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

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

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

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

Письмо 5

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

do while (...);

Заключение

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

Похожая история со счастливым концом: "Как PVS-Studio оказался внимательнее, чем три с половиной программиста".

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

One Day from PVS-Studio User Support. Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Svyatoslav Razmyslov.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть