SourceAnalyzer

Материал из ALL
Перейти к: навигация, поиск
SourceAnalyzer
Тип

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

Разработчик

лаборатория BiPro

Написана на

С++

Операционная система

Кроссплатформенное

Языки интерфейса

английский

Последняя версия

2.2.1 (26 апреля 2010 года)

Лицензия

GNU GPL v3

Сайт

http://afsoft.ru/sa/

SourceAnalyzer (кратко SA) — статический анализатор кода, предназначенный для поиска и анализа зависимости функций (графа вызовов). Анализатор работает с препроцессированным кодом и представляет собой набор инструментов (бинарных файлов). Разработан графический интерфейс (QSAGUI) для визуализации графа вызовов. SA может быть полезен архитекторам ПО, программистам и тестировщикам. Основной отличительной особенностью данного статического анализатора кода является возможность быстро обработать большие объемы исходного кода (>1GB). Благодаря принципу, аналогичному раздельной компиляции, SourceAnalyzer требует не полного перестроения графа вызовов, а лишь части, в которой произошли изменения. SourceAnalyzer, являясь набором консольных инструментов, может быть легко встроен в любую автоматизированную систему.

История разработки

SourceAnalyzer является разработкой студенческой учебно-исследовательской лаборатории прикладного и системного программирования лаборатории BiPro. Работа над проектом началась в феврале 2008 года, за это время было выпущено 2 версии. SourceAnalyzer представлявший в начале из себя монолитное приложение разделился на части, каждая из которых отвечает за свою задачу (парсинг, линковка, поиск родительских и дочерних функций и т. д.). Отдельные инструменты продукта можно объединить в три группы: собственно анализаторы (далее парсеры), инструменты для работы с уже имеющимся графом и инструменты для формирования вывода графа вызовов в удобном формате. Главные из них это парсеры, которые и получают необходимую информацию о функциях, вызовах и т. д. Во второй версии для создания как лексического, так и синтаксического анализаторов использовались сторонние инструменты. Это flex и bison, генераторы парсеров. Для них были написаны собственные грамматики, которые выбирали из кода только то, что нужно.

Поддерживаемые языки

  • ANSI C (на вход анализатора подаются препроцессированные исходники)
  • Fortran90
  • Assembler (синтаксис Intel, синтаксис AT&T)

Функционал

  • Разбор исходного кода и построение графа вызовов функций в нескольких форматах:
    • Внутренний — удобный для работы программы
    • Текстовый — предназначенный для изучения графа вызова человеком в текстовом редакторе
    • Графический — визуализация графа вызовов посредством использования языка «dot» и представления в формате SVG
  • Поиск дочерних (функции вызываемые в данной, а также рекурсивно в них) и родительских(функции вызывающую данную, , а также рекурсивно их) функций.
  • Объединение графов вызовов функций получаемых при «раздельной компиляции» отдельных файлов с исходниками (линковка).
  • Обновление графов вызовов функций.

Применение

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

  • Построение графа вызовов функций
  • Анализ межмодульных зависимостей

См. также