Анализаторы кода. Часть 1

13 Апр
2012

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

CppDepend

Разработчик: CppDepend
Официальный сайт: www.cppdepend.com/
Ссылка на документацию: http://www.cppdepend.com/Documentation.aspx
Лицензия: Per Seat License / Per Build Server License. Цена меняется в зависимости от покупаемой лицензии.
Системные требования: NA

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

Пропускаем нижеследующее рекламное бла-бла и тыкаем на вкладку Documentation. В разделе Getting Started привлекает внимание третий пункт, описывающий автоматическое формирование сетки данных.

Встроенный инструмент CppDepend v1.0.0.0 умеет анализировать только vcproj, При использовании сторонних систем автоматизации сборки программного обеспечения, таких как CMake, Scons и прочих аналогов, vcproj можно сгенерировать перед работой с CppDepend. Также для описания проектов допустимо использование ProjectMaker.

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

1. Выпадающее меню:
Правый клик по элементу кода из предложенного CppDepend списка открывает контекстное меню с разными опциями. К примеру, можно поискать элемент, используемый определённой структурой (structure).

dependency1

2. Запрос CQL

dependency8

После этого можно экспортировать результат в граф зависимостей.

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

dependency5

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

dependency6

На сладкое – возможность экспортировать граф зависимостей в матрицу зависимостей.

Цена вопроса:

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

cost_cpp

Встаёт закономерный вопрос: что даст мне отчёт CppDepend? Ответ на него есть в документации. По окончании работы программа выдаёт отчёт, поделенный на несколько разделов:

● Application Metric. Дает представление о топологии приложения.
● Project Metric. Показывает размеры каждого проекта, количество строк кода и прочие метрики.
● VisualCppDepend View. Показывает размеры проектов, пространства имен, типы, а также методы и количество занимаемых ими строк.
● Project Abstractness vs. Instability. Секция наглядно иллюстрирует правила абстракции/нестабильности (Abstracness/Instability principle), описанные в секции Project Metrics.
● Project Dependencies. Показывает зависимости функций и классов проекта вашего приложения в табличном виде.
● Project Dependency Diagram. Те же данные в виде диаграммы.
● Project build Order. Раздел предлагает один из возможных порядков построения. Если в графах зависимостей ваших проектах существует цикл, эта секция отрапортует об этом.
● CQL Queries and Constraints. Секция указывает на нарушения дефолтных ограничений CQL. Кстати, встроенный инструмент VisualCppDepend позволяет создать собственные ограничения на этом языке.
● Type Metrics. Секция восстанавливает метрики типов в таблице. При этом для каждой метрики предоставляется ссылка на документацию.

Предложенные на официальном сайте case studies описывают работу в основном с библиотеками и средами с открытым исходным кодом, включая (на названиях висят ссылки на соответствующие страницы в Википедии) коллекцию библиотек POCO, движок для графического рендеринга Ogre3D, графический моторчик Irlicht, библиотека для финансистов Quantlib и модуль QtQore. Единственной «белой вороной» в списке open-source элементов виляет задницей вездесущий Microsoft со своей библиотекой на C++ MFC (Microsoft Foundation Classes).

Yasca

Разработчик: Michael V. Scovetta
Лицензия: BSD license.
Ссылка на документацию: http://www.scovetta.com/yasca/documentation.html
Системные требования:
Microsoft Windows 2000 или более поздние версии
Java JRE (или JDK) v1.4 или позднее (требуется для PMD)
512 MB RAM (рекомендуется 1GB или больше)

Тула от частного разработчика Майкла В. Сковетты (Michael V. Scovetta). На страницах документации девелопер сообщает, что анализатор совмещает в себе функции уже существующих аналогов с открытым исходным кодом, но и имеет некоторые нововведения, не выявленные лично им при использовании похожих программ.

Инструментарий не требует установки, большинство его компонентов включено в минимальный распространяемый пакет PHP v5.2.5. Также для любителей кастомайза Windows предусмотрена интеграция команды открытия папки или файла в Yasca в контекстное меню Проводника (подробнее об этом читайте в разделе 2.1.2 Shell installation документации).

Yasca управляется как из командной строки, так и с помощью GUI под Windows, начиная с версии 2000. Если верить документации, первый вариант даёт даже больший функционал по сравнению с привычными обывателям иконками «Окошек».

Инструмент представляет собой набор плагинов и обработчиков отчетов, скреплённых движком. Соответственно, функционал расширяется путём изготовления этих самых плагинов и прикрутки их к моторчику. В свою очередь, плагины могут служить для сканирования определенных типов файлов и анализа отдельных характеристик проектов, таких как защита, производительность или сложность. «На завтрак» в Yasca изначально включено несколько плагинов. Подробнее о них читайте а разделе 3 Plugins документации.

При анализе программа опирается на принципы контроля качества (QA Testing) и нацелена на выявление «узких мест» сканируемого проекта. При этом, инструментарий служит не для «латания дыр», а для выявления «медленно тухнущих фруктов», то есть неэффективных кусков кода, которые «завоняют» ближе к концу разработки и потребуют серьёзных изменений в работе команды вплоть до переписывания солидной части кода.

Yasca умеет сканировать код, написанный в Java, C/C++, HTML, JavaScript, ASP, ColdFusion, PHP, COBOL, .NET и других языках, а также интегрируется со сторонним софтом схожей направленности, включая:
■ FindBugs
■ PMD
■ JLint
■ JavaScript Lint
■ PHPLint
■ CppCheck
■ ClamAV
■ RATS
■ Pixy

Пора делать выводы. Думаю, первая и самая главная разница между двумя инструментами — их цена. Yasca бесплатна и имеет открытый исходный код. Многим после этого читать сравнение будет неинтересно, и я вас понимаю. Второе ощутимое различие — охват языков. CppDepend переваривает только C/C++, в то время как Yasca заслуживает звания многостаночника. Пользователю на блюдечке — поддержка «туевой хучи» языков, интеграция со сторонними программами, расширение функционала за счёт плагинов. Не удивлюсь, если вскоре в программе появится Сапер, Солитер и т.д с шильдиком “open-source”. Поддержка всего и вся — это конечно хорошо, но за двумя зайцами… вобщем вы поняли. Учитывая бесплатность программы в сочетании с её многофункциональностью, логично предположить, что качество устроит лишь тех, кому этот анализ, как в жо… короче для фана. На это косвенно указывает и сам разработчик на главной странице программы.

Официальный сайт CppDepend, напротив, говорит об ориентации инструментария на организации. Об этом кричит всё, начиная от завлекающего бла-бла на главной странице и заканчивая ценовой политикой. Ограниченность лишь анализом C/C++ вкупе с платностью – непрямой, но показательный признак более высокого качества исполнения. К тому же, результат анализа CppDepend более многогранен по сравнению с Yasca. Разумеется, в последнем случае проблема решается прикручиванием нужного плагина, но это лишние затраты времени и сил, которые не каждый может себе позволить. Да и поддержка программы только её разработчиками без участия сторонних девелоперов, как в случае с open-source, идёт на руку CppDepend.

Вывод прост, как детские трусы. Если вы — организация, и от результатов анализа зависит срок и качество работы и, как следствие, её стоимость, окупаемость и еще кипа показателей в пухлом бизнес-плане, то выбор CppDepend очевиден. Yasca же подойдёт поклонникам open-source, для которых это, прежде всего, повод написать интересного для личного использования и на суд общественности.

Источники:

Документация:

CppDepend
Yasca

Из Википедии:

POCO
Ogre3D
Irrlicht Engine
Quantlib
Qore
Microsoft Foundation Class Library
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх