Галкин. Об автоматизации моделирования программ

advertisement
УДК 681.3.06
И.М. Галкин
ОБ АВТОМАТИЗАЦИИ МОДЕЛИРОВАНИЯ ПРОГРАММ
ПРИ СТРУКТУРНОМ ТЕСТИРОВАНИИ
Обсуждаются проблемы, связанные с осуществлением статического и динамического анализа программ, в частности с построением представлений программ, необходимых для поддержки их
структурного тестирования. Обосновывается необходимость автоматизации построения данных представлений. Описывается проект создания системы, реализующей указанные функции, ее текущее состояние и перспективы развития.
Введение
Важным фактором гарантии обеспечения надежности и безопасности программ является их адекватное тестирование (процесс исследования
программ с целью обнаружения имеющихся в них ошибок). Большое внимание тестированию уделено в Общих критериях [1]. Полнота тестирования программ достигается за счет правильного сочетания методов функционального тестирования, при котором проверяется соответствие программы ее спецификации без учета внутренней структуры программ, и
структурного тестирования, при котором исследуется внутреннее строение программ.
Для проведения структурного тестирования программ необходимо
наличие специальных средств - анализаторов программ. Статические
анализаторы исследуют исходные тексты программы с целью оценки
корректности ее структуры, выявления "подозрительных" участков кода (с
аномалиями управления и использования данных), не предусмотренных
спецификациями точек входа и выхода, получения необходимых метрических характеристик. Динамические анализаторы используются для трассировки выполнения программы и оценки степени ее тестированности
(полноты покрытия тестами соответствующих элементов внутренней
структуры, например, возможных ветвей программы). Развитые системы
поддержки тестирования программ должны осуществлять и статический, и
динамический анализ программ.
Процесс реализации анализаторов программ распадается на две относительно самостоятельные задачи:
- построение соответствующих представлений исходной программы
(для каждого нового языка программирования это практически отдельная
задача);
- статический и/или динамический анализ построенных моделей
(представлений).
Представлениями программы, используемыми при структурном тестировании, являются:
- модель программы, отображающая требуемые аспекты ее внутренней структуры (например, поток управления и/или поток данных);
- инструментированная программа, семантически эквивалентная
исходной, но снабженная средствами фиксации прохождения нужных точек программы при ее выполнении.
Построение обоих видов представлений программы (другими словами, ее моделирование и инструментирование) осуществляется в процессе однопроходного чтения текста исходной программы и в принципе может проводиться на уровне лексического разбора исходной программы (в
предположении ее синтаксической корректности). Однако, во-первых,
возложение ответственности за синтаксическую правильность программ
на пользователя может привести к путанице в версиях исходного текста и,
как следствие, анализу синтаксически некорректных программ, во-вторых,
многие действия по моделированию и инструментированию программ достаточно нетривиальны, требуют рассмотрения контекста и во многих ситуациях значительно упрощаются при "знании" разбираемой языковой
конструкции. Поэтому более предпочтительным является построение требуемых представлений программы в процессе ее синтаксического разбора. Следовательно, для поддержки структурного тестирования программ
на некотором языке программирования, по сути, необходимо как минимум
разработать транслятор с данного языка программирования в требуемые
для предполагаемого вида тестирования представления программ. Достаточная сложность такой разработки, необходимость поддержки различных
языков программирования, а также различных уровней моделирования и
анализа программ обусловливают необходимость применения средств,
автоматизирующих реализацию определенных транслирующих функций
(в первую очередь синтаксического анализа).
Работы в области создания подобных средств, получивших в русскоязычной литературе название "системы (автоматизации) построения
трансляторов" (С[А]ПТ), а в англоязычной (в буквальном переводе) "генераторы (компиляторы) компиляторов", активно велись в 70-80-х гг. в эру
господства мэйн-фреймов. Достаточно высокая "наукоемкость" проблемы,
а также тогдашняя ограниченность средств поддержки разработки программ предопределили исследовательский характер большинства разработок этого периода, по крайней мере на территории бывшего СССР [2].
Несомненный теоретический интерес, в том числе с точки зрения архитектуры системы, представлял проект генератора компиляторов [3], описанный на специализированном языке XPL. Впоследствии, в эпоху персональных компьютеров, наибольшее признание получила система YACC
[4], а также некоторые ее развития, в частности система BISON [5]; из относительно недавних разработок следует отметить исследовательскую
разработку PCCTS [6], поддерживающую весьма изощренный формат
входных грамматик.
Все отмеченные выше средства являются системами общего назначения и позволяют автоматизировать ряд общих для всех трансляторов
функций, в частности синтаксический разбор программы по описанию ее
грамматики. Однако предполагаемая специализация делает более предпочтительной разработку собственного средства, естественно, с учетом привлекательных особенностей упомянутых систем.
Проект системы автоматизации моделирования программ
За основу системы автоматизации моделирования программ принята
система [7], реализованная в свое время на основании идеологии, описанной в [3], и достаточно интенсивно использовавшаяся для разработки
трансляторов с языков программирования экономического характера в
операционной среде ОС 360 для мэйн-фрэймов.
Новая версия системы реализована на языке C++ в среде C++ Builder
и функционирует в операционной среде Windows для персональных компьютеров. Архитектурно система состоит из двух компонентов:
1) транслятора с описания языка программирования в форме БэкусаНаура в соответствующие синтаксические таблицы;
2) таблично-управляемого синтаксического анализатора программ,
написанных на соответствующем языке программирования (с поддержкой
механизма, позволяющего пользователю связывать с синтаксическими
правилами выполнение требуемых действий).
Наряду с прежним механизмом поддержки действий, задаваемых
пользователем, предполагавшим связывание действий с номерами синтаксических правил, поддерживается и принятый в системе YACC механизм
поддержки действий посредством их указания непосредственно за правилами в файле, содержащем описание грамматики входного языка. Этот
механизм исключает ошибки в связывании действий и правил в случае
изменения входной грамматики. Более того, реализована поддержка
YACC-формата описания входной грамматики, что позволяет использовать имеющиеся описания грамматик для YACC без изменений.
Несколько уступая упомянутым ранее системам в гибкости, данная
система имеет и ряд несомненных достоинств: во-первых, она поддерживает другой класс грамматик (смешанного предшествования (2,1;1,1), в то
время как YACC и BISON поддерживают контекстно-свободные LALR(1)грамматики, а PCCTS - LL(1)-грамматики), а значит, в отдельных случаях
данная система может оказаться более предпочтительной; во-вторых, ее
ядро открыто для пользователя, а следовательно, при использовании
средств отладки он не окажется внутри неизвестных ему ассемблерных
модулей, как это случается при использовании, скажем, YACC; в-третьих,
данная система имеет перспективу специализации в области автоматизации моделирования программ.
Состояние и перспективы разработки
Описываемая система носит исследовательский характер, и ее развитие предполагается проводить по двум относительно независимым
направлениям:
1) как системы автоматизации построения трансляторов общего
назначения; в этом русле перспективными работами представляются реализация ряда удобных возможностей системы YACC (восстановления после ошибок, работы со "значениями" элементов синтаксических правил,
указания приоритета и ассоциативности операций), реализация поддержки
формата входных грамматик PCCTS, внутренняя модификация системы с
целью ослабления существующих ограничений на размеры обрабатываемых грамматик;
2) как средства поддержки моделирования и инструментирования
программ; в данном контексте планируется продолжать работы по автоматизации построения представлений программ и визуализации графовых
моделей, в более широком смысле данная система может быть также ориентирована на построение семантической сетевой модели программы в
рамках подхода к анализу программ, описанного в [8, 9].
Литература
1. Evaluation Criteria for Information Technology Security. - ISO/IEC
15408: 1999(E).
2. Вооглайд А.О., Серебряков В.А. Применение систем автоматизации построения трансляторов // Прикладная информатика. – М.: Финансы
и статистика, 1989. - Вып.15. – С. 72-90.
3. McKeeman W.M., Horning J.J., Wortman D.B. A compiler generator.
– Prentice-Hall, Englewood Cliffs, N.J. – 1970. – 527 p.
4. Johnson S.C. Yacc - Yet Another Compiler-Compiler. - Bell Laboratories, Murray Hill, N.J. – 1978.
5. Donnelly C., Stallman R. BISON: the YACC-compatible Parser Generator. – Free Software Foundation, Cambridge. - 1992.
6. Parr T.J., Dietz H.G., Cohen W.E. PCCTS 1.00: The Purdue Compiler
Construction Tool Set // SIGPLAN Notices. - 1992. – 27. - № 2. - Pp. 88-165.
7. Галкин И.М., Образкова Н.Л., Романов В.М. Система построения
трансляторов МАРС-СПТ // Управляющие системы и машины. - 1983. –
№ 6. - С. 68-70.
8. Галкин И.М. Использование семантических сетей для моделирования и анализа программ // Управляющие системы и машины. - 1991. № 5. - С. 55-61.
9. Galkin I.M. A Knowledge-Based Approach to Program Testing and
Analysis // Proc. of 12th International Conference on Computer Safety, Reliability and Security (SAFECOMP'93). – Pp. 207-216.
Институт технической
кибернетики НАН Беларуси,
г.Минск
<Примечание:
Статья опубликована в сборнике научных трудов ИТК НАНБ
“Комплексная защита информации” (Выпуск 3, 2000, стр. 86-89>
Download