SlideShare a Scribd company logo
1 of 6
Download to read offline
Как мы тестируем анализатор кода
Автор: Евгений Рыжков, Павел Еремеев

Дата: 05.07.2011


Аннотация
В статье описаны технологии тестирования, используемые при разработке статического
анализатора кода PVS-Studio. Разработчики инструмента для программистов делятся принциами
тестирования собственного программного продукта, которые могут быть интересны
разработчикам аналогичных пакетов обработки текстовых данных или исходных кодов.


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

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

PVS-Studio - это статический анализатор кода, предназначенный для разработчиков современных
ресурсоемких приложений на языках Си и Си++ (более подробная информация дана в статье
"Общие сведения о принципах работы с анализатором PVS-Studio" [2]). Под современными мы
понимаем 64-битные и/или параллельные приложения. Разработка таких программ имеет ряд
трудностей, отличных от проблем традиционных программ. Ведь помимо обычных и всем
известных ошибок вроде неинициализированных указателей, которые обнаруживаются любым
компилятором, есть и специфичные виды проблем.

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


Практики тестирования, используемые при разработке PVS-Studio
Разрабатывая PVS-Studio, мы используем шесть основных методики тестирования:

   1. Статический анализ кода. Странно было бы разрабатывать статический анализатор и не
      использовать при этом статический анализ.
   2. Юнит-тесты уровня классов, методов, функций.
3. Функциональные тесты уровня самостоятельно написанных файлов
   4. Функциональные тесты уровня отдельных файлов.
   5. Функциональные тесты уровня отдельных сторонних проектов и решений (projects and
      solutions).
   6. Функциональные тесты пользовательского интерфейса расширения – надстройки,
      интегрируемой в среду Visual Studio.

Кратко опишем здесь эти методики.

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

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

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

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

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

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

Конечно же, помимо этих методик, есть и другие стандартные подходы вроде "зоркий глаз
программиста" или "у нас завтра релиз, проверьте ЭТО", но они показали свои недостатки и мы
стараемся их не применять.

Теперь же расскажем об используемых приемах более подробно.
Статический анализ кода, выполненный статическим анализатором
кода
Заголовок раздела вызывает недоумение? Кто Что же еще может выполнять статический анализ
кроме статического анализатора? Однако при разработке инструментов для программистов
всегда есть нюансы.

Как вы наверняка знаете, первые версии компиляторов языков программирования редко пишутся
сразу же на этих языках. Как правило, для разработки компилятора нового языка используется
совсем другой язык, являющийся стандартом на тот момент. Это сегодня все компиляторы Си++,
пишутся на Си++, а первая версия была написана на Си.

Точно так же, разрабатывая первую версию статического анализатора кода, мы не могли ее
проверить. Именно поэтому первая версия нашего продукта (тогда он назывался еще Viva64)
вовсе не была 64-битной! Зато уже версия 1.10, которая появилась 16 января 2007 года, то есть
через 17 дней после выпуска первой версии, среди нововведений содержала строку:

   •   С помощью анализатора Viva64 мы подготовили 64-битную версию Viva64! Но
       пользователю не надо беспокоиться о выборе подходящей версии. Правильная версия
       выбирается автоматически во время установки.

Таким образом, как только у нас появился статический анализатор, выявляющий проблемы 64-
битного кода, так мы сразу стали проверять им наш же код.

Помогает ли нам статический анализ нашего же продукта? Конечно же, да. Но опять-таки из-за
нашей специфики есть нюансы. Поскольку мы сами пишем статьи про то, как надо делать 64-
битный код, то 64-битных ошибок в новом коде мы все-таки не допускаем. Однако от применения
статического анализа мы извлекаем пользу в плане улучшения диагностики. Например, мы
можем посмотреть, какие типы синтаксических конструкций дают явно ложное срабатывание и
исключить их диагностирование.

Таким образом, применение статического анализа для разработки статического анализатора
оказывается полезным для нас.


Юнит-тесты уровня классов, методов, функций
Юнит-тесты уровня классов, методов, функций представляют собой набор тестов для проверки
отдельных логических элементов программы. Вот некоторые примеры функциональности, на
которую у нас есть юнит-тесты:

   •   применение тех или иных правил диагностики потенциально опасных конструкций;
   •   вычисление типов в выражениях, в операциях приведения типов и т.п.;
   •   работа операторов (сложение, вычитание и т.п.);
   •   работа механизмов загрузки и предварительной обработки файлов;
   •   проверка регистрационной информации;

Естественно, этими областями наши юнит-тесты не ограничиваются, но являются показательными
с точки зрения примеров.

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

Хотя такие тесты позволяют выявить ошибки, они не являются полноценным решением. Дело в
том, что у нас в PVS-Studio очень мало юнит-тестов по сравнению с тем, сколько юнит-тестов
нужно для проверки "почти компилятора". Поэтому достичь юнит-тестами большого покрытия в
нашем случае очень сложно. Это огромная по трудозатратам задача, которую в настоящее время
реализовать нет возможности.

Тем не менее, юнит-тесты уровня классов, методов, функций - это первый уровень "обороны" в
нашей системе тестирования.


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

Такой подход очень похож по принципу работы на функциональные тесты уровня отдельных
проектов (о которых будет сказано ниже), но отличается очень высокой скоростью работы и тем,
что проверяемые файлы написаны (и размечены) самостоятельно.

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


Функциональные тесты уровня отдельных файлов
Проверка не отдельных классов/методов или вручную сделанных файлов, а файлов из реальных
проектов позволяет нам добиться большего покрытия кода. Четвертым уровнем в нашей системе
тестирования является именно такая проверка. В наши тесты включены отдельные полностью
препроцессированные файлы из различных проектов: wxWidgets, fox-toolit, CImg, Lame, Boost,
CxImage, FreeType и многих других. Также сюда входят препроцессированные файлы,
построенные на основе стандартных системных заголовочных файлов (CRT, MFC и так далее).

После добавления новой или исправления старой функциональности программист запускает
сначала release-версию тестов, а потом debug-версию. Почему сразу не запускать debug-версию?
Очень просто, Debug-версию не запускают сразу потому, что release-версия тестов работает одну
минуту, а debug-версия - пять минут.
Тестирование на уровне отдельных файлов - очень мощная вещь. Она позволяет мгновенно
выявить ошибку, если в результате развития анализатора какая-то функциональность
"отвалилась". Огромное количество ошибок было не допущено благодаря этим тестам.


Функциональные тесты уровня отдельных сторонних проектов и
решений
Самая мощная часть нашей системы тестирования - это ее пятый уровень, который представляет
собой проверку отдельных проектов и решений (projects and solutions). Именно благодаря этой
системе каждая новая версия PVS-Studio как минимум не хуже предыдущей.

Выглядит эта система следующим образом. Имеется несколько десятков проектов и решений
различных доступных в интернете программ. Например: Lame, Emule, Pixie, Loki и другие. Каждый
из этих проектов проверен с помощью PVS-Studio, результаты проверки (в виде log-файла)
сохранены. После установки новой (разрабатываемой версии) запускается специальная
разработанная нами система, которая по очереди открывает каждый проект, проверяет его с
помощью PVS-Studio, сохраняет результаты, а затем сравнивает их с эталонными. Если есть
отличия, то она их записывает в отдельный файл (аналог стандартного diff), который легко можно
посмотреть с помощью PVS-Studio и разобраться в причине появления этих отличий.

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

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

Эта система имеет и другое назначение. Поскольку продукт PVS-Studio предназначен для работы
как в Visual Studio 2005, так и в Visual Studio 2008 и 2010, то мы всегда проверяем, чтобы
диагностические сообщения всегда совпадали в разных версиях Visual Studio. То есть если, к
примеру, мы получили во всех проектах 10 000 диагностических сообщений в Visual Studio 2005, то
и в Visual Studio 2008 и 2010 мы должны получить ровно столько же сообщений.

Сколько времени занимает такая проверка? На этот вопрос нет однозначного ответа, покольку
база этих тестов постоянно растет за счет новых проектов. И, естественно, время работы
постоянно увеличивается. Год назад, когда анализатор работал только с использованием одного
ядра, тесты выполнялись около часа. Затем мы сделали возможным работу в несколько потоков, и
для двухъядерной машины время работы сократилось почти вдвое. Со временем мы добавляли
все новые проекты и в тесты. Теперь на той же двухъядерной машине эти тесты отрабатывают чуть
больше, чем за час. Все это происходит, естественно, в release-версии.
Функциональные тесты пользовательского интерфейса
расширения – надстройки, интегрируемой в среду Visual Studio
На шестом уровне находится система автоматизированного функционального тестирования
пользовательского интерфейса. В связи с тем, что сам анализатор PVS-Studio представляет собой
консольное приложение, он не имеет собственного пользовательского интерфейса. Однако для
его работы и проверки файлов с исходным кодом требуется сбор данных о параметрах
компиляции проверяемых им файлов и создание множества временных конфигурационных
файлов, что, безусловно, неудобно делать вручную. Поэтому, по аналогии с компилятором Visual
C++, всё это скрыто от конечного пользователя и автоматизировано с помощью плагина-
надстройки для среды разработки Visual Studio. Тестирование GUI данной надстройки и
происходит на 6-ом уровне нашей системы, т.е. фактически проверяется та дополнительная
функциональность интерфейса среды Visual Studio, которую обеспечивает интегрированная в неё
PVS-Studio.

Для покрытия функциональных возможностей PVS-Studio система использует 3 тестовых набора
(по одному для каждой из поддерживаемых версий Visual Studio), каждый из которых состоит из
отдельных тестовых сценариев (вариантов использования). Каждый такой сценарий содержит
верификацию порядка 3-5 вариантов тестирования (набор условий, определяющих,
удовлетворяется ли заранее определённое требование). Каждый тестовый набор содержит
одинаковый набор сценариев и одинаковые требования для каждого варианта тестирования, т.к.
предполагается, что анализатор PVS-Studio должен функционировать одинаково во всех версиях
Visual Studio.

Система тестирования интерфейса реализована на базе встроенной системы модульного
тестирования Visual Studio Team Test. (расширение для тестирования графического интерфейса
появилось в Visual Studio начиная с версии 2010). Стоит отметить, что для данной системы
интерфейсы Visual Studio версий 2005 и 2008 идентичны (т.е. имеют одинаковый UI Mapping и
покрываются одной реализацией тестовых сценариев). Visual Studio 2010 же имеет новый
интерфейс, основанный в основном на WPF элементах, и поэтому требует отдельной реализации
тестов.


Что дальше?
Известно, что нет предела совершенству. Мы продолжаем развивать нашу систему тестов по всем
направлениям. Естественно, мы постоянно увеличиваем базу всех тестов.


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


Библиографический список
   1. Анализатор кода PVS-Studio. http://www.viva64.com/ru/pvs-studio/
   2. Общие сведения о принципах работы с анализатором PVS-Studio
      http://www.viva64.com/ru/d/0011/

More Related Content

What's hot

Сравнение PVS-Studio с другими анализаторами кода
Сравнение PVS-Studio с другими анализаторами кодаСравнение PVS-Studio с другими анализаторами кода
Сравнение PVS-Studio с другими анализаторами кодаTatyanazaxarova
 
Ошибки начинающих Tdd практиков, плюсы применения
Ошибки начинающих Tdd практиков, плюсы примененияОшибки начинающих Tdd практиков, плюсы применения
Ошибки начинающих Tdd практиков, плюсы примененияzheldak
 
Антон Семенченко, Никита Беликов "Инструменты автоматизации тестирования моби...
Антон Семенченко, Никита Беликов "Инструменты автоматизации тестирования моби...Антон Семенченко, Никита Беликов "Инструменты автоматизации тестирования моби...
Антон Семенченко, Никита Беликов "Инструменты автоматизации тестирования моби...QA Club Minsk
 
Урок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибокУрок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибокTatyanazaxarova
 
Эльдар Гусейнов "Эффективная архитектура мобильной автоматизации для проектов...
Эльдар Гусейнов "Эффективная архитектура мобильной автоматизации для проектов...Эльдар Гусейнов "Эффективная архитектура мобильной автоматизации для проектов...
Эльдар Гусейнов "Эффективная архитектура мобильной автоматизации для проектов...QA Club Minsk
 
Изменения в инфраструктуре инструментов для программистов
Изменения в инфраструктуре инструментов для программистовИзменения в инфраструктуре инструментов для программистов
Изменения в инфраструктуре инструментов для программистовTatyanazaxarova
 
QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?
QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?
QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?QAFest
 
Benefits of unit-testing and inversion of controll
Benefits of unit-testing and inversion of controllBenefits of unit-testing and inversion of controll
Benefits of unit-testing and inversion of controllMykyta Hopkalo
 
Трудности сравнения анализаторов кода или не забывайте об удобстве использования
Трудности сравнения анализаторов кода или не забывайте об удобстве использованияТрудности сравнения анализаторов кода или не забывайте об удобстве использования
Трудности сравнения анализаторов кода или не забывайте об удобстве использованияTatyanazaxarova
 
Sqadays 8-barancev
Sqadays 8-barancevSqadays 8-barancev
Sqadays 8-barancevAlexei Lupan
 
Лучшие практики на практике
Лучшие практики на практикеЛучшие практики на практике
Лучшие практики на практикеDenis Tuchin
 
Ui testing how intel does this
Ui testing   how intel does thisUi testing   how intel does this
Ui testing how intel does thisAlexei Lupan
 
Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS
Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOSРоман Петров - юнит-тестирование мобильных приложений на примере платформы iOS
Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOSProvectus
 
зуева татьяна - опыт автоматизации тестирования в Agile проекте
зуева татьяна -  опыт автоматизации тестирования в Agile проектезуева татьяна -  опыт автоматизации тестирования в Agile проекте
зуева татьяна - опыт автоматизации тестирования в Agile проектеMagneta AI
 
ClubQA #2. Unit testing and TDD
ClubQA #2. Unit testing and TDDClubQA #2. Unit testing and TDD
ClubQA #2. Unit testing and TDDClub QA Kostroma
 
Разработка и сопровождении авто-тестов (Selenium)
Разработка и сопровождении авто-тестов (Selenium)Разработка и сопровождении авто-тестов (Selenium)
Разработка и сопровождении авто-тестов (Selenium)Paul Stashevsky
 
Тестирование ПО
Тестирование ПОТестирование ПО
Тестирование ПОseleznev_stas
 

What's hot (20)

QAFest. Роль тестирования в Devops
QAFest. Роль тестирования в DevopsQAFest. Роль тестирования в Devops
QAFest. Роль тестирования в Devops
 
Сравнение PVS-Studio с другими анализаторами кода
Сравнение PVS-Studio с другими анализаторами кодаСравнение PVS-Studio с другими анализаторами кода
Сравнение PVS-Studio с другими анализаторами кода
 
Ошибки начинающих Tdd практиков, плюсы применения
Ошибки начинающих Tdd практиков, плюсы примененияОшибки начинающих Tdd практиков, плюсы применения
Ошибки начинающих Tdd практиков, плюсы применения
 
Антон Семенченко, Никита Беликов "Инструменты автоматизации тестирования моби...
Антон Семенченко, Никита Беликов "Инструменты автоматизации тестирования моби...Антон Семенченко, Никита Беликов "Инструменты автоматизации тестирования моби...
Антон Семенченко, Никита Беликов "Инструменты автоматизации тестирования моби...
 
Урок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибокУрок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибок
 
Эльдар Гусейнов "Эффективная архитектура мобильной автоматизации для проектов...
Эльдар Гусейнов "Эффективная архитектура мобильной автоматизации для проектов...Эльдар Гусейнов "Эффективная архитектура мобильной автоматизации для проектов...
Эльдар Гусейнов "Эффективная архитектура мобильной автоматизации для проектов...
 
Изменения в инфраструктуре инструментов для программистов
Изменения в инфраструктуре инструментов для программистовИзменения в инфраструктуре инструментов для программистов
Изменения в инфраструктуре инструментов для программистов
 
Sqa8 urazov
Sqa8 urazovSqa8 urazov
Sqa8 urazov
 
QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?
QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?
QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?
 
Benefits of unit-testing and inversion of controll
Benefits of unit-testing and inversion of controllBenefits of unit-testing and inversion of controll
Benefits of unit-testing and inversion of controll
 
Трудности сравнения анализаторов кода или не забывайте об удобстве использования
Трудности сравнения анализаторов кода или не забывайте об удобстве использованияТрудности сравнения анализаторов кода или не забывайте об удобстве использования
Трудности сравнения анализаторов кода или не забывайте об удобстве использования
 
Sqadays 8-barancev
Sqadays 8-barancevSqadays 8-barancev
Sqadays 8-barancev
 
Лучшие практики на практике
Лучшие практики на практикеЛучшие практики на практике
Лучшие практики на практике
 
Ui testing how intel does this
Ui testing   how intel does thisUi testing   how intel does this
Ui testing how intel does this
 
Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS
Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOSРоман Петров - юнит-тестирование мобильных приложений на примере платформы iOS
Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS
 
DevOps guide for awesome quality assurance
DevOps guide for awesome quality assuranceDevOps guide for awesome quality assurance
DevOps guide for awesome quality assurance
 
зуева татьяна - опыт автоматизации тестирования в Agile проекте
зуева татьяна -  опыт автоматизации тестирования в Agile проектезуева татьяна -  опыт автоматизации тестирования в Agile проекте
зуева татьяна - опыт автоматизации тестирования в Agile проекте
 
ClubQA #2. Unit testing and TDD
ClubQA #2. Unit testing and TDDClubQA #2. Unit testing and TDD
ClubQA #2. Unit testing and TDD
 
Разработка и сопровождении авто-тестов (Selenium)
Разработка и сопровождении авто-тестов (Selenium)Разработка и сопровождении авто-тестов (Selenium)
Разработка и сопровождении авто-тестов (Selenium)
 
Тестирование ПО
Тестирование ПОТестирование ПО
Тестирование ПО
 

Viewers also liked

20 ловушек переноса Си++ - кода на 64-битную платформу
20 ловушек переноса Си++ - кода на 64-битную платформу20 ловушек переноса Си++ - кода на 64-битную платформу
20 ловушек переноса Си++ - кода на 64-битную платформуTatyanazaxarova
 
32 подводных камня OpenMP при программировании на Си++
32 подводных камня OpenMP при программировании на Си++32 подводных камня OpenMP при программировании на Си++
32 подводных камня OpenMP при программировании на Си++Tatyanazaxarova
 
64 бита для Си++ программистов: от /Wp64 к Viva64
64 бита для Си++ программистов: от /Wp64 к Viva6464 бита для Си++ программистов: от /Wp64 к Viva64
64 бита для Си++ программистов: от /Wp64 к Viva64Tatyanazaxarova
 
Урок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окруженияУрок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окруженияTatyanazaxarova
 
Статический анализ и регулярные выражения
Статический анализ и регулярные выраженияСтатический анализ и регулярные выражения
Статический анализ и регулярные выраженияTatyanazaxarova
 

Viewers also liked (6)

20 ловушек переноса Си++ - кода на 64-битную платформу
20 ловушек переноса Си++ - кода на 64-битную платформу20 ловушек переноса Си++ - кода на 64-битную платформу
20 ловушек переноса Си++ - кода на 64-битную платформу
 
32 подводных камня OpenMP при программировании на Си++
32 подводных камня OpenMP при программировании на Си++32 подводных камня OpenMP при программировании на Си++
32 подводных камня OpenMP при программировании на Си++
 
PVS-Studio
PVS-Studio PVS-Studio
PVS-Studio
 
64 бита для Си++ программистов: от /Wp64 к Viva64
64 бита для Си++ программистов: от /Wp64 к Viva6464 бита для Си++ программистов: от /Wp64 к Viva64
64 бита для Си++ программистов: от /Wp64 к Viva64
 
Урок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окруженияУрок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окружения
 
Статический анализ и регулярные выражения
Статический анализ и регулярные выраженияСтатический анализ и регулярные выражения
Статический анализ и регулярные выражения
 

Similar to Как мы тестируем анализатор кода

Unit tests ru
Unit tests ruUnit tests ru
Unit tests ruISsoft
 
Mva stf module 2 - rus
Mva stf module 2 - rusMva stf module 2 - rus
Mva stf module 2 - rusMaxim Shaptala
 
Использование анализатора PVS-Studio в процессе инкрементальной сборки в Micr...
Использование анализатора PVS-Studio в процессе инкрементальной сборки в Micr...Использование анализатора PVS-Studio в процессе инкрементальной сборки в Micr...
Использование анализатора PVS-Studio в процессе инкрементальной сборки в Micr...Tatyanazaxarova
 
Статический анализатор кода PVS-Studio
Статический анализатор кода PVS-StudioСтатический анализатор кода PVS-Studio
Статический анализатор кода PVS-Studiocppclimber
 
Константин Книжник: статический анализ, взгляд со стороны
Константин Книжник: статический анализ, взгляд со стороныКонстантин Книжник: статический анализ, взгляд со стороны
Константин Книжник: статический анализ, взгляд со стороныTatyanazaxarova
 
Mva stf module 1 - rus
Mva stf module 1 - rusMva stf module 1 - rus
Mva stf module 1 - rusMaxim Shaptala
 
CodeFest 2010. Уразов А. — Quality-Oriented Programming (Программирование, ор...
CodeFest 2010. Уразов А. — Quality-Oriented Programming (Программирование, ор...CodeFest 2010. Уразов А. — Quality-Oriented Programming (Программирование, ор...
CodeFest 2010. Уразов А. — Quality-Oriented Programming (Программирование, ор...CodeFest
 
Continious integration-Automated Testing-Solid-Agile
Continious integration-Automated Testing-Solid-AgileContinious integration-Automated Testing-Solid-Agile
Continious integration-Automated Testing-Solid-AgileKairat Yussupov
 
Облегчаем процесс разработки с помощью статического анализа кода: Наш опыт
Облегчаем процесс разработки с помощью статического анализа кода: Наш опытОблегчаем процесс разработки с помощью статического анализа кода: Наш опыт
Облегчаем процесс разработки с помощью статического анализа кода: Наш опытAndrey Karpov
 
Трепещи, мир! Мы выпустили PVS-Studio 4.00 с бесплатным анализатором общего н...
Трепещи, мир! Мы выпустили PVS-Studio 4.00 с бесплатным анализатором общего н...Трепещи, мир! Мы выпустили PVS-Studio 4.00 с бесплатным анализатором общего н...
Трепещи, мир! Мы выпустили PVS-Studio 4.00 с бесплатным анализатором общего н...Tatyanazaxarova
 
Андрей Уразов - Методы раннего обнаружения ошибок
Андрей Уразов - Методы раннего обнаружения ошибокАндрей Уразов - Методы раннего обнаружения ошибок
Андрей Уразов - Методы раннего обнаружения ошибокSQALab
 
Mva stf module 5 - rus
Mva stf module 5 - rusMva stf module 5 - rus
Mva stf module 5 - rusMaxim Shaptala
 
Отладка и оптимизация многопоточных OpenMP-программ
Отладка и оптимизация многопоточных OpenMP-программОтладка и оптимизация многопоточных OpenMP-программ
Отладка и оптимизация многопоточных OpenMP-программTatyanazaxarova
 
Mva stf module 3 - rus
Mva stf module 3 - rusMva stf module 3 - rus
Mva stf module 3 - rusMaxim Shaptala
 
QA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
QA Fes 2016. Анастасия Асеева. Роль тестирования в DevopsQA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
QA Fes 2016. Анастасия Асеева. Роль тестирования в DevopsQAFest
 
Статический анализ и ROI
Статический анализ и ROIСтатический анализ и ROI
Статический анализ и ROITatyanazaxarova
 
About Testers
About TestersAbout Testers
About Testersantsh
 
Применение современных статических анализаторов
Применение современных статических анализаторовПрименение современных статических анализаторов
Применение современных статических анализаторовSQALab
 
Code review как средство обеспечения качества программного обеспечения
Code review как средство обеспечения качества программного обеспеченияCode review как средство обеспечения качества программного обеспечения
Code review как средство обеспечения качества программного обеспеченияSQALab
 

Similar to Как мы тестируем анализатор кода (20)

Unit tests ru
Unit tests ruUnit tests ru
Unit tests ru
 
Unit Testing
Unit TestingUnit Testing
Unit Testing
 
Mva stf module 2 - rus
Mva stf module 2 - rusMva stf module 2 - rus
Mva stf module 2 - rus
 
Использование анализатора PVS-Studio в процессе инкрементальной сборки в Micr...
Использование анализатора PVS-Studio в процессе инкрементальной сборки в Micr...Использование анализатора PVS-Studio в процессе инкрементальной сборки в Micr...
Использование анализатора PVS-Studio в процессе инкрементальной сборки в Micr...
 
Статический анализатор кода PVS-Studio
Статический анализатор кода PVS-StudioСтатический анализатор кода PVS-Studio
Статический анализатор кода PVS-Studio
 
Константин Книжник: статический анализ, взгляд со стороны
Константин Книжник: статический анализ, взгляд со стороныКонстантин Книжник: статический анализ, взгляд со стороны
Константин Книжник: статический анализ, взгляд со стороны
 
Mva stf module 1 - rus
Mva stf module 1 - rusMva stf module 1 - rus
Mva stf module 1 - rus
 
CodeFest 2010. Уразов А. — Quality-Oriented Programming (Программирование, ор...
CodeFest 2010. Уразов А. — Quality-Oriented Programming (Программирование, ор...CodeFest 2010. Уразов А. — Quality-Oriented Programming (Программирование, ор...
CodeFest 2010. Уразов А. — Quality-Oriented Programming (Программирование, ор...
 
Continious integration-Automated Testing-Solid-Agile
Continious integration-Automated Testing-Solid-AgileContinious integration-Automated Testing-Solid-Agile
Continious integration-Automated Testing-Solid-Agile
 
Облегчаем процесс разработки с помощью статического анализа кода: Наш опыт
Облегчаем процесс разработки с помощью статического анализа кода: Наш опытОблегчаем процесс разработки с помощью статического анализа кода: Наш опыт
Облегчаем процесс разработки с помощью статического анализа кода: Наш опыт
 
Трепещи, мир! Мы выпустили PVS-Studio 4.00 с бесплатным анализатором общего н...
Трепещи, мир! Мы выпустили PVS-Studio 4.00 с бесплатным анализатором общего н...Трепещи, мир! Мы выпустили PVS-Studio 4.00 с бесплатным анализатором общего н...
Трепещи, мир! Мы выпустили PVS-Studio 4.00 с бесплатным анализатором общего н...
 
Андрей Уразов - Методы раннего обнаружения ошибок
Андрей Уразов - Методы раннего обнаружения ошибокАндрей Уразов - Методы раннего обнаружения ошибок
Андрей Уразов - Методы раннего обнаружения ошибок
 
Mva stf module 5 - rus
Mva stf module 5 - rusMva stf module 5 - rus
Mva stf module 5 - rus
 
Отладка и оптимизация многопоточных OpenMP-программ
Отладка и оптимизация многопоточных OpenMP-программОтладка и оптимизация многопоточных OpenMP-программ
Отладка и оптимизация многопоточных OpenMP-программ
 
Mva stf module 3 - rus
Mva stf module 3 - rusMva stf module 3 - rus
Mva stf module 3 - rus
 
QA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
QA Fes 2016. Анастасия Асеева. Роль тестирования в DevopsQA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
QA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
 
Статический анализ и ROI
Статический анализ и ROIСтатический анализ и ROI
Статический анализ и ROI
 
About Testers
About TestersAbout Testers
About Testers
 
Применение современных статических анализаторов
Применение современных статических анализаторовПрименение современных статических анализаторов
Применение современных статических анализаторов
 
Code review как средство обеспечения качества программного обеспечения
Code review как средство обеспечения качества программного обеспеченияCode review как средство обеспечения качества программного обеспечения
Code review как средство обеспечения качества программного обеспечения
 

More from Tatyanazaxarova

Урок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программУрок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программTatyanazaxarova
 
Урок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибокУрок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибокTatyanazaxarova
 
Урок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиУрок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиTatyanazaxarova
 
Урок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структурУрок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структурTatyanazaxarova
 
Урок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данныхУрок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данныхTatyanazaxarova
 
Урок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. ИсключенияУрок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. ИсключенияTatyanazaxarova
 
Урок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен даннымиУрок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен даннымиTatyanazaxarova
 
Урок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметикаУрок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметикаTatyanazaxarova
 
Урок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединенияхУрок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединенияхTatyanazaxarova
 
Урок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателейУрок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателейTatyanazaxarova
 
Урок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметикаУрок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметикаTatyanazaxarova
 
Урок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвигаУрок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвигаTatyanazaxarova
 
Урок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументовУрок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументовTatyanazaxarova
 
Урок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаУрок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаTatyanazaxarova
 
Урок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном кодеУрок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном кодеTatyanazaxarova
 
Урок 5. Сборка 64-битного приложения
Урок 5. Сборка 64-битного приложенияУрок 5. Сборка 64-битного приложения
Урок 5. Сборка 64-битного приложенияTatyanazaxarova
 
Урок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурацииУрок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурацииTatyanazaxarova
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийTatyanazaxarova
 
Статический анализ Си++ кода
Статический анализ Си++ кодаСтатический анализ Си++ кода
Статический анализ Си++ кодаTatyanazaxarova
 
PVS-Studio научился следить за тем, как вы программируете
PVS-Studio научился следить за тем, как вы программируетеPVS-Studio научился следить за тем, как вы программируете
PVS-Studio научился следить за тем, как вы программируетеTatyanazaxarova
 

More from Tatyanazaxarova (20)

Урок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программУрок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программ
 
Урок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибокУрок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибок
 
Урок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиУрок 24. Фантомные ошибки
Урок 24. Фантомные ошибки
 
Урок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структурУрок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структур
 
Урок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данныхУрок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данных
 
Урок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. ИсключенияУрок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. Исключения
 
Урок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен даннымиУрок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен данными
 
Урок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметикаУрок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметика
 
Урок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединенияхУрок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединениях
 
Урок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателейУрок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателей
 
Урок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметикаУрок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметика
 
Урок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвигаУрок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвига
 
Урок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументовУрок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументов
 
Урок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаУрок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числа
 
Урок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном кодеУрок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном коде
 
Урок 5. Сборка 64-битного приложения
Урок 5. Сборка 64-битного приложенияУрок 5. Сборка 64-битного приложения
Урок 5. Сборка 64-битного приложения
 
Урок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурацииУрок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурации
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложений
 
Статический анализ Си++ кода
Статический анализ Си++ кодаСтатический анализ Си++ кода
Статический анализ Си++ кода
 
PVS-Studio научился следить за тем, как вы программируете
PVS-Studio научился следить за тем, как вы программируетеPVS-Studio научился следить за тем, как вы программируете
PVS-Studio научился следить за тем, как вы программируете
 

Как мы тестируем анализатор кода

  • 1. Как мы тестируем анализатор кода Автор: Евгений Рыжков, Павел Еремеев Дата: 05.07.2011 Аннотация В статье описаны технологии тестирования, используемые при разработке статического анализатора кода PVS-Studio. Разработчики инструмента для программистов делятся принциами тестирования собственного программного продукта, которые могут быть интересны разработчикам аналогичных пакетов обработки текстовых данных или исходных кодов. Введение Занимаясь разработкой и продвижением программного продукта PVS-Studio, мы огромное внимание уделяем вопросам качества программного обеспечения, процессам разработки и принципам организации труда программистов. При этом до сих пор закрытым оставался вопрос о том, как же собственно мы сами разрабатываем свой программный продукт? Используем ли те технологии, рекомендации и практики, о которых пишем в статьях? Наконец, относится ли к нам фраза "сапожник без сапог". В этой статье мы решили рассказать о том, как мы тестируем программный продукт PVS-Studio. С одной стороны, это делается для того, чтобы убедить наших (потенциальных) пользователей в качестве нашего инструмента. С другой стороны - рассказать об успешном опыте применения некоторых практик. PVS-Studio - это статический анализатор кода, предназначенный для разработчиков современных ресурсоемких приложений на языках Си и Си++ (более подробная информация дана в статье "Общие сведения о принципах работы с анализатором PVS-Studio" [2]). Под современными мы понимаем 64-битные и/или параллельные приложения. Разработка таких программ имеет ряд трудностей, отличных от проблем традиционных программ. Ведь помимо обычных и всем известных ошибок вроде неинициализированных указателей, которые обнаруживаются любым компилятором, есть и специфичные виды проблем. Речь идет об ошибках в программах, которые проявляются при миграции 32-битных приложений на 64-битные платформы. Или при распараллеливании кода для поддержки многопроцессорности или многоядерности. Разрабатывать такие приложения довольно сложно из-за недостатка инструментов, облегчающих создание 64-битных и параллельных программ. Анализатор PVS-Studio является именно таким инструментом. Практики тестирования, используемые при разработке PVS-Studio Разрабатывая PVS-Studio, мы используем шесть основных методики тестирования: 1. Статический анализ кода. Странно было бы разрабатывать статический анализатор и не использовать при этом статический анализ. 2. Юнит-тесты уровня классов, методов, функций.
  • 2. 3. Функциональные тесты уровня самостоятельно написанных файлов 4. Функциональные тесты уровня отдельных файлов. 5. Функциональные тесты уровня отдельных сторонних проектов и решений (projects and solutions). 6. Функциональные тесты пользовательского интерфейса расширения – надстройки, интегрируемой в среду Visual Studio. Кратко опишем здесь эти методики. Поскольку PVS-Studio - это статический анализатор кода, то при его разработке мы также используем методику статического анализа кода для поиска проблем в анализаторе. Во-первых, это нужно для того, чтобы нас не упрекнули в том, что мы не пользуемся своим продуктом. А во- вторых, это реально позволяет находить ошибки до того, как их найдут пользователи. Юнит-тесты уровня классов, методов функций позволяют нам быть уверенными в том, что добавление новой функциональности не портит имеющийся код. На этом уровне проверяются отдельные программные сущности в виде простеньких маленьких тестов. В общем, самые обычные юнит-тесты. Функциональные тесты уровня самостоятельно написанных файлов позволяют быстро проверять, что всё, что должно диагностироваться - диагностируется как и раньше. Все обнаруживаемые потенциальные проблемы в коде должны обнаруживаться. Функциональные тесты уровня отдельных файлов позволяют убедиться, что различные отдельные файлы с кодом полностью и без проблем проверяются анализатором. Под проблемами здесь понимаются срабатывающие ASSERT, неожиданные сообщения об ошибках, а также падения. Ведь анализатор кода - это такая же программа, как и другие, и падения в ее работе, увы, не редки. Функциональные тесты уровня отдельных сторонних проектов и решений позволяют убедиться в том, что анализатор все еще умеет проверять проекты, а количество диагностических сообщений от версии к версии изменяется контролируемо, а не хаотично. Функциональные тесты пользовательского интерфейса позволяют проверить работоспособность плагина – надстройки, с помощью которого анализатор интегрируется в среду Visual Studio. При этом проверке подвергаются как доступность и адекватная работа отдельных элементов интерфейса, так и ожидаемая взаимосвязь этих элементов друг с другом и с работой самого анализатора кода. Конечно же, помимо этих методик, есть и другие стандартные подходы вроде "зоркий глаз программиста" или "у нас завтра релиз, проверьте ЭТО", но они показали свои недостатки и мы стараемся их не применять. Теперь же расскажем об используемых приемах более подробно.
  • 3. Статический анализ кода, выполненный статическим анализатором кода Заголовок раздела вызывает недоумение? Кто Что же еще может выполнять статический анализ кроме статического анализатора? Однако при разработке инструментов для программистов всегда есть нюансы. Как вы наверняка знаете, первые версии компиляторов языков программирования редко пишутся сразу же на этих языках. Как правило, для разработки компилятора нового языка используется совсем другой язык, являющийся стандартом на тот момент. Это сегодня все компиляторы Си++, пишутся на Си++, а первая версия была написана на Си. Точно так же, разрабатывая первую версию статического анализатора кода, мы не могли ее проверить. Именно поэтому первая версия нашего продукта (тогда он назывался еще Viva64) вовсе не была 64-битной! Зато уже версия 1.10, которая появилась 16 января 2007 года, то есть через 17 дней после выпуска первой версии, среди нововведений содержала строку: • С помощью анализатора Viva64 мы подготовили 64-битную версию Viva64! Но пользователю не надо беспокоиться о выборе подходящей версии. Правильная версия выбирается автоматически во время установки. Таким образом, как только у нас появился статический анализатор, выявляющий проблемы 64- битного кода, так мы сразу стали проверять им наш же код. Помогает ли нам статический анализ нашего же продукта? Конечно же, да. Но опять-таки из-за нашей специфики есть нюансы. Поскольку мы сами пишем статьи про то, как надо делать 64- битный код, то 64-битных ошибок в новом коде мы все-таки не допускаем. Однако от применения статического анализа мы извлекаем пользу в плане улучшения диагностики. Например, мы можем посмотреть, какие типы синтаксических конструкций дают явно ложное срабатывание и исключить их диагностирование. Таким образом, применение статического анализа для разработки статического анализатора оказывается полезным для нас. Юнит-тесты уровня классов, методов, функций Юнит-тесты уровня классов, методов, функций представляют собой набор тестов для проверки отдельных логических элементов программы. Вот некоторые примеры функциональности, на которую у нас есть юнит-тесты: • применение тех или иных правил диагностики потенциально опасных конструкций; • вычисление типов в выражениях, в операциях приведения типов и т.п.; • работа операторов (сложение, вычитание и т.п.); • работа механизмов загрузки и предварительной обработки файлов; • проверка регистрационной информации; Естественно, этими областями наши юнит-тесты не ограничиваются, но являются показательными с точки зрения примеров. Как мы пользуемся этими юнит-тестами? При исправлении ошибки в анализаторе или при добавлении новой функциональности юнит-тесты запускаются в режиме release-сборки. Если
  • 4. тесты проходят без проблем, то тесты запускаются в режиме debug-сборки под отладчиком. Это делается для того, чтобы проверить, не срабатывают ли ASSERT, которых в коде предостаточно. Позднее будет понятно, почему сразу нельзя запускать debug-версию. Хотя такие тесты позволяют выявить ошибки, они не являются полноценным решением. Дело в том, что у нас в PVS-Studio очень мало юнит-тестов по сравнению с тем, сколько юнит-тестов нужно для проверки "почти компилятора". Поэтому достичь юнит-тестами большого покрытия в нашем случае очень сложно. Это огромная по трудозатратам задача, которую в настоящее время реализовать нет возможности. Тем не менее, юнит-тесты уровня классов, методов, функций - это первый уровень "обороны" в нашей системе тестирования. Функциональные тесты уровня самостоятельно написанных файлов При разработке анализатора кода важно не "потерять" диагностику тех потенциальных ошибок, которые уже давно обнаруживаются. Это достигается за счет функциональных тестов уровня самостоятельно написанных файлов. Абсолютно все обнаруживаемые потенциальные проблемы в виде кода собраны в отдельные файлы. Эти файлы размечены определенным образом. В тех строках, где анализатор кода должен обнаружить ошибки, стоят специальные маркерные символы. Причем в этих маркерах указано, сколько ошибок в данной строке должно быть: одна, две и т.д. Как только из-за ошибки разработчиков что-то перестает диагностироваться, мы сразу же это видим. Раньше в строке номер 17 выдавалось сообщение о двух ошибках, а теперь только об одной. Или наоборот, появились лишние сообщения. Такой подход очень похож по принципу работы на функциональные тесты уровня отдельных проектов (о которых будет сказано ниже), но отличается очень высокой скоростью работы и тем, что проверяемые файлы написаны (и размечены) самостоятельно. Кроме того, эту систему можно использовать, разумеется, и при разработке новых диагностических сообщений. Сначала надо в файлах вручную написать код, в котором будет диагностироваться новая ошибка, затем разметить его и можно приступать к реализации собственно диагностики ошибки. Пока реализации нет, система тестирования будет сообщать, что в этом месте должна быть диагностируема ошибка, но ее нет. Как только диагностика появится, тест будет проходить нормально. Функциональные тесты уровня отдельных файлов Проверка не отдельных классов/методов или вручную сделанных файлов, а файлов из реальных проектов позволяет нам добиться большего покрытия кода. Четвертым уровнем в нашей системе тестирования является именно такая проверка. В наши тесты включены отдельные полностью препроцессированные файлы из различных проектов: wxWidgets, fox-toolit, CImg, Lame, Boost, CxImage, FreeType и многих других. Также сюда входят препроцессированные файлы, построенные на основе стандартных системных заголовочных файлов (CRT, MFC и так далее). После добавления новой или исправления старой функциональности программист запускает сначала release-версию тестов, а потом debug-версию. Почему сразу не запускать debug-версию? Очень просто, Debug-версию не запускают сразу потому, что release-версия тестов работает одну минуту, а debug-версия - пять минут.
  • 5. Тестирование на уровне отдельных файлов - очень мощная вещь. Она позволяет мгновенно выявить ошибку, если в результате развития анализатора какая-то функциональность "отвалилась". Огромное количество ошибок было не допущено благодаря этим тестам. Функциональные тесты уровня отдельных сторонних проектов и решений Самая мощная часть нашей системы тестирования - это ее пятый уровень, который представляет собой проверку отдельных проектов и решений (projects and solutions). Именно благодаря этой системе каждая новая версия PVS-Studio как минимум не хуже предыдущей. Выглядит эта система следующим образом. Имеется несколько десятков проектов и решений различных доступных в интернете программ. Например: Lame, Emule, Pixie, Loki и другие. Каждый из этих проектов проверен с помощью PVS-Studio, результаты проверки (в виде log-файла) сохранены. После установки новой (разрабатываемой версии) запускается специальная разработанная нами система, которая по очереди открывает каждый проект, проверяет его с помощью PVS-Studio, сохраняет результаты, а затем сравнивает их с эталонными. Если есть отличия, то она их записывает в отдельный файл (аналог стандартного diff), который легко можно посмотреть с помощью PVS-Studio и разобраться в причине появления этих отличий. Например, в новой версии PVS-Studio появилось новое диагностическое сообщение с кодом V118. Мы запускаем систему тестирования, и она должна сообщить, что в некоторых проектах появились сообщения V118. Затем мы вручную просматриваем все изменения в результатах и решаем, правильно ли выдано сообщение V118. Если же при этом помимо появления сообщения V118 мы видим в результатах, что пропали некоторые сообщения V115, то это означает, что тесты показали недостаток текущей версии программы, и она отправляется обратно на доработку. В случае признания всех изменений справедливыми новые файлы отчетов признаются эталонными, и сравнение выполняется уже с ними. Эта система имеет и другое назначение. Поскольку продукт PVS-Studio предназначен для работы как в Visual Studio 2005, так и в Visual Studio 2008 и 2010, то мы всегда проверяем, чтобы диагностические сообщения всегда совпадали в разных версиях Visual Studio. То есть если, к примеру, мы получили во всех проектах 10 000 диагностических сообщений в Visual Studio 2005, то и в Visual Studio 2008 и 2010 мы должны получить ровно столько же сообщений. Сколько времени занимает такая проверка? На этот вопрос нет однозначного ответа, покольку база этих тестов постоянно растет за счет новых проектов. И, естественно, время работы постоянно увеличивается. Год назад, когда анализатор работал только с использованием одного ядра, тесты выполнялись около часа. Затем мы сделали возможным работу в несколько потоков, и для двухъядерной машины время работы сократилось почти вдвое. Со временем мы добавляли все новые проекты и в тесты. Теперь на той же двухъядерной машине эти тесты отрабатывают чуть больше, чем за час. Все это происходит, естественно, в release-версии.
  • 6. Функциональные тесты пользовательского интерфейса расширения – надстройки, интегрируемой в среду Visual Studio На шестом уровне находится система автоматизированного функционального тестирования пользовательского интерфейса. В связи с тем, что сам анализатор PVS-Studio представляет собой консольное приложение, он не имеет собственного пользовательского интерфейса. Однако для его работы и проверки файлов с исходным кодом требуется сбор данных о параметрах компиляции проверяемых им файлов и создание множества временных конфигурационных файлов, что, безусловно, неудобно делать вручную. Поэтому, по аналогии с компилятором Visual C++, всё это скрыто от конечного пользователя и автоматизировано с помощью плагина- надстройки для среды разработки Visual Studio. Тестирование GUI данной надстройки и происходит на 6-ом уровне нашей системы, т.е. фактически проверяется та дополнительная функциональность интерфейса среды Visual Studio, которую обеспечивает интегрированная в неё PVS-Studio. Для покрытия функциональных возможностей PVS-Studio система использует 3 тестовых набора (по одному для каждой из поддерживаемых версий Visual Studio), каждый из которых состоит из отдельных тестовых сценариев (вариантов использования). Каждый такой сценарий содержит верификацию порядка 3-5 вариантов тестирования (набор условий, определяющих, удовлетворяется ли заранее определённое требование). Каждый тестовый набор содержит одинаковый набор сценариев и одинаковые требования для каждого варианта тестирования, т.к. предполагается, что анализатор PVS-Studio должен функционировать одинаково во всех версиях Visual Studio. Система тестирования интерфейса реализована на базе встроенной системы модульного тестирования Visual Studio Team Test. (расширение для тестирования графического интерфейса появилось в Visual Studio начиная с версии 2010). Стоит отметить, что для данной системы интерфейсы Visual Studio версий 2005 и 2008 идентичны (т.е. имеют одинаковый UI Mapping и покрываются одной реализацией тестовых сценариев). Visual Studio 2010 же имеет новый интерфейс, основанный в основном на WPF элементах, и поэтому требует отдельной реализации тестов. Что дальше? Известно, что нет предела совершенству. Мы продолжаем развивать нашу систему тестов по всем направлениям. Естественно, мы постоянно увеличиваем базу всех тестов. Заключение Из данной статьи вы узнали, как мы тестируем наш статический анализатор кода PVS-Studio. Возможно, наш опыт поможет вам внедрить подобные практики тестирования в своих рабочих проектах. А мы надеемся, что прочитав о том, как мы тестируем PVS-Studio, у вас возникнет желание подробнее познакомиться с нашим инструментом. Библиографический список 1. Анализатор кода PVS-Studio. http://www.viva64.com/ru/pvs-studio/ 2. Общие сведения о принципах работы с анализатором PVS-Studio http://www.viva64.com/ru/d/0011/