Для получения триального ключа
заполните форму ниже
Team License (базовая версия)
Enterprise License (расширенная версия)
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Запросите информацию о ценах
Новая лицензия
Продление лицензии
--Выберите валюту--
USD
EUR
GBP
RUB
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Бесплатная лицензия PVS-Studio для специалистов Microsoft MVP
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Для получения лицензии для вашего открытого
проекта заполните, пожалуйста, эту форму
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Мне интересно попробовать плагин на:
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Ваше сообщение отправлено.

Мы ответим вам на


Если вы так и не получили ответ, пожалуйста, проверьте папку
Spam/Junk и нажмите на письме кнопку "Не спам".
Так Вы не пропустите ответы от нашей команды.

>
>
PVS-Studio для Visual C++ (устаревшая с…

PVS-Studio для Visual C++ (устаревшая статья)

29 Окт 2013

Очень давно все наши статьи стали посвящаться чему угодно, но только не самому инструменту PVS-Studio. Мы рассказываем о проверенных проектах, о тонкостях языка Си++, о создании плагинов на C#, о запуске PVS-Studio из командной строки. А ведь в первую очередь PVS-Studio ориентирован на разработчиков, использующих Visual Studio. Мы очень много сделали, чтобы им было удобно пользоваться нашим инструментом. Но как раз это часто оказывается за кадром. Решил исправить эту ситуацию и рассказать с чистого листа о плагине PVS-Studio. Если вы используете Visual C++, эта статья для вас.

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

0222_PVS-Studio-VC_ru/image1.png

Что такое статический анализ кода и зачем он нужен

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

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

Существует большое количество коммерческих и бесплатных статических анализаторов кода. Большой список статических анализаторов имеется на сайте Wikipedia: List of tools for static code analysis. Список языков, для которых существуют статические анализаторы кода, также достаточно велик (Си, Си++, C#, Java, Ada, Fortran, Perl, Ruby, ...). Естественно, мы будем рассказывать вам об анализаторе PVS-Studio.

Главное преимущество статического анализа состоит в возможности существенного снижения стоимости устранения дефектов в программе. Чем раньше ошибка выявлена, тем меньше стоимость ее исправления. Так согласно данным, приведенным в книге Макконнелла "Совершенный Код", исправление ошибки на этапе тестирования обойдется в десять раз дороже, чем на этапе конструирования (написания кода):

0222_PVS-Studio-VC_ru/image2.png

Рисунок 1. Средняя стоимость исправления дефектов в зависимости от времени их внесения и обнаружения (данные для таблицы взяты из книги С. Макконнелла "Совершенный Код"). Нажмите на рисунок для его увеличения.

Инструменты статического анализа позволяют выявить большое количество ошибок этапа конструирования, что существенно снижает стоимость разработки всего проекта. Например, статический анализатор кода PVS-Studio может запускаться в фоновом режиме сразу после компиляции и, в случае нахождения потенциальной ошибки, уведомит программиста. Подробнее об этом режиме будет рассказано ниже.

Подробнее тематика обзора кода и статического анализа раскрыта в статьях, ссылки на которые приводятся в конце статьи [1, 2, 3].

Статический анализатор кода PVS-Studio

PVS-Studio - статический анализатор, выявляющий ошибки в исходном коде приложений на языке C, C++, C++11, C++/CX. В первую очередь он ориентирован на пользователей Visual Studio (о поддержке других сред, смотрите страницу продукта). Анализатор великолепно интегрируется в VS2005 - VS2012. Скоро мы добавим и поддержку VS2013. В результате пользователи получают дополнительный пункт "PVS-Studio" в главном меню и окно для работы с диагностическими сообщениями (см. рисунок 2).

0222_PVS-Studio-VC_ru/image4.png

Рисунок 2. Основные элементы, добавляемые анализатором PVS-Studio при интеграции в Visual Studio. Нажмите на рисунок для его увеличения.

Начальные настройки

Анализатор готов к работе сразу после установки. В большинстве случаев вам не потребуется ничего настраивать, чтобы осуществить первый запуск. Единственная настройка, которая может понадобиться вам в начале, это исключение сторонних библиотек. Вы все равно не будете ничего править в исходных файлах библиотеки jpeg. Поэтому незачем её проверять. Вдобавок, исключение папок из анализа сократит время анализа. Исключаемые из анализа директории задаются здесь: Options->Dont't Check Files->PathMasks (см. рисунок 3).

0222_PVS-Studio-VC_ru/image6.png

Рисунок 3. Редактирование списка директорий, которые анализатор не будет проверять. Нажмите на рисунок для его увеличения.

Если в полном пути файла есть одно из указанных имён, то анализ выполняться не будет. По умолчанию, в список уже включены имена некоторых директорий. Однако, в вашем проекте папка с библиотекой ZLib может называться не "zlib", а, например, "zip_lib". Поэтому, следует отредактировать этот список. Для начала редактирования следует нажать кнопку с тремя точками.

Примеры допустимых масок для списка PathMasks:

  • c:\Libs\ — будут исключены все файлы проекта, расположенные в данной папке и её подпапках.
  • \Libs\ или *\Libs\* — будут исключены все файлы, расположенные в директориях, путь до которых содержит подпапку "Libs". Если символы "*" не указаны, они все равно будет автоматически добавлены, поэтому оба варианта записи одинаковы.
  • Libs или *Libs* — исключены будут все файлы, путь до которых содержит подпапку, имеющую 'Libs' в качестве имени либо фрагмента имени. Также в этом случае будут исключены файлы, содержащие Libs в имени, например, c:\project\mylibs.cpp. Для избегания путаницы, рекомендуем всегда использовать слеши.

Помимо исключений целых папок, можно задавать маски для исключения отдельных файлов. Для этого существует настройка FileNameMasks. Подробнее, как работать со списками исключения можно познакомиться в документации: Settings: Don't Check Files.

Проверка проекта

По завершению первичных настроек, вы можете приступить к проверке проекта. Скорее всего, можно сразу попробовать проверить решение целиком. Для этого выберите пункт меню PVS-Studio->Check->Solution (см. рисунок 4).

0222_PVS-Studio-VC_ru/image8.png

Рисунок 4. Проверка решения (Solution) с помощью анализатора PVS-Studio.

Если с проверкой возникнут какие-то трудности, мы рекомендуем обратиться к разделу "Не удается проверить?" на нашем сайте. Это не бестолковые рекомендации в духе "проверьте, что вилка вставлена в розетку". В разделе описаны типовые ситуации, с которыми к нам обращались пользователи и предложены варианты действий.

Работа со списком диагностических сообщений

После проверки все диагностические сообщения будут отображены в специальном окне. Окно имеет много элементов для управления. Все они служат для того, чтобы показать именно те диагностические сообщения, которые интересны пользователю. Однако, в первый момент окно может показаться сложным. Давайте рассмотрим все управляющие элементы (см. рисунок 5).

0222_PVS-Studio-VC_ru/image9.png

Рисунок 5. Окно с диагностическими сообщениями. Нажмите на рисунок для его увеличения.

  • Собственно окно PVS-Studio.
  • Кнопка включает сообщения "что-то пошло не так". Например, не удается препроцессировать один из файлов.
  • Кнопки, включающие предупреждения разных уровней. Сейчас включены все три уровня диагностик. При этом в окне показывается 132 предупреждения первого уровня, 235 предупреждений второго уровня и 390 предупреждений третьего уровня. Уровень сообщения показывается в одной из колонок в виде треугольника с цифрой.
  • Активные наборы диагностических правил. GA - диагностики общего плана, OP - микрооптимизации, 64 - 64-битные диагностики, MP - ошибки связанные с OpenMP, CS - пользовательские диагностики. Сейчас в окне отображаются предупреждения, относящиеся в GA и MP.
  • Включить/выключить показ сообщений, помеченных как ложные. Сейчас включен показ ложных предупреждений. Подробнее про эту функциональную возможность можно прочитать в документации: Подавление ложных предупреждений.
  • Поиск среди диагностических сообщений.
  • Быстрые фильтры. Можно, например, оставить в списке только сообщения с кодом V501 и, находящиеся в проекте XYZ.
  • Переход к предыдущему/следующему сообщению. При этом открывается соответствующий файл, и курсор ставится на строку с потенциальной ошибкой. Также, всегда можно выбрать диагностику из списка с помощью двойного щелчка мышью.
  • Открыть окно настроек.

Таблица с диагностическими сообщениями разбита на следующие колонки:

  • Звездочка. У неё нет конкретного назначения. Пользователь может интерпретировать её по своему усмотрению. Например, он может отметить наиболее интересные предупреждения для дальнейшего внимательного анализа. Аналогия - отметка звездочками писем в почтовой программе типа Thunderbird или Outlook.
  • Уровень. Уровень, к которому относится предупреждение. 1-й уровень - наиболее подозрительные места. 3-й уровень - скорее всего ложное срабатывание или несущественная неточность в коде.
  • ID. Уникальный номер сообщения. Может пригодиться при работе с большим списком. Например, можно перейти к сообщению с определенным номером (см. пункт "Navigate to ID..." в контекстном меню).
  • Code. Код сообщения. Если щелкнуть на нем мышкой, то откроется страница с описанием предупреждения.
  • Message. Текст диагностического сообщения.
  • Project. Имя проекта (можно отключить эту колонку, используя контекстное меню).
  • File. Имя файла.
  • Line. Номер линии. Важно! Обратите внимание, что после некоторых строк, строит многоточие. Пример: "123 (...)". Кликнув на это число, вы получите список всех строк кода, которые относятся к этому сообщению. При этом, есть возможность перейти к каждой из строк в списке.
  • Отметка "False Alarm". Отметка, что предупреждение является ложным. Учтите, что ложные предупреждения присутствуют в коде, только если нажата кнопка N 5 (см. рисунок 5).

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

Контекстное меню

Итак, по двойному клику мышки на сообщении вы переходите к нужному фрагменту текста. По нажатию правой кнопки мышки открывается контекстное меню.

Меню достаточно просто, и не стоит перегружать статью описанием каждого из пунктов. Если что-то непонятно, можно подсмотреть в документации:

Однако, хочу остановиться на одной очень полезной фиче.

Помните, что в настройках можно добавить папки/файлы для исключения (см. рисунок 2). Так вот, добавлять что-то намного проще, чем кажется!

Обратите внимание на пункт "Don't check files and hide all messages from...". При нажатии на него выпадает список путей, которые можно добавить в исключение (см. рисунок 6).

0222_PVS-Studio-VC_ru/image11.png

Рисунок 6. Исключение файлов из проверки. Нажмите на рисунок для его увеличения.

Можно выбрать, как отдельный файл, так и одну из директорий. На рисунке показано, что выбирается папка "E:\[Build]\VirualDub\src\test". Это значит, что все файлы в этой папке и всех подпапках будут исключены из анализа. Более того, все сообщения, относящиеся к этим файлам, сразу исчезнут из списка. Очень удобно. Не нужно перезапускать анализ, чтобы убрать все сообщения, относящиеся к тестам (папке "test").

Режим инкрементального анализа

Введение в PVS-Studio будет неполным, если не рассказать об одной из важнейших возможностей - инкрементальном анализе кода.

Чем раньше ошибка найдена, тем дешевле её устранение. Идеально сразу подчеркивать ошибки в редактируемом тексте программы. Однако, это технически сложно и ресурсоемко. Поэтому PVS-Studio запускается в фоновом режиме в тот момент, когда исправленный код успешно скомпилирован. Таким образом, ищутся ошибки в только что измененном коде. О том, что происходит анализ, можно судить по иконке в системном трее.

Когда ошибка найдена, появляется всплывающее окошко, предупреждающее об опасности (см. рисунок 7).

0222_PVS-Studio-VC_ru/image13.png

Рисунок 7. Всплывающее сообщение, что найдены подозрительные места в отредактированных файлах.

Если кликнуть мышкой на это всплывающее сообщение, то откроется окно PVS-Studio (см. рисунок 2), и можно будет изучить подозрительный фрагменты кода.

На самом деле, чем описывать этот режим, проще попробовать поработать с ним. Вы пишите код, как и раньше. А если надо, анализатор потревожит вас. Попробуйте!

Мы сами постоянно используем этот режим. Да, мы тоже иногда допускаем ошибки при кодировании. И возможность их сразу исправить существенно сокращает время на обнаружение дефекта и попытку понять, отчего программа ведёт себя не так, как планировалось. Очень обидно потратить минут 15-20 на отладку, чтобы потом обнаружить опечатку в индексе. Вот один из последних случаев, когда PVS-Studio нашел ошибку в PVS-Studio сразу после того, как она появилась в коде:

if (in[0] == '\\' && in[1] == '.' && in[1] == '\\')
{
  in += 2;
  continue;
}

Но это, конечно, цветочки. Анализатор PVS-Studio иногда может оказаться намного полезнее. Вот один из отзывов о нашем анализаторе: "Пример использования статического анализатора". Текст заставляет задуматься.

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

Возможности PVS-Studio

Будем кратки. Невозможно лаконично описать все диагностики, которые имеются в PVS-Studio. Полный список диагностик и их подробное описание можно найти в документации: Описание диагностируемых ошибок. Ограничимся таблицей, в которой диагностики сгруппированы по типам. Некоторые диагностики входят более, чем в одну группу. Дело в том, что деление весьма условно. Например, опечатка может приводить к использованию неинициализированной памяти. Некоторым ошибкам наоборот места в таблице не нашлось, слишком они специфические. Тем не менее, таблица в целом дает представление о функциональности статического анализатора кода (см. рисунок 8).

0222_PVS-Studio-VC_ru/image14.png

Рисунок 8. Возможности PVS-Studio. Нажмите на рисунок для его увеличения.

Как видите, анализатор максимально проявляет себя в таких областях, как поиск ошибок, возникших из-за опечаток, Copy-Paste. Хорошо диагностирует проблемы, которые связаны с безопасностью кода.

Как всё это работает на практике, можно узнать, заглянув в базу ошибок. Мы собираем в эту базу все ошибки, которые нашли, проверяя различные Open-Source проекты.

Заключение

Конечно, здесь мы рассказали не всё об инструменте. Если рассказывать всё, то статья превратится в документацию. Цель была показать, как легко можно работать с инструментом в рамках среды Visual Studio. Про другие среды и режимы работы можно почитать в документации и других статьях, расположенных на нашем сайте. Там, кстати, много интересного для программистов. Заходите побродить.

Желаю вам безбажного кода и надеюсь, что вам понравится PVS-Studio. Если возникнут какие-то вопросы, то мы всегда поможем и подскажем. Пишите нам.

Дополнительные ресурсы:

Популярные статьи по теме
Главный вопрос программирования, рефакторинга и всего такого

Дата: 14 Апр 2016

Автор: Андрей Карпов

Вы угадали, ответ - "42". Здесь приводится 42 рекомендации по программированию, которые помогут избежать множества ошибок, сэкономить время и нервы. Автором рекомендаций выступает Андрей Карпов - тех…
Технологии, используемые в анализаторе кода PVS-Studio для поиска ошибок и потенциальных уязвимостей

Дата: 21 Ноя 2018

Автор: Андрей Карпов

Краткое описание технологий, используемых в инструменте PVS-Studio, которые позволяют эффективно обнаруживать большое количество паттернов ошибок и потенциальных уязвимостей. Статья описывает реализа…
PVS-Studio для Java

Дата: 17 Янв 2019

Автор: Андрей Карпов

В седьмой версии статического анализатора PVS-Studio мы добавили поддержку языка Java. Пришло время немного рассказать, как мы начинали делать поддержку языка Java, что у нас получилось и какие дальн…
Любите статический анализ кода!

Дата: 16 Окт 2017

Автор: Андрей Карпов

Я в шоке от возможностей статического анализа кода, хотя сам участвую в разработке инструмента PVS-Studio. На днях я был искренне удивлён тому, что анализатор оказался умнее и внимательнее меня.
Как и почему статические анализаторы борются с ложными срабатываниями

Дата: 20 Мар 2017

Автор: Андрей Карпов

В своей предыдущей статье я писал, что мне не нравится подход, при котором статические анализаторы кода оцениваются с помощью синтетических тестов. В статье приводился пример, воспринимаемый анализат…
Бесплатный PVS-Studio для тех, кто развивает открытые проекты

Дата: 22 Дек 2018

Автор: Андрей Карпов

В канун празднования нового 2019 года команда PVS-Studio решила сделать приятный подарок всем контрибьюторам open-source проектов, хостящихся на GitHub, GitLab или Bitbucket. Им предоставляется возмо…
Характеристики анализатора PVS-Studio на примере EFL Core Libraries, 10-15% ложных срабатываний

Дата: 31 Июл 2017

Автор: Андрей Карпов

После большой статьи про проверку операционной системы Tizen мне было задано много вопросов о проценте ложных срабатываний и о плотности ошибок (сколько ошибок PVS-Studio выявляет на 1000 строк кода)…
Статический анализ как часть процесса разработки Unreal Engine

Дата: 27 Июн 2017

Автор: Андрей Карпов

Проект Unreal Engine развивается - добавляется новый код и изменятся уже написанный. Неизбежное следствие развития проекта - появление в коде новых ошибок, которые желательно выявлять как можно раньш…
PVS-Studio ROI

Дата: 30 Янв 2019

Автор: Андрей Карпов

Время от времени нам задают вопрос, какую пользу в денежном эквиваленте получит компания от использования анализатора PVS-Studio. Мы решили оформить ответ в виде статьи и привести таблицы, которые по…
Зло живёт в функциях сравнения

Дата: 19 Май 2017

Автор: Андрей Карпов

Возможно, читатели помнят мою статью под названием "Эффект последней строки". В ней идёт речь о замеченной мной закономерности: ошибка чаще всего допускается в последней строке однотипных блоков текс…

Комментарии (0)

Следующие комментарии
Этот сайт использует куки и другие технологии, чтобы предоставить вам более персонализированный опыт. Продолжая просмотр страниц нашего веб-сайта, вы принимаете условия использования этих файлов. Если вы не хотите, чтобы ваши данные обрабатывались, пожалуйста, покиньте данный сайт. Подробнее →
Принять