13.07.2015 Views

Презентация

Презентация

Презентация

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Прототипы построителей промежуточныхпредставлений исходных текстов программ,основанные на компиляторах с открытымисходным кодомА.Н.Пустыгин, Б.А.Тарелкин, А.А.Ковалевский, Е.А.Огуречникова,А.В. Десинов, Н.А. Ошнуров, Е.В.Старцев, М.В. Зубов


Способы анализа качества ПО• Динамический - проверка кода в процессе егоисполненияo Отладчики для наблюдения за состояниемпрограммной системы после её запускаo Профайлеры для анализа производительностии потребления памяти под нагрузкойo Фазеры для тестирования для всех возможныхсочетаний входных данных• Статический анализ - проверка исходных текстовПО без его компиляции и исполнения


Достоинства статического анализа• Не требует подготовленных или генерируемыхвходных данных, специально созданногоокружения• Допускает кросс-системный анализ программ,независимо от целевой программной иаппаратной платформы• Не зависит от частоты появления событий,влияющих на функционирование ПО• Не требует затрат ресурсов целевойплатформы(программно-аппаратных стендов)


Недостатки статического анализа• Требует обработки больших массивов символьнойинформации• С увеличением объема исходных текстов времяанализа может расти быстрее,чем растет объем• Неизбежно использование упрощенных моделей, чтоухудшает качество анализа• Не все ошибки могут быть обнаружены,одновременно происходят “ложные срабатывания”


Направления использованиестатического анализа• для поиска ошибок• для верификации программного обеспечения• для проверки соответствия исходного текста стандартамразработки– MISRA C/C++. стандарт разработки приложений длявстроенных систем. поддерживается рядом статическиханализаторов (в основном проприетарных).– JSF++. Для C++,стандарт безопасности объектноориентированныхприложений.– ISO 26262 - стандарт функциональной безопасности дляавтомобильных электрических/электронных систем.( совместим с IEC 61508)


Существующие методы статическогоанализа ПО• Анализ текста вручную (неэффективен в силубольших человеческих затрат, однако, даетнаиболее точный результат)• Машинная обработка текста без формированиявспомогательных данных (имеет оченьограниченное применение)• Обработка с использованием промежуточныхпредставлений (машинное эквивалентноепредставление кода)


Выполнение статического анализа безпостроения промежуточного представления(текстовые методы обработки)• Методы обработки: поиск по регулярнымвыражениям и поиск шаблонов типовыхконструкций• Достоинство - большая эффективность наопределенном круге задач, например, припостроении различных метрик• Недостаток следует из достоинства — узкий кругзадач, потому что таким методом невозможнопроанализировать ни структуру кода, ни темболее семантику. Такой анализ не может датьникакого представления о поведении программыпри исполнении


Использование промежуточныхпредставленийПромежуточное представление - набор данных,создаваемый анализатором, на основе которыхвыполяется анализ– Промежуточное представление эквивалентноисходному коду по заданному критерию– Часто промежуточные представления являютсятиповыми внутренними наборами данных, длякоторых известны эффективные алгоритмыобработки


Абстрактное синтаксическое деревоAST• Самое распространенное представление, какнаиболее изученное в области компиляции.• Компиляторы имеют под собой достаточнуютеоретическую и научную базу, а также постоянноразвиваются. Это облегчает использование AST встатическом анализе• При построении дерева для большого проектацеликом большой объем промежуточногопредставление затрудняет операции с AST


Пример исходного текста C дляиллюстрации промежуточныхпредставленийint func (int a, int b){1: int c=2;2: if (a>b) {3: c++;4: }5: else {6: c--;7: }8: return c;}


Абстрактное синтаксическое дереводля примера исходного текста C


Список существующих инструментовстатического анализа, использующихAST• Используется в подавляющем большинствеанализаторов:o Checkstyle (на основе ANTLR)o Compass/ROSE (на основе собственнойинфраструктуры компилятора ROSE)o PyLint (на основе отдельного проекта logilabastng)o DMS Software Reengineering Toolkit (позволяетгенерировать AST для огромного количествавходных языков от языков описанияаппаратуры до языков программирования)


Промежуточное представление вреляционной формеКаждый элемент грамматики языка исходноготекста представляется в виде реляционногоотношения. Отношения отражаются вреляционной базе данных. За счет возможностисоздания связей по ключам и ограниченийреализуются взаимосвязи элементов грамматики.• Реляционное представление вовсе неформируется напрямую из кода. Сначала по кодуполучается AST, а уже потом по нему заполняетсяБД.• Основной современный проект - SemmleCode,разработка при поддержке Оксфордскогоуниверситета


Реляционное промежуточноепредставления для примера исходноготекста C - структура БД


Реляционное промежуточное представления дляпримера исходного текста C — содержимоетаблиц БД


Характеристика реляционногопромежуточного представления• Большая избыточность, что свойственно всембазам данных.• Может достигать весьма существенных объемовна больших проектах.• Очень удобно при больших объемах, так какполучение данных об узлах кода сводится квыполнению запросов.• Для человека крайне неудобно, так как будетручная корректировка и анализ БД неприемлем.• Требует индивидуального проектирования БД(таблиц, индексов, ключей) для каждойграмматики,что увеличивает затраты на егополучение.


Автоматное промежуточноепредставление• Предназначено для анализ потока управления ПОДля каждой из функций программы с состояниями связываютсяуправляющие точки программы, а с переходами - операции.• Для верификации из автомата строятся абстрактные деревьядостижимости (ART), объединяющие переходы междусостояниями различных автоматов для функций (при вызовеодной из другой), а также связывающие с этими состояниямилогические предикаты, описывающие с определенной долейабстракции состояние переменных.– Пример - инструмент BLAST, который строит и используетавтомат потока управления (control-flow automat).


Автоматное промежуточноепредставление для примераисходного текста С


Свойства автоматногопромежуточного представления- Позволяет выполнять генерацию тестовыхнаборов данных (test-case), обеспечивающихпопадание во все возможные состояния функций(вернее их CFA).– Деревья ART строятся итерационно -counterexample-guided abstraction refinement(алгоритм уточнения абстракции по контрпримерам)(CEGAR)– В связи с этим завершение генерации негарантируется - это во многом зависит отконкретного случая. Зачастую, в связи сограниченностью ресурсов.


Универсальные промежуточныепредставления• Универсальные промежуточные представления предназначены дляпостроения из текстов нескольких входных языковo Пригодны для представления нескольких входных языков. Впредставлении выделяются общие для них особенностиo Позволяют сэкономить на затратах при анализеo Не могут учесть особенности и специфичные конструкции дляконкретных языков• Частные представления используются для конкретных языковo Позволяют учесть тонкости программирования на целевом языке,которые могут быть уникальными для негоo Ведут к большим затратам, в связи с необходимостью иметь длякаждого языка свое представление


Частные промежуточныепредставления


Универсальные промежуточныепредставления


Универсальные промежуточныепредставления исходного текста• Разделение фазы формирования представления(модели) и анализа этой модели сейчас слаборазвито.• Эту задачу решает универсальное представление,так как оно позволяет применить однопредставление для нескольких языков.• Благодаря этому, например, для 10 входныхязыков и 10 типовых целей анализа, приреализации всех 10 целей для всех 10 языковпотребуется разработать 20 инструментов, а не100 (при условие наличия единого универсальногопредставления для всех 10 типов анализа и 10языков)


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


Применение многоуровнегопромежуточного представления всуществующих программныхинструментах• Bauhaus project - разработка университетов Штутгарта иБремена. Для Ada, C, C++, C#, и Java.• Используются два представления - InterMediateLanguage (IML) и Resource flow graphs (RFG).• IML является низкоуровневым представлением,содержащим информацию на синтаксическом исемантическом уровнях (описание конструкций языка).• RFG представляет информацию о глобальных иархитектурных аспектах анализируемой системы. Этограф, включающий такие узлы как компоненты, файлы имодули.


Прототип построителя промежуточногопредставления для исходных текстов С/С++Использует одноуровневое промежуточное представление в форметекстовой нотацииРассмотрены возможные варианты получения промежуточногопредставления с помощью готовых инструментов.1. Открытая библиотека VivaCore для работы с исходным текстом С и С++2. front-end GCCXML для компилятора GCC — свободный, с открытымисходным кодом парсер для C++3. front-end GASTA для компилятора GCC —свободный с открытымисходным кодом анализатор синтаксического дерева разбора компилятораGCC.


Недостатки вариантов полученияпромежуточного представления спомощью готовых инструментов1. front-end GCCXML и GASTA возвращает AST толькона уровне объявления операндов языка; будутотсутствовать описание содержимого тела функций,операторов ветвления, циклов и других конструкций.2. Библиотека VivaCore поддерживает стандарт языкапрограммирования C\C++ лишь частично, в пределахтекущей реализации модулей лексического играмматического анализа библиотеки.


Внешний модуль (plug-in) для компилятора GCCС версии GCC 4.5 за счет подключения динамических библиотек ккомпилятору во время выполнения. Интерфейс путем подписки насобытия, происходящие в процессе компиляции, которые определены вGCC-plugin.h.enum plugin_event{PLUGIN_PASS_MANAGER_SETUP,manager. */PLUGIN_FINISH_TYPE,type. */PLUGIN_FINISH_UNIT,processing. */PLUGIN_PRE_GENERICIZE,AST in C and C++ frontends. */*/PLUGIN_FINISH,PLUGIN_INFO,plugin. */PLUGIN_GGC_START,Garbage Collection. */*/PLUGIN_GGC_MARKING,/* To hook into pass/* After finishing parsing a/* Useful for summary/* Allows to see low level/* Called before GCC exits./* Information about the/* Called at start of GCC/* Extend the GGC marking.PLUGIN_GGC_END, /* Called at end of GGC. */PLUGIN_REGISTER_GGC_ROOTS,root table. */PLUGIN_REGISTER_GGC_CACHES,cache table. */PLUGIN_ATTRIBUTES,registration */PLUGIN_START_UNIT,a translation unit. */PLUGIN_PRAGMAS,registration. *//* Register an extra GGC/* Register an extra GGC/* Called during attribute/* Called before processing/* Called during pragma/* Called before first pass from all_passes. */PLUGIN_ALL_PASSES_START,/* Called after last pass fromall_passes. */PLUGIN_ALL_PASSES_END,/* Called before first ipa pass. */PLUGIN_ALL_IPA_PASSES_START,/* Called after last ipa pass. */PLUGIN_ALL_IPA_PASSES_END,/* Allows to override pass gatedecision for current_pass. */PLUGIN_OVERRIDE_GATE,/* Called before executing a pass. */PLUGIN_PASS_EXECUTION,/* Called before executing subpasses ofa GIMPLE_PASS inexecute_ipa_pass_list. */PLUGIN_EARLY_GIMPLE_PASSES_START,/* Called after executing subpasses ofa GIMPLE_PASS inexecute_ipa_pass_list. */PLUGIN_EARLY_GIMPLE_PASSES_END,/* Called when a pass is firstinstantiated. */PLUGIN_NEW_PASS,PLUGIN_EVENT_FIRST_DYNAMICevent used for indexing callback*//* Dummyarray.


Прототип функции инициализацииплагинаПлагин должен экспортировать функцию инициализации и определитьглобальную переменную plugin_is_GPL_compatible, которая показывает, чтоплагин был лицензирован под GPL – совместимой лицензией. Без даннойпеременной подключение плагина к GCC невозможно .Прототип функции инициализации:#include "plugin-version.h". . .{}int plugin_init (struct plugin_name_args *plugin_info,. . .struct plugin_gcc_version *version)


Модули информации вызова плагинаФункция plugin_init вызывается сразу после загрузки плагина. Она нужна для регистрациивсех обратных вызовов, требуемых плагином. Она вызывается из процедуры compile_fileдо вызова парсера. Аргументы plugin_init - Plugin_info – модули информации вызоваplugin_info - структураstruct plugin_name_args {Version – версия GCCchar *base_name; /* Short name of the plugin (filename without .so suffix). */const char *full_name; /* Path to the plugin as specified with -fplugin=. */int argc; /* Number of arguments specified with -fplugin-arg-.... */struct plugin_argument *argv; /* Array of ARGC key-value pairs. */const char *version; /* Version string provided by plugin. */const char *help;}plugin. *//* Help string provided by


Компиляция и компоновка plug-inКомпиляция плагина осуществляется с помощью ключакомпиляции:$gcc -I`gcc -print-file-name=plugin`/include-fPIC -shared -O2 plugin.c -o plugin.soпосле компиляции получается динамическую библиотеку .so. Вдальнейшем плагин загружается компилятором. Дляподключения плагина к компилятору используется следующийключ компиляции:$gcc -fplugin=/path/to/name.so -fplugin-argname-key1[=value1]


Пример исходного текста С/С++для получения промежуточногопредставления1. bool comparison(int a, int b)2. {3. bool result;4.5. if (a < b)6. result = true;7. else8. result = false;9.10. return result;11. }


Промежуточное представлениеисходного С текста в текстовой нотацииfunction_decl ::comparison type: function_type at test.cpp:1decl_argumentsparm_decl ::comparison::a type:integer_type at test.cpp:1parm_decl ::comparison::b type:integer_type at test.cpp:1function_bodybind_expr at test.cpp:10statement_listdecl_exprvar_decl ::comparison::resulttype: boolean_type at test.cpp:3if_stmt at test.cpp:5if_condlt_exprparm_decl ::comparison::atype: integer_type at test.cpp:1parm_decl ::comparison::btype: integer_type at test.cpp:1test.cpp:6then_clausecleanup_point_expr atexpr_stmt at test.cpp:6convert_exprmodify_exprvar_decl::comparison::result type: boolean_type at test.cpp:3else_clauseinteger_cstcleanup_point_expr at test.cpp:8expr_stmt at test.cpp:8convert_exprmodify_exprvar_decl::comparison::result type: boolean_type at test.cpp:3integer_cstreturn_expr at test.cpp:10init_exprresult_decl ::comparison::type: boolean_type at test.cpp:1var_decl ::comparison::result type:boolean_type at test.cpp:3function_decl ::comparison type: function_type attest.cpp:1


Пример исходного текста на ЯВУPythonclass NextClass:def printer(self, text):self.message = textprint self.message


Промежуточное представление, построенноес помощью утилититы logilab-python• Module(simple)• body = [• Class(NextClass)• bases = [• ]• body = [• Function(printer)• decorators =• args =• Arguments()• args = [• AssName(self)• AssName(text)• ]• defaults = [• ]•• body = [• Assign()• targets = [• AssAttr(message)• expr =• Name(self)• ]• value =• Name(text)• Print()• dest =• values = [• Getattr(message)• expr =• Name(self)• ]• ]• ]


Промежуточное xml-представление AST,полученное с помощью препарата Jython


Спасибо за внимание

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!