![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Thunderbolt |
|
||||||||||||
![]() DevRel ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 7.11.2007 Где: Тула Репутация: 10 Всего: 16 |
Евгений Рыжков
ООО "Системы программной верификации" Июль 2009 Аннотация Введение Назначение, возможности и системные требования PVS-Studio Установка PVS-Studio Знакомство с PVS-Studio Исправление ошибок Работа со списком диагностических сообщений Надо ли добиваться исправления всех потенциальных ошибок, на которые указывает анализатор? Библиографический список Аннотация Статья представляет собой учебное пособие (tutorial) по работе с анализатором кода PVS-Studio. Из нее вы узнаете об основных возможностях PVS-Studio, принципах работы с инструментом, а также об особенностях анализа кода некоторых типов приложений. Введение PVS-Studio- это статический анализатор кода, предназначенный для разработчиков современных ресурсоемких приложений на языках Си и Си++. Под современными мы понимаем 64-битные и/или параллельные приложения. Разработка таких программ имеет ряд трудностей, отличных от проблем традиционных программ. Ведь помимо обычных и всем известных ошибок вроде неинициализированных указателей, доступа за границы массива и прочих дефектов кода, которые обнаруживаются любым компилятором, есть и новые типы проблем. ![]() Рисунок 1 - Логотип анализатора кода PVS-Studio Речь идет об ошибках в программах, которые проявляются при миграции 32-битных приложений на 64-битные платформы. Или при распараллеливании кода для поддержки многопроцессорности или многоядерности. Разрабатывать такие приложения довольно сложно из-за недостатка инструментов, облегчающих создание 64-битных и параллельных программ. Анализатор PVS-Studio является именно таким инструментом! Хотя сам по себе анализатор кода PVS-Studio достаточно прост, тем не менее, для его использования надо понимать принципы и технологию статического анализа кода, чтобы применение PVS-Studio было наиболее эффективно. Прочитав эту статью и разобрав рассматривающиеся в ней примеры, вы сможете использовать PVS-Studio в своей повседневной работе. Назначение, возможности и системные требования PVS-Studio Статический анализатор кода PVS-Studio предназначен для разработчиков современных ресурсоемких приложений на языках Си и Си++. В настоящее время анализатор PVS-Studio содержит в себе два модуля:
С помощью этих двух модулей PVS-Studio позволяет обнаруживать в исходном коде программ на языках Си и Си++ следующие типы дефектов:
Анализатор PVS-Studio предназначен для работы на Windows-платформе. При этом он интегрируется в среду разработки Microsoft Visual Studio 2005/2008. Системные требования к анализатору совпадают с требованиями к Microsoft Visual Studio:
Установка PVS-Studio Получив установочный пакет PVS-Studio можно приступить к установке программы. К счастью это довольно простая процедура и никаких каверзных вопросов инсталлятор не задает. ![]() Рисунок 2 - Установка PVS-Studio Во время установки будет выполнена интеграция анализатора кода в Microsoft Visual Studio. В случае, если на машине установлена какая-либо одна версия Microsoft Visual Studio (например, только 2005 или только 2008), то анализатор будет интегрирован лишь в нее. Если же несколько версий - то во все. Это определяется автоматически. Также будет выполнена интеграция справочной системы PVS-Studio в MSDN. В PVS-Studio очень хорошая справочная система, которая содержит описания всех диагностических сообщений анализатора с примерами проблем в коде и способами их исправления. Кроме того в ней описаны все настройки, с помощью которых можно добиться лучшей диагностики от PVS-Studio. После завершения установки PVS-Studio можно убедиться, что программа корректно установлена. Для этого надо запустить Microsoft Visual Studio и на стартовом экране появится логотип PVS-Studio (рисунок 3). ![]() Рисунок 3 - Стартовый экран Microsoft Visual Studio с логотипом PVS-Studio И хотя после этого сразу же можно приступать к работе, мы рекомендуем установить два дополнительных примера исходных кодов PortSample и ParallelSample (рисунок 4) из меню PVS-Studio\Issues Examples. ![]() Рисунок 4 - Установка дополнительных примеров ошибок PortSample и ParallelSample С помощью этих примеров можно на практике познакомиться с дефектами, которые бывают в современном программном обеспечении. PortSample содержит в себе примеры проблем, возникающие при миграции программного обеспечения с 32-битных систем на 64-битные. ParallelSample позволяет на практике увидеть, что бывает с параллельными программами содержащими <параллельные> ошибки. Эти примеры (PortSample и ParallelSample) стоит установить, поскольку дальнейшее описание в статье будет опираться на них. Знакомство с PVS-Studio После установки примеров PortSample и ParallelSample можно начать знакомство с PVS-Studio. Откроем проект PortSample (vs2008) в Microsoft Visual Studio 2008, хотя тоже самое можно сделать и в Microsoft Visual Studio 2005 (рисунок 5). ![]() Рисунок 5 - Выбор демонстрационного проекта PortSample Начинать знакомство с PVS-Studio стоит с одного из наших демонстрационных проектов по нескольким причинам:
Итак, откроем проект PortSample, выберем 64-битную конфигурацию x64 для проверки на наличие дефектов 64-битного кода, выберем с помощью панели команд PVS-Studio анализ 64-битных проблем - модуль Viva64 "64-bit issues (Viva64)" и запустим проверку всего решения командой "Check Solution". Все это показано на рисунке 6. ![]() Рисунок 6 - Проверка решения PortSample на наличие 64-битных проблем Конфигурация x64 выбрана специально. На проблемы 64-битного кода можно проверять только 64-битные конфигурации. Дело в том, что в 64-битной конфигурации настройки проекта отличаются от 32-битной. И делать проверку 64-битного кода в 32-битной конфигурации нельзя. После запуска проверки на экране появится индикатор прогресса с кнопками Pause (приостановить анализ) и Stop (прервать анализ). Обнаруженные потенциально опасные конструкции во время анализа будут выводиться в окно найденных дефектов (рисунок 7). ![]() Рисунок 7 - Анализ проекта - обнаруженные в коде проблемы сразу же выводятся в окно Термин "потенциально опасная конструкция" означает, что данную конкретную строку кода анализатор посчитал дефектом. Является ли эта строка реальным дефектом в приложении или нет - определить может только программист, основываясь на своем знании приложения. Этот принцип работы с анализаторами кода очень важно правильно понимать. Вообще никакой инструмент не может полностью заменить программиста в задачи исправления ошибок в программах. Только программист, основываясь на своих знаниях, может это сделать. Но инструмент может и должен помочь программисту в этом. Поэтому задача анализатора кода - это сократить количество мест в программе, которое должен просмотреть и разобрать программист. Но вернемся к анализатору PVS-Studio. Анализ всего кода завершен, и теперь можно приступить к просмотру сообщений. Кстати если у вас многоядерный процессор, то анализ завершится быстрее, так как будут использоваться все ядра. Исправление ошибок Получив список диагностических сообщений от анализатора кода, можно приступать к его изучению. Перейдем к первой ошибке:
![]() Рисунок 8 - Подробное описание ошибки, а также способы исправления приведены в MSDN После исправления используемых типов данных перезапустим анализ и увидим, что диагностических сообщений стало на одно меньше. Это значит, что проблема исправлена. Аналогичным образом надо пройтись по всем диагностическим сообщениям и исправить те места в коде, где возможны проблемы. Работа со списком диагностических сообщений Разумеется, в больших реальных проектах диагностических сообщений будет не несколько десятков, а несколько сотен или даже может быть тысяч. И просмотр всех подобных сообщений может быть непростой задачей. Для того, чтобы облегчить ее, в анализаторе PVS-Studio имеются несколько механизмов. Первый - это фильтрация сообщений по коду ошибки. Второй - фильтрация по содержимому текста диагностического сообщения. Третий - фильтрация на основе путей к файлам. Рассмотрим примеры использования систем фильтрации. Предположим, что вы уверены, что диагностические сообщения с кодом V112 (использование магических чисел) никогда не являются реальными ошибками в вашем приложении. Тогда можно отключить показ этих диагностических сообщений с помощью настроек анализатора кода: ![]() Рисунок 9 - Отключение некоторых диагностических сообщений по коду После этого из списка сообщений пропадут все сообщения с кодом V112. Причем перезапускать анализ для этого не требуется. Если же включить обратно показ таких сообщений, то они вновь появятся в списке без перезапуска анализа. Теперь рассмотрим другой вариант фильтрации на основе текста диагностических сообщений. Вернемся к примеру PortSample. Одной из ошибок в этом примере является доступ к массиву array с использованием индекса типа int:
![]() Рисунок 10 - Отключение некоторых диагностических сообщений по тексту После этого все диагностические сообщения, текст которых содержит слово array, пропадут из списка без перезапуска анализатора кода. Вернуть их можно просто удалив слово array из фильтра. Последним механизмом сокращения количества диагностических сообщений является фильтрация на основе путей к файлам проекта. Предположим, в вашем проекте используется библиотека Boost. Анализатор будет, конечно же, сообщать и о потенциальных проблемах в этой библиотеке. Однако если вы уверены, что эти сообщения не стоит учитывать, то можно просто добавить путь к папке с Boost на вкладе ExcludeFromAnalysis: ![]() Рисунок 11 - Настройка фильтрации сообщений по имени файлов После этого диагностические сообщения, относящиеся к файлам в этой папке, не будут показываться. Эта опция требует перезапуска анализатора кода. Есть также ряд других способов повлиять на выводимые диагностические сообщения путем настроек анализатора кода, но в рамках данного документа они не рассматриваются. Рекомендуем обратиться к документации по настройкам анализатора кода. Надо ли добиваться исправления всех потенциальных ошибок, на которые указывает анализатор? Когда вы просмотрите все сообщения, которые выдал анализатор кода, то вы найдете как реальные ошибки в программах, так и конструкции не являющиеся ошибочными. Дело в том, что анализатор не может на 100% точно определить все ошибки в программах без так называемых "ложных срабатываний". Только программист, зная и понимая программу, может определить есть в конкретном месте ошибка или нет. Анализатор кода же только существенно сокращает количество мест, которые необходимо просмотреть разработчику. Таким образом добиваться исправления всех потенциальных проблем, на которые указывает анализатор кода, смысла, конечно же, нет. Но стремиться исправить как можно большее количество кода стоит. Особенно это актуально, когда статический анализатор используется не однократно для верификации приложения, например, при его переносе на 64-битную систему, а регулярно с целью выявления вновь внесенных ошибок и неэффективных конструкций. В этом случае исправления потенциальных мест, которые на самом деле ошибками не являются, а также настройка анализатора на подавления определенных видов ошибок, позволит существенно сократить время при последующем использовании анализатора. Библиографический список
--------------------
Карпов Андрей, DevRel в PVS-Studio. |
||||||||||||
|
|||||||||||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |