6. Гуров В. С., Мазин М. А., Шалыто А. А. UniMod - программный пакет для разработки объектно-ориентированных приложений на основе автоматного подхода // Труды XI Всероссийской научно-методической конференции "Телематика-2004". - 2004. -Т.1 - Режим доступа^йрУЛтлГшо.ги.
7. Эспозито Д. Cutting Edge: Windows Workflow Foundation // MSDN Magazine. - 2006. - № 5.
УДК 004.4'242
МЕТОД АВТОМАТИЧЕСКОЙ ДИНАМИЧЕСКОЙ ВЕРИФИКАЦИИ
АВТОМАТНЫХ ПРОГРАММ
О.Г. Степанов
(Санкт-Петербургский государственный университет информационных технологий, механики и оптики)
В настоящей работе предлагается метод автоматической динамической верификации систем автоматов Мили, основанный на обходе альтернирующих автоматов. Описывается структура метода, правила построения протоколов и спецификации, а также выполняется анализ функциональных характеристик метода на основе разработанной реализации.
Ключевые слова: динамическая верификация, автоматное программирование
Введение
Актуальной является задача верификации программ - проверки их соответствия заданным свойствам [1]. Существует два подхода к верификации - статическая и динамическая [1]. Наиболее распространена статическая верификация на основе метода Model Checking - проверки свойств программ на их моделях. При использовании этого метода верифицируемую программу требуется представить в специальной форме - в виде модели Крипке, описывающей возможные изменения вычислительных состояний программы [1]. С этой моделью связана и основная проблема метода Model Checking -экспоненциальный рост размера модели Крипке при линейном росте размера программы. Эта проблема получила название «экспоненциальный взрыв».
Другой подход - это динамическая верификация, при использовании которой протоколы выполнения программы проверяются на соответствие заданной спецификации. Эта разновидность верификации применяется для проверки поведения программы во время выполнения, например, при отсутствии доступа к коду программы или при исследовании правильности взаимодействия со сторонними компонентами. Хотя верификация протокола конкретного запуска программы не может гарантировать выполнения заданных свойств при любых значениях входных параметров, при правильном подборе тестовых сценариев ее результаты могут оказаться достаточно точными. При этом трудоемкость динамической верификации не зависит от сложности верифицируемой программы, а только лишь от сложности проверяемой спецификации и размера протоколов.
Для верификации автоматных программ в настоящее время наиболее широко используемым является метод Model checking [2]. Однако исследования показали, что текущие реализации этого метода позволяют верифицировать лишь программы с небольшим числом автоматов, так как их число определяет размер состояния программы. Следовательно, размер модели Крипке системы автоматов экспоненциально зависит от числа автоматов в системе [2]. Динамическая верификация автоматных программ в настоящее время практически не изучена.
В настоящей работе предлагается метод динамической верификации автоматных программ, основанный на общем методе динамической верификации [3]. Этот метод основан на обходе альтернирующих автоматов, что позволяет верифицировать протоколы программ с трудоемкостью, линейно зависящей от размера протокола и числа подформул в спецификации.
Значительным ограничением динамической верификации программ является ненадежность этого подхода к верификации систем параллельных программ, так как последовательность передачи управления между программами может значительно изменяться от запуска к запуску. В данной работе рассматриваются системы автоматов Мили, в которых события обрабатываются по очереди. Это делает метод динамической верификации применимым для таких систем.
В первом разделе описывается существующий метод динамической верификации программ, а во втором - разработанный автором метод динамической верификации автоматных программ. При этом приводится структура метода, описываются схема построения протокола и выразительные возможности спецификации. В третьем разделе излагаются функциональные особенности и характеристики предложенного метода.
Динамическая верификация программ с использованием альтернирующих автоматов
Для методов как статической, так и динамической верификации в качестве языка спецификации используются языки темпоральной логики. Наиболее распространенными их них являются язык линейной темпоральной логики (LTL) и язык логики ветвящихся вычислений (CTL). Одним из наиболее распространенных языков темпоральной логики является LTL. Формулы этого языка построены на множестве атомарных высказываний (Prop) и замкнуты через применение булевых операторов, унарного темпорального оператора N («на следующем шаге») и бинарного темпорального оператора U («до тех пор, как») [4].
Моделью для LTL-формул является вычисление - функция п : ш ^ 2Prop , которая задает значения истинности высказываний из множества Prop в каждый момент времени, задаваемый натуральным числом. Вычисление п в момент времени i е ш удовлетворяет LTL-формуле ф (обозначается п, i > ф ) при выполнении следующих условий:
• п,i > p для p е Prop о p е n(i).
• n,i > ^луо (n,i > £ л n,i > у) .
9
• n,i > £vyo (n,i > £vn,i > у) .
9
• n,i > фоп^ > ф .
9
• n,i > ^ о n,i +1 > ф .
9
• n,i > £Uy о 3j > i: п, j > у,Vk : i < k < j : п,к > £
Говорят, что п удовлетворяет формуле ф (обозначается п > ф ), если и только если п,1 > ф.
Вычисление п является бесконечным словом на алфавите Prop. Таким образом, каждой LTL-формуле ф соответствует множество бесконечных слов, удовлетворяющих этой формуле. Это множество называется языком формулы ф и обозначается L(p).
Отметим, что для верификации спецификаций, заданных в виде LTL-формул на протоколах, требуется расширить определение LTL на конечные вычисления, в которых п задано на отрезке [1, п]. Это сделано в работе [3].
Для данного множества X определим В+(Х) как множество положительных булевых формул над X (булевых формул, построенных из элементов X, которые соединены операторами V и л) и формул истина и ложь.
Альтернирующим автоматом Бюхи называется набор А = (е,£,^0 ,р,Г) [5], где Е - непустой конечный алфавит, £ - непустое конечное множество состояний, ^0 е £ -начальное состояние, Г - множество принимающих состояний, а р : £ х Е ^ В+(£) -функция перехода.
Запуском альтернирующего автомата Бюхи на бесконечном слове ш = {оа,...}
называется £-помеченное дерево г такое, что его корень помечен значением ^0 и справедливо следующее: если вершина дерева х глубиной г помечена значением ^ и р(я,аг) = 9 , то эта вершина имеет к детей х1,х2...хк, где к < |£|, и множество их пометок {г(х\),г(Х2),...г(Хк)} обращает формулу 9 в истину. Запуск называется принимающим, если на каждой его ветви принимающие состояния или переход р( s, аг-) = истина
встречаются бесконечно часто. Таким образом, каждому альтернирующему автомату А соответствует множество бесконечных слов, для которых существует принимающий запуск. Это множество называется языком автомата А и обозначается Ь(А).
Можно построить аналог альтернирующего автомата Бюхи для конечных слов. Такой автомат будет называться альтернирующим автоматом.
В работе [6] показано, что для любой £ТХ-формулы ф можно построить альтернирующий автомат Бюхи А такой, что Ь(А)=Ь(ф), причем число состояний автомата А линейно зависит от размера формулы ф.
Таким образом, для верификации соответствия протокола работы программы спецификации, заданной в виде £ТХ-формулы, достаточно по этой спецификации построить альтернирующий автомат и проверить, является ли данный протокол элементом языка полученного автомата. В работе [3] предложены три алгоритма построения принимающего запуска для данных альтернирующего автомата и протокола.
Первый алгоритм (обход в глубину) пытается построить принимающий запуск, обходя альтернирующий автомат рекурсивно в глубину из начального состояния. Этот алгоритм наиболее прост в реализации, но часто требует обхода протокола несколько
раз. Например, для спецификации вида СГф (где Бф = истина и ф и Gф = Гф) «хвост» протокола будет повторно проанализирован на каждом шаге. Таким образом, для длинных протоколов алгоритм обхода в глубину работает неприемлемо медленно.
Второй алгоритм (обход в ширину) обходит автомат в ширину, поддерживая на каждом шаге все возможные комбинации записей протокола, которые могут являться элементами принимающего запуска в данный момент. Алгоритм обхода в глубину анализирует протокол лишь однажды, но вычислительное состояние алгоритма имеет размер, экспоненциально зависящий от размера спецификации. Для небольших формул множества состояний, допустимых в данный момент, невелики, но с ростом сложности формул размер этих множеств может представлять проблему. Экспоненциальный рост вычислительного состояния алгоритма вызван индетерминизмом формулы. Эту проблему можно решить, анализируя протокол от «хвоста к голове» [7].
Третий из предложенных в работе [3] алгоритмов, алгоритм обратного обхода, похож на обход в глубину, но вместо рекурсивных вызовов использует уже вычисленное для «хвоста» протокола состояние. На каждом шаге алгоритм поддерживает набор состояний альтернирующего автомата, допускаемых просмотренным «хвостом» протокола.
В следующей части статьи предлагается метод динамической верификации автоматных программ, основанный на описанном подходе. Также проанализирована эффективность работы описанных трех алгоритмов для динамической верификации автоматных программ.
Метод динамической верификации автоматных программ
В настоящее время для верификации программ, заданных в виде системы автоматов Мили, в основном используется статическая верификация - метод Model Checking. Однако существующие реализации этого метода позволяют верифицировать лишь относительно несложные системы автоматов (сотни состояний во всей системе) [2]. В этом разделе предлагается метод динамической верификации систем автоматов Мили. Этот метод включает в себя алгоритм построения протокола выполнения автоматной системы, а также семантику и правила вычисления значений предикатов, используемых при записи спецификаций.
Дадим краткое описание системы автоматов. Имеется набор конечных детерминированных автоматов Мили [8] с несколькими выходными воздействиями на ребрах. Для автомата задается набор событий, с которыми он может вызываться. Для каждого события определяется, может ли это событие поступать от источника событий или только от автомата.
Каждый переход может содержать:
• событие, при котором он происходит;
• условие, при котором он происходит. В условии в качестве атомарных утверждений можно использовать входные переменные xi,x2,...,xk и выражения вида si,j (оно истинно, если автомат Ai находится в состоянии sij);
• последовательность действий. Она может содержать выходные воздействия zi и передачу управления другим автоматам Ai(ej).
События обрабатываются последовательно - одно событие за один раз. В качестве входных переменных используются булевы переменные или состояния другого автомата. Переменные других типов необходимо преобразовывать в булевы.
На рис. 1 изображен пример простой системы автоматов Мили, которая может использоваться для управления грузовым лифтом. Автомат A1 моделирует поведения лифта (si - «Ожидание, двери закрыты», s2 - «Движение», s3 - «Ожидание, двери открыты»). Автомат A2 моделирует лампу в кабине лифта (si - «Свет выключен», s2-«Свет включен»). Когда автомат A1 получает событие e1 («Вызов»), он переходит в состояние s2, в котором он ожидает событие e2 («Прибытие»). При получении этого события в автомате Ai осуществляется переход в состояние s3 и вызывается автомат A2 c событием e3, включая тем самым свет. При получении события e4 («Двери закрыты») автомат Ai пересылает это событие автомату A2, который в ответ выключает свет. Конечно, это довольно простой пример, но он иллюстрирует взаимодействие основных компонентов автоматной системы.
Опишем метод динамической верификации такой системы автоматов. Он состоит из следующих простых шагов:
• запись отрицания верифицируемой спецификации в виде ZZL-формул. Это преобразование производится вручную в соответствии с рекомендациями, изложенными в работе [9];
• автоматическое построение по полученным формулам альтернирующего автомата;
• запуск системы автоматов и автоматическое построение протокола ее работы;
• автоматический обход альтернирующего автомата в соответствии с полученным протоколом с помощью одного из алгоритмов, описанных в предыдущем разделе;
• автоматическое построение контрпримера в модели при обнаружении нарушения спецификации.
Заметим, что все шаги метода, кроме первого, выполняются автоматически, а первый шаг в том или ином виде присутствует во всех подходах к верификации автоматов по методу Model Checking. Таким образом, предлагаемый метод не увеличивает объем ручной работы по сравнению с другими существующими автоматическими методами.
Рис. 1. Диаграммы состояний автоматов системы управления лифтом
В качестве примера приведем верификацию описанной выше автоматной системы управления лифтом. В качестве спецификации выберем условие «через некоторое время после вызова у лифта открываются двери». Для верификации системы автоматов Мили с использованием метода динамической верификации требуется определить:
• набор атомарных предикатов, которые разрешено использовать в £ТХ-формулах спецификации;
• способ построения протокола выполнения автомата;
• правила вычисления значений атомарных предикатов в записях протокола.
Начнем с описания набора предикатов, на которых можно основывать спецификации. Обработка одного события системой автоматов состоит из следующих шагов [2]:
• получение события;
• вычисление условий на переходах из текущего состояния;
• выполнение действий на переходе. При выполнении вызова другого автомата управление передается этому автомату с соответствующим событием, вызванный автомат совершает переход по этому событию и затем возвращает управление вызвавшему автомату;
• переход в новое состояние.
В соответствии с это схемой необходимо предоставить возможность установить факт совершения того или иного этапа обработки события. Таким образом, достаточным представляется следующий набор базовых предикатов:
• ег] - автомат Аг обрабатывает событие е];
• хг - при обработке текущего события значение входной переменной хг истинно;
• 21 - выполняется выходное воздействие 2г;
• - Аг находится в состоянии ^г].
Предложенный набор атомарных предикатов покрывает описательные возможности, предложенные в работе [2].
Попробуем перевести спецификацию для системы управления лифтом («через некоторое время после вызова у лифта открываются двери») на язык формул, использующих предложенные предикаты. Она будет записана как е1,1 ^ Б s1,3.
Далее определим структуру протокола, позволяющую однозначно вычислять значения предложенных атомарных предикатов в каждой записи. Эту структуру будем основывать на разбиении работы системы автоматов на промежуточные состояния, данной в работе [2]. Протоколом является некоторое конечное слово над конечным алфавитом. В предложенном методе алфавитом протокола системы автоматов Мили из п
автоматов (по 8г
=1 состояний в каждом) с т событиями, к входными переменными и I
выходными воздействиями является множество со следующими элементами: ец,---,еп,т,$1,$1 ,...,$п,$п,Х1 ,...,Хк,Х1 ,...,хк,21,...,2г. В момент начала протоколирования в
протокол делаются записи ^г,] о текущих состояниях автоматов (эту последовательность записей мы назовем заголовком протокола). Протоколирование может быть начато лишь при условии, что ни один автомат не производит обработку события. При получении входного события е] автоматом Аг в протокол делается запись ег,]. Затем происходит вычисление входных переменных, и для каждой переменной, значение которой истина, в протокол делается запись хг, а для каждой со значением ложь - х^ .
При выполнении выходного воздействия в протокол делается запись 2г. Наконец, после обработки события автоматом Аг в протокол делается запись ^г,], указывающая новое состояние автомата, даже если произошел переход по петле и состояние автомата при переходе не изменилось.
Остается определить значения описанных предикатов для каждой записи в протоколе. Назовем секцией обработки события автоматом А^ последовательность записей е1,],...,$к. Заголовком секции назовем начальную подпоследовательность записей длины 1 + к: ег,],...,хк. Секции могут быть вложены. При этом вложенные друг в друга секции обязательно соответствуют разным автоматам [2]. Тогда предикат ег] имеет значение истина во всех записях секции обработки события, начинающейся с записи ег,]. Предикат х^ имеет значение истина для всех записей секции, если в заголовке секции встречается запись хк и ложь, если встречается запись х^ . Отметим, что в каждом заголовке
для каждой входной переменной обязана присутствовать ровно одна из этих записей. При вызове вложенного автомата значения хг, построенные на основании заголовка секции обработки вложенного события, перекрывают предыдущие значения предикатов. Предикат 2г имеет значение истина только в записи 2г. Предикат $1,к принимает значение истина в записи &1,к и сохраняет это значение во всех записях протокола до следующей записи вида $1,к\ не включая саму эту запись. Во всех остальных случаях предикаты имеют значение ложь.Например, при одиночном вызове лифта и прибытии лифта на этаж рассматриваемая система управления лифтом произведет действия, описываемые следующим протоколом (в квадратные скобки взяты секции обработки событий): 81,Ш,1[е1,Ш][е1,2[е2,3^2,3]81,3].
Отметим, что в результате разделения записей заголовка протокола (ег,],...,хк) некоторые моменты времени, на которых производится обход альтернирующего автомата, могут быть представлены несколькими записями протокола. Так как всему заголовку каждой секции соответствует один момент времени, то для определения значений предикатов в этот момент времени требуется наличие информации обо всех записях заголовка. Эту особенность необходимо учитывать при реализации предложенного ме-
тода на практике, но, так как заголовок всегда имеет фиксированную длину, то при получении последней записи заголовка можно немедленно выяснить значения всех предикатов, описывающих состояние системы, в момент начала обработки события.
При обнаружении несоответствия записей протокола заданной спецификации требуется построить контрпример - путь в системе автоматов, который приводит к нарушению условий спецификации. При использовании предложенного метода для построения контрпримера достаточно взять заголовки секций протокола от начала до момента обнаружения нарушения спецификации. Эта последовательность записей в совокупности с заголовком протокола и даст путь в автоматной системе, являющийся контрпримером.
Для проверки возможности практического использования предложенного метода динамической верификации была осуществлена простейшая реализация алгоритмов построения и обхода альтернирующих автоматов. Реализация выполнена на языке C# и исполнялась в среде Microsoft CLR 2.0 SP1 под операционной системой Microsoft Windows Vista 64. Код написан без применения специальных оптимизаций, применение которых может дополнительно ускорить работу верификатора.
Для тестирования в качестве примера использовалась две спецификациии. Одна из них - простая спецификация вида Gx1 — Fz1: после получения события, при котором значение входной переменной x1 - истина, всегда выполняется выходное воздействие z1. Вторая - более сложная: Gx1 v (Fz1 л Fz2) соответствует утверждению «при получении любого события либо значение переменной x1 - истина, либо в некоторый момент времени после него будут выполнены выходные воздействия z1 и z2.
Так как алгоритм анализа протокола не зависит от структуры автомата, то для тестирования были искусственно построены протоколы различной длины, удовлетворяющие и не удовлетворяющие спецификации.
Для спецификации ф и протокола п алгоритм обратного обхода имеет трудоемкость о(ф| * |п|) и требует О(|ф|) единиц памяти. Это делает его наиболее эффективным
алгоритмом при наличии всего протокола в целом. Тестовая реализация алгоритма проводила верификацию протокола относительно спецификации вида Gx1 — Fz1 с производительностью около 200 000 записей в секунду.
При отсутствии протокола в целом выбор алгоритма ограничен обходом автомата в глубину и в ширину. Алгоритм обхода в глубину в худшем случае имеет трудоемкость о[|ф|*|п|2 J и требует о(п|) единиц памяти, что в ряде случаев (например, при
верификации спецификации вида GFф) делает его не лучшим выбором. На спецификации Gx1 —Fz1 скорость работы алгоритма составила около 100 000 записей в секунду.
Наконец, обход в ширину позволяет верифицировать протоколы с трудоемкостью 0(|ф|*Ы), не требуя наличия всего протокола целиком. Однако оценка потребления
В целом полученные результаты подтверждают рекомендации по использованию указанных алгоритмов, приведенные в работе [3]: при возможности рекомендуется использовать алгоритм обратного обхода. При невозможности его применения следует выбирать между обходом в ширину и глубину в зависимости от вида формулы.
Функциональные особенности и характеристики метода
памяти этим алгоритмом в худшем случае составляет О
Для изучения характеристик метода на практике был построен набор протоколов различной длины - от 10 до 106 записей, в которых записи х\, 21 и 22 распределены равномерно. На каждом протоколе был несколько раз запущен алгоритм обратного обхода для каждой из двух рассматриваемых спецификаций. В результате было вычислено среднее время верификации протокола заданной длины. Результаты измерений приведены на рис. 2.
Длина протокола, тышчизаписей Gil-*F!l ..............Gxl v(Fzl AFz2)
Рис. 2. Скорость работы алгоритма обратного обхода на протоколах различной длины
Важной особенностью динамической верификации программ является зависимость от точки прерывания протокола. Например, если оборвать протокол, используемый в описанном тесте, на записи x1, то спецификация окажется невыполненной, так как соответстующая этой записи запись z1 о выполнении выходного воздействия просто не успела попасть в протокол. В связи с этой особенностью исследователей могут интересовать не столько факт нарушения спецификации, сколько статистика выполнения или не выполнения спецификации. В работе [3] приведены модифицированные алгоритмы обхода, позволяющие собирать такого рода статистику. Предложенный в данной работе метод можно использовать также с этими алгоритмами: последний шаг (построение и анализ контрпримера) следует заменить на анализ полученной статистики.
Заключение
В работе предложен метод автоматической динамической верификации программ. Предложенный метод позволяет верифицировать гораздо более сложные системы автоматов, нежели традиционный метод Model Checking. Предложенный метод основан на известном подходе к верификации программ, в котором используются альтернирующие автоматы. В работе проанализирована применимость этого подхода к верификации автоматных программ; в частности, исследованы особенности использования различных алгоритмов обхода альтернирующего автомата.
Автором произведено сравнение характеристик предложенного метода с рядом методов, описанных в [2], на основании чего выработано руководство к выбору того или иного метода верификации в зависимости от поставленной задачи.
Литература
1. Кларк Э., Грамберг О., Пелед Д. Верификация моделей программ: Model Checking. -М.: МЦНМО, 2002.
2. Разработка технологии верификации управляющих программ со сложным поведением, построенных на основе автоматного подхода. Теоретические исследования поставленных перед НИР задач. - СПбГУ ИТМО. 2007. - Режим доступа: http://is.ifmo.ru/verification/_2007_02_report-verification.pdf
3. Finkbeiner B., Sipma H. Checking Finite Traces Using Alternating Automata // Form. Methods Syst. Des. - 2004. - 24. - 2.
4. Emerson E. A. Temporal and modal logic / In «Handbook of theoretical Computer Science (Vol. B): Formal Models and Semantics». - MA: MIT Press, 1990. - Р. 995-1072.
5. Vardi M. Y. Alternating Automata and Program Verification / Computer Science Today. Recent Trends and Developments. - Vol. 1000 of LNCS. - Springer-Verlag. 1995.
6. Vardi M. Y. Alternating Automata: Checking Truth and Validity for Temporal Logics / Proc. 14th International Conference on Automated Deduction. - Vol. 1249 of LNCS. -Springer-Verlag. 1997.
7. Havelund K., Ro§u G. Testing Linear Temporal Logic Formulae on Finite Execution Traces. Technical Report TR 01-08, RIACS. 2001.
8. Mealy G. A Method to Synthesizing Sequential Circuits // Bell System Technical J. -1955. - 34. - Р. 1045-1079.
9. Разработка технологии верификации управляющих программ со сложным поведением, построенных на основе автоматного подхода. Выбор направления исследований и базовых компонентов. - СПбГУ ИТМО. 2007. - Режим доступа: http://is.ifmo.ru/verification/_2007_01_report-verification.pdf