Абстрактная интерпретация

Из Википедии, бесплатной энциклопедии

В информатике абстрактная интерпретация — это теория звуковой аппроксимации семантики компьютерных программ , основанная на монотонных функциях над упорядоченными множествами , особенно решетками . Его можно рассматривать как частичное выполнение компьютерной программы , которая получает информацию о ее семантике (например, поток управления , поток данных ) без выполнения всех вычислений .

Его основное конкретное применение — формальный статический анализ , автоматическое извлечение информации о возможных исполнениях компьютерных программ; такой анализ имеет два основных применения:

Абстрактная интерпретация была формализована рабочей парой французских ученых-компьютерщиков Патриком Кузо и Радией Кузо в конце 1970-х годов. [1] [2]

Интуиция [ править ]

В этом разделе абстрактная интерпретация иллюстрируется с помощью реальных, некомпьютерных примеров.

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

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

Если нас интересует только какая-то конкретная информация, скажем, «был ли человек в возрасте в комнате?», нет необходимости хранить список всех имен и дат рождения. Мы можем безопасно и без потери точности ограничиться ведением списка возрастов участников. Если это уже слишком сложно, мы можем сохраняйте только возраст самого младшего, и самый старый человек, . Если вопрос о возрасте строго младше или строго выше, чем , то мы можем смело ответить, что такого участника не было. В противном случае мы сможем только сказать, что не знаем.

В случае вычислений конкретная, точная информация, как правило, не вычислима в пределах конечного времени и памяти (см. теорему Райса и проблему остановки ). Абстракция используется для получения обобщенных ответов на вопросы (например, ответ «может быть» на вопрос «да/нет», что означает «да или нет», когда мы (алгоритм абстрактной интерпретации) не можем с уверенностью вычислить точный ответ); это упрощает проблемы, делая их поддающимися автоматическому решению. Одним из важнейших требований является добавление достаточной неопределенности, чтобы сделать проблемы управляемыми, сохраняя при этом достаточную точность для ответа на важные вопросы (например, «может ли программа выйти из строя?»).

Абстрактная интерпретация компьютерных программ [ править ]

Для данного языка программирования или спецификации абстрактная интерпретация состоит из предоставления нескольких семантик, связанных отношениями абстракции. Семантика — это математическая характеристика возможного поведения программы. Наиболее точная семантика, очень точно описывающая фактическое выполнение программы, называется конкретной семантикой . Например, конкретная семантика императивного языка программирования может ассоциировать с каждой программой набор трасс выполнения, которые она может создавать: трасса выполнения представляет собой последовательность возможных последовательных состояний выполнения программы; состояние обычно состоит из значения счетчика программы и ячеек памяти (глобальные значения, стек и куча). Затем выводится более абстрактная семантика; например, можно рассматривать только набор достижимых состояний при выполнении (что равносильно рассмотрению последних состояний в конечных трассах).

Цель статического анализа — в какой-то момент получить вычислимую семантическую интерпретацию. Например, можно выбрать представление состояния программы, манипулирующей целочисленными переменными, забывая фактические значения переменных и сохраняя только их знаки (+, - или 0). Для некоторых элементарных операций, например умножения , такая абстракция не теряет точности: чтобы получить знак произведения, достаточно знать знак операндов. Для некоторых других операций абстракция может потерять точность: например, невозможно узнать знак суммы, операнды которой соответственно положительные и отрицательные.

Иногда для того, чтобы сделать семантику разрешимой, необходима потеря точности (см. теорему Райса и проблему остановки ). В общем, необходимо найти компромисс между точностью анализа и его разрешимостью ( вычислимостью ) или управляемостью ( стоимостью вычислений ).

На практике определяемые абстракции адаптируются как к свойствам программы, которые необходимо анализировать, так и к набору целевых программ. Первый крупномасштабный автоматизированный анализ компьютерных программ с абстрактной интерпретацией был вызван аварией, которая привела к разрушению первого полета ракеты «Ариан-5» в 1996 году. [3]

Формализация [ править ]

Пример: абстракция наборов целых чисел (красный) для знаковых наборов (зеленый).

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

Функция называется функцией абстракции , если она отображает элемент в бетонном наборе к элементу в абстрактном наборе . То есть элемент в это абстракция в .

Функция называется функцией конкретизации , если она отображает элемент в абстрактном наборе к элементу в бетонном наборе . То есть элемент в представляет конкретизацию собой в .

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

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

Трудность сейчас состоит в том, чтобы получить такой . Если имеет конечную высоту или, по крайней мере, проверяет условие восходящей цепи (все восходящие последовательности в конечном счете стационарны), то такой может быть получен как стационарный предел возрастающей последовательности определяется по индукции следующим образом: (наименьший элемент ) и .

В остальных случаях еще можно получить такое через (парный) расширяющий оператор , [4] определяется как бинарный оператор который удовлетворяет следующим условиям:

  1. Для всех и , у нас есть и , и
  2. Для любой возрастающей последовательности , последовательность, определяемая и в конечном итоге является стационарным. Тогда мы сможем взять .

В некоторых случаях можно определить абстракции, используя связи Галуа. где из к и из к . Это предполагает существование лучших абстракций, что не обязательно так. Например, если мы абстрагируем множества пар действительных чисел , заключая выпуклые многогранники , не существует оптимальной абстракции для диска, определяемого формулой .

Примеры абстрактных доменов [ править ]

Числовые абстрактные домены [ править ]

Каждой переменной можно присвоить доступен в данной программе в определенный интервал времени . Государство, присваивающее значение в переменную будет конкретизацией этих интервалов, если для всех , у нас есть . Из интервалов и для переменных и соответственно, можно легко получить интервалы для (а именно, ) и для (а именно, ); Обратите внимание, что это точные абстракции, поскольку набор возможных результатов, скажем, , это именно интервал . Более сложные формулы могут быть выведены для умножения, деления и т. д., что дает так называемую интервальную арифметику . [5]

Давайте теперь рассмотрим следующую очень простую программу:

у = х;
 г = х - у;
 
Комбинация интервальной арифметики ( зеленый ) и сравнение по модулю 2 для целых чисел ( cyan ) в качестве абстрактных доменов для анализа простого фрагмента кода C ( красный : конкретные наборы возможных значений во время выполнения). Используя информацию о конгруэнтности ( 0 = четный, 1 = нечетное), деление на ноль можно исключить. (Поскольку задействована только одна переменная, реляционные и нереляционные домены здесь не являются проблемой.)
Пример трехмерного выпуклого многогранника, описывающий возможные значения трех переменных в некоторой точке программы. Каждая из переменных может быть нулевой, но все три не могут быть нулевыми одновременно. Последнее свойство невозможно описать в области интервальной арифметики.

При разумных арифметических типах результат для С должно быть равно нулю. Но если мы займемся интервальной арифметикой, начиная с Икс в [0, 1] получаем С в [−1, +1]. Хотя каждая из операций, взятая по отдельности, была полностью абстрагирована, их композиция — нет.

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

Некоторые примеры реляционных числовых абстрактных областей:

и их комбинации (такие как восстановленный продукт, [2] ср. правая картинка).

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

Абстрактные домены машинных слов [ править ]

В то время как языки высокого уровня, такие как Python или Haskell, по умолчанию используют неограниченные целые числа, языки программирования более низкого уровня, такие как C или ассемблер, конечного размера обычно работают с машинными словами , которые более удобно моделировать с использованием целых чисел по модулю. (где n — разрядность машинного слова). Существует несколько абстрактных областей, подходящих для различного анализа таких переменных.

Домен битового поля обрабатывает каждый бит машинного слова отдельно, т. е. слово ширины n рассматривается как массив из n абстрактных значений. Абстрактные значения берутся из множества , а функции абстракции и конкретизации имеют вид: [14] [15] , , , , , , . Побитовые операции над этими абстрактными значениями идентичны соответствующим логическим операциям в некоторых трехзначных логиках : [16]

НЕ(А)
А ¬A
0 1
1 0
И(А, Б)
А ∧ Б Б
0 1
А 0 0 0 0
0
1 0 1
ИЛИ(А, Б)
А ∨ Б Б
0 1
А 0 0 1
1
1 1 1 1

Дополнительные домены включают домен знакового интервала и домен беззнакового интервала . Все три домена поддерживают абстрактные операторы прямого и обратного направления для таких общих операций, как сложение, сдвиг , исключающее ИЛИ и умножение. Эти домены можно объединить с помощью сокращенного произведения. [17]

См. также [ править ]

Ссылки [ править ]

  1. ^ Кусо, Патрик; Кузо, Радия (1977). «Абстрактная интерпретация: унифицированная решетчатая модель для статического анализа программ путем построения или аппроксимации фиксированных точек» (PDF) . Протокол конференции четвертого симпозиума ACM по принципам языков программирования, Лос-Анджелес, Калифорния, США, январь 1977 г. АКМ Пресс. стр. 238–252. дои : 10.1145/512950.512973 . S2CID   207614632 .
  2. ^ Перейти обратно: а б Кусо, Патрик; Кусо, Радия (1979). «Систематическое проектирование структур программного анализа» (PDF) . Протокол конференции шестого ежегодного симпозиума ACM по принципам языков программирования, Сан-Антонио, Техас, США, январь 1979 г. АКМ Пресс. стр. 269–282. дои : 10.1145/567752.567778 . S2CID   1547466 .
  3. ^ Фор, Кристель. «История поликосмических технологий» . Проверено 3 октября 2010 г.
  4. ^ Кусо, П.; Кусо, Р. (август 1992 г.). «Сравнение связи Галуа и расширения / сужения подходов к абстрактной интерпретации» (PDF) . В Брюйноге, Морис; Вирсинг, Мартин (ред.). Учеб. 4-й Межд. Симп. по реализации языка программирования и логическому программированию (PLILP) . Конспекты лекций по информатике. Том. 631. Спрингер. стр. 269–296. ISBN  978-0-387-55844-8 .
  5. ^ Кусо, Патрик; Кусо, Радия (1976). «Статическое определение динамических свойств программ» (PDF) . Материалы Второго международного симпозиума по программированию . Дюно, Париж, Франция. стр. 106–130.
  6. ^ Грейнджер, Филипп (1989). «Статический анализ арифметических сравнений». Международный журнал компьютерной математики . 30 (3–4): 165–190. дои : 10.1080/00207168908803778 .
  7. ^ Филипп Грейнджер (1991). «Статический анализ линейных конгруэнтных равенств между переменными программы». В Абрамский С.; Майбаум, TSE (ред.). Учеб. Межд. Дж. Конф. по теории и практике разработки программного обеспечения (ТАПСОФТ) . Конспекты лекций по информатике. Том. 493. Спрингер. стр. 169–192.
  8. ^ Кусо, Патрик; Хальбвакс, Николас (январь 1978 г.). «Автоматическое обнаружение линейных ограничений среди переменных программы» (PDF) . Конф. Рек. 5-й симпозиум ACM. по принципам языков программирования (POPL) . стр. 84–97.
  9. ^ Мине, Антуан (2001). «Новая числовая абстрактная область, основанная на разностных матрицах». В Дэнви, Оливье; Филинский, Анджей (ред.). Программы как объекты данных, Второй симпозиум (PADO) . Конспекты лекций по информатике. Том. 2053. Спрингер. стр. 155–172. arXiv : cs/0703073 .
  10. ^ Мине, Антуан (декабрь 2004 г.). Слабо реляционные числовые абстрактные области (PDF) (кандидатская диссертация). Лаборатория компьютерных наук Высшей нормальной школы.
  11. ^ Антуан Мине (2006). «Абстрактная область восьмиугольника». Символ высшего порядка. Вычислить . 19 (1): 31–100. arXiv : cs/0703084 . дои : 10.1007/s10990-006-8609-1 .
  12. ^ Кларисо, Роберт; Кортаделла, Хорди (2007). «Абстрактная область октаэдра». Наука компьютерного программирования . 64 : 115–139. дои : 10.1016/j.scico.2006.03.009 . hdl : 10609/109823 .
  13. ^ Майкл Карр (1976). «Аффинные отношения между переменными программы». Акта Информатика . 6 (2): 133–151. дои : 10.1007/BF00268497 . S2CID   376574 .
  14. ^ Мине, Антуан (июнь 2012 г.). «Абстрактные домены для машинных целочисленных операций и операций с плавающей запятой на битовом уровне» . WING'12 - 4-й международный семинар по инвариантной генерации . Манчестер, Великобритания: 16.
  15. ^ Регер, Джон; Дуонгсаа, Усит (июнь 2006 г.). «Вывод абстрактных передаточных функций для анализа встроенного программного обеспечения» . Материалы конференции ACM SIGPLAN/SIGBED 2006 года по языку, компиляторам и поддержке инструментов для встроенных систем . ЛКТЭС '06. Нью-Йорк, штат Нью-Йорк, США: Ассоциация вычислительной техники. стр. 34–43. дои : 10.1145/1134650.1134657 . ISBN  978-1-59593-362-1 . S2CID   13221224 .
  16. ^ Репс, Т.; Логинов А.; Сагив, М. (июль 2002 г.). «Семантическая минимизация 3-значных формул высказываний» . Материалы 17-го ежегодного симпозиума IEEE по логике в информатике . стр. 40–51. дои : 10.1109/LICS.2002.1029816 . ISBN  0-7695-1483-9 . S2CID   8451238 .
  17. ^ Юн, Ёнхо; Ли, Вусук; Йи, Квангын (6 июня 2023 г.). «Индуктивный синтез программ посредством итеративной абстрактной интерпретации вперед-назад» . Труды ACM по языкам программирования . 7 (PLDI): 174:1657–174:1681. arXiv : 2304.10768 . дои : 10.1145/3591288 .

Внешние ссылки [ править ]

Конспект лекций