Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Учебное пособие по PVS-Studio, Учебное пособие по работе с PVS-Studio 
:(
    Опции темы
Thunderbolt
Дата 26.7.2009, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


DevRel
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 7.11.2007
Где: Тула

Репутация: 10
Всего: 16



Евгений Рыжков
ООО "Системы программной верификации"


 Июль 2009

Аннотация
Введение
Назначение, возможности и системные требования PVS-Studio
Установка PVS-Studio
Знакомство с PVS-Studio
Исправление ошибок
Работа со списком диагностических сообщений
Надо ли добиваться исправления всех потенциальных ошибок, на которые указывает анализатор?
Библиографический список



Аннотация

Статья представляет собой учебное пособие (tutorial) по работе с анализатором кода PVS-Studio. Из нее вы узнаете об основных возможностях PVS-Studio, принципах работы с инструментом, а также об особенностях анализа кода некоторых типов приложений.

Введение

PVS-Studio- это статический анализатор кода, предназначенный для разработчиков современных ресурсоемких приложений на языках Си и Си++. Под современными мы понимаем 64-битные и/или параллельные приложения. Разработка таких программ имеет ряд трудностей, отличных от проблем традиционных программ. Ведь помимо обычных и всем известных ошибок вроде неинициализированных указателей, доступа за границы массива и прочих дефектов кода, которые обнаруживаются любым компилятором, есть и новые типы проблем. 
user posted image
Рисунок 1 - Логотип анализатора кода PVS-Studio

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

Назначение, возможности и системные требования PVS-Studio

Статический анализатор кода PVS-Studio предназначен для разработчиков современных ресурсоемких приложений на языках Си и Си++. В настоящее время анализатор PVS-Studio содержит в себе два модуля:
  • Viva64 - подсистема диагностики ошибок, характерных для 64-битных систем;
  • VivaMP - подсистема диагностики ошибок в параллельных программах, построенных на технологии OpenMP.
 

С помощью этих двух модулей PVS-Studio позволяет обнаруживать в исходном коде программ на языках Си и Си++ следующие типы дефектов:
  • ошибки миграции 32-битных приложений на 64-битные системы
  • ошибки, возникающие при разработке новых 64-битных приложений
  • неоптимальное использование памяти в 64-битных программах вследствие особенностей выравнивания;
  • ошибки в параллельных программах, связанные с недостаточным знанием синтаксиса директив OpenMP;
  • ошибки в параллельных программах, связанные с недостаточным знанием принципов распараллеливания кода с использованием технологии OpenMP;
  • ошибки из-за некорректной работы с памятью в параллельном коде (незащищенный доступ к общей памяти, отсутствие синхронизации, неправильный режим доступа к переменным, и т. п.)
 

Анализатор PVS-Studio предназначен для работы на Windows-платформе. При этом он интегрируется в среду разработки Microsoft Visual Studio 2005/2008. Системные требования к анализатору совпадают с требованиями к Microsoft Visual Studio:
  • Операционная система: Windows 2000/XP/2003/Vista/2008 x86 или x64. Внимание, для анализа 64-битных приложений операционная система не обязательно должна быть 64-битной.
  • Среда разработки: Microsoft Visual Studio 2005/2008 (Standard Edition, Professional Edition, Team Systems). Для анализа 64-битных приложений необходимо иметь установленным компонент Visual Studio под названием "X64 Compilers and Tools". Он входит во всех перечисленные версии Visual Studio и может быть установлен через Visual Studio Setup. Обратите внимание, что работа PVS-Studio с Visual C++ Express Edition не возможна, поскольку эта система не поддерживает модули расширения.
  • Аппаратная часть: PVS-Studio работает на системах с не менее чем 1 гигабайтом оперативной памяти (рекомендуется 2 гигабайта и более); анализатор поддерживает работу на нескольких ядрах (чем больше ядер, тем быстрее выполняется анализ кода).
 


Установка PVS-Studio

Получив установочный пакет PVS-Studio можно приступить к установке программы. К счастью это довольно простая процедура и никаких каверзных вопросов инсталлятор не задает. 
user posted image
Рисунок 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).
user posted image
Рисунок 3 - Стартовый экран Microsoft Visual Studio с логотипом PVS-Studio

И хотя после этого сразу же можно приступать к работе, мы рекомендуем установить два дополнительных примера исходных кодов PortSample и ParallelSample (рисунок 4) из меню PVS-Studio\Issues Examples.
user posted image
Рисунок 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).
user posted image
Рисунок 5 - Выбор демонстрационного проекта PortSample

Начинать знакомство с PVS-Studio стоит с одного из наших демонстрационных проектов по нескольким причинам:
  • во-первых, в них собраны все дефекты кода, которые диагностируются PVS-Studio;
  • во-вторых, можно на реальном примере увидеть поведение приложения с ошибкой;
  • в-третьих, ознакомительная версия PVS-Studio показывает расположение в коде не всех дефектов с ошибками, а только некоторых (хотя обнаруживает все). Но для PortSample и ParallelSample сделано исключение - для них отображаются все дефекты.
 

Итак, откроем проект PortSample, выберем 64-битную конфигурацию x64 для проверки на наличие дефектов 64-битного кода, выберем с помощью панели команд PVS-Studio анализ 64-битных проблем - модуль Viva64 "64-bit issues (Viva64)" и запустим проверку всего решения командой "Check Solution". Все это показано на рисунке 6.
user posted image
Рисунок 6 - Проверка решения PortSample на наличие 64-битных проблем

Конфигурация x64 выбрана специально. На проблемы 64-битного кода можно проверять только 64-битные конфигурации. Дело в том, что в 64-битной конфигурации настройки проекта отличаются от 32-битной. И делать проверку 64-битного кода в 32-битной конфигурации нельзя. 
После запуска проверки на экране появится индикатор прогресса с кнопками Pause (приостановить анализ) и Stop (прервать анализ). Обнаруженные потенциально опасные конструкции во время анализа будут выводиться в окно найденных дефектов (рисунок 7). 
user posted image
Рисунок 7 - Анализ проекта - обнаруженные в коде проблемы сразу же выводятся в окно

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

Исправление ошибок

Получив список диагностических сообщений от анализатора кода, можно приступать к его изучению. Перейдем к первой ошибке:
Код
V101: Implicit assignment type conversion to memsize type. v1xx.cpp 34
Вот ее код:
Код
  size_t bufferSize = imageWidth * imageHeght *
                      bytePerPixel * maxFrameCountInBuffer;
Здесь проблема в том, что результирующий размер буффера (переменная bufferSize) имеет правильный размер size_t, а вот переменные, участвующие в выражении (imageWidth, imageHeight, bytePerPixel и maxFrameCountInBuffer), представлены типом int. В результате перемножение этих переменных дает значение также типа int. Это не страшно для значений меньше двух гигабайт, поскольку выполнится приведение типа. Но если в результате получится число больше двух гигабайт, то оно "обрежется" до двух гигабайт несмотря на то что переменная bufferSize имеет правильный тип. Для исправления ситуации необходимо изменить типы переменных, участвующих в выражении. Сделать это можно чуть выше по коду. Вместо:
Код
  unsigned imageWidth = 1000;
  unsigned imageHeght = 1000;
  unsigned bytePerPixel = 3;
  unsigned maxFrameCountInBuffer;
напишем так:
Код
  size_t imageWidth = 1000;
  size_t imageHeght = 1000;
  size_t bytePerPixel = 3;
  size_t maxFrameCountInBuffer;
Узнать об этом исправлении можно из справочной системы. Нажав F1 после перехода (мышкой или с помощью клавиши F4) к новой ошибке мы увидим открывшееся окно MSDN описанием ошибки:
user posted image
Рисунок 8 - Подробное описание ошибки, а также способы исправления приведены в MSDN

После исправления используемых типов данных перезапустим анализ и увидим, что диагностических сообщений стало на одно меньше. Это значит, что проблема исправлена. Аналогичным образом надо пройтись по всем диагностическим сообщениям и исправить те места в коде, где возможны проблемы. 

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

Разумеется, в больших реальных проектах диагностических сообщений будет не несколько десятков, а несколько сотен или даже может быть тысяч. И просмотр всех подобных сообщений может быть непростой задачей. Для того, чтобы облегчить ее, в анализаторе PVS-Studio имеются несколько механизмов. Первый - это фильтрация сообщений по коду ошибки. Второй - фильтрация по содержимому текста диагностического сообщения. Третий - фильтрация на основе путей к файлам. Рассмотрим примеры использования систем фильтрации.
Предположим, что вы уверены, что диагностические сообщения с кодом V112 (использование магических чисел) никогда не являются реальными ошибками в вашем приложении. Тогда можно отключить показ этих диагностических сообщений с помощью настроек анализатора кода:
user posted image
Рисунок 9 - Отключение некоторых диагностических сообщений по коду

После этого из списка сообщений пропадут все сообщения с кодом V112. Причем перезапускать анализ для этого не требуется. Если же включить обратно показ таких сообщений, то они вновь появятся в списке без перезапуска анализа.
Теперь рассмотрим другой вариант фильтрации на основе текста диагностических сообщений. Вернемся к примеру PortSample. Одной из ошибок в этом примере является доступ к массиву array с использованием индекса типа int:
Код
V108: Incorrect index type for "array". Use memsize type instead.  v1xx.cpp 183
Вот код:
Код
volatile int index = 0;
  for (size_t i = 0; i != n; ++i) {
    array[index++] = 1; // проблема здесь
    if (array[i] != 1)
      throw CString("x64 portability issues");
  }
Конечно же, можно просто исправить тип переменной index с unsigned на size_t и проблема исчезнет. Но если подобного кода с доступом к переменной array много, а вы точно знаете, что в array не больше двух миллиардов элементов, то можно "попросить" анализатор кода не выдавать сообщения, в тексте которых используется слово array. Делается это с помощью настроек на вкладке MessageSuppression:
user posted image
Рисунок 10 - Отключение некоторых диагностических сообщений по тексту

После этого все диагностические сообщения, текст которых содержит слово array, пропадут из списка без перезапуска анализатора кода. Вернуть их можно просто удалив слово array из фильтра.
Последним механизмом сокращения количества диагностических сообщений является фильтрация на основе путей к файлам проекта.
Предположим, в вашем проекте используется библиотека Boost. Анализатор будет, конечно же, сообщать и о потенциальных проблемах в этой библиотеке. Однако если вы уверены, что эти сообщения не стоит учитывать, то можно просто добавить путь к папке с Boost на вкладе ExcludeFromAnalysis:
user posted image
Рисунок 11 - Настройка фильтрации сообщений по имени файлов

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

Надо ли добиваться исправления всех потенциальных ошибок, на которые указывает анализатор?

Когда вы просмотрите все сообщения, которые выдал анализатор кода, то вы найдете как реальные ошибки в программах, так и конструкции не являющиеся ошибочными. Дело в том, что анализатор не может на 100% точно определить все ошибки в программах без так называемых "ложных срабатываний". Только программист, зная и понимая программу, может определить есть в конкретном месте ошибка или нет. Анализатор кода же только существенно сокращает количество мест, которые необходимо просмотреть разработчику.
Таким образом добиваться исправления всех потенциальных проблем, на которые указывает анализатор кода, смысла, конечно же, нет.
Но стремиться исправить как можно большее количество кода стоит. Особенно это актуально, когда статический анализатор используется не однократно для верификации приложения, например, при его переносе на 64-битную систему, а регулярно с целью выявления вновь внесенных ошибок и неэффективных конструкций. В этом случае исправления потенциальных мест, которые на самом деле ошибками не являются, а также настройка анализатора на подавления определенных видов ошибок, позволит существенно сократить время при последующем использовании анализатора.

Библиографический список
  1. Андрей Карпов, Евгений Рыжков. 20 ловушек переноса Си++ - кода на 64-битную платформу. http://www.viva64.com/art-1-1-1958348565.html
  2. Алексей Колосов, Евгений Рыжков, Андрей Карпов. 32 подводных камня OpenMP при программировании на Си++. http://www.viva64.com/art-3-1-464379766.html
  3. Андрей Карпов. Оптимизация 64-битных программ. http://www.viva64.com/art-1-1-1178819034.html
  4. Андрей Карпов. 7 шагов по переносу программы на 64-битную систему. http://www.viva64.com/art-1-1-1148261225.html
  5. Андрей Карпов. Что такое "Parallel Lint"? http://www.viva64.com/art-3-1-17137191.html

--------------------
Карпов Андрей, DevRel в PVS-Studio.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0670 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.