Логика разделения
В информатике логика разделения [1] — это расширение логики Хоара , способ рассуждения о программах.Его разработали Джон К. Рейнольдс , Питер О'Хирн , Самин Иштиак и Хонсок Ян. [1] [2] [3] [4] опираясь на ранние работы Рода Берстолла . [5] Язык утверждений логики разделения является частным случаем логики группированных импликаций (BI). [6] Обзорная статья CACM О'Хирна описывает развитие этой темы до начала 2019 года. [7]
Обзор
[ редактировать ]Логика разделения облегчает рассуждения о:
- программы, которые манипулируют структурами данных указателей, включая сокрытие информации при наличии указателей;
- «переход права собственности» (уход от аксиом смыслового фрейма ); и
- виртуальное разделение (модульное рассуждение) между параллельными модулями.
Логика разделения поддерживает развивающуюся область исследований, описанную Питером О'Хирном и другими как локальное рассуждение , при котором в спецификациях и доказательствах программного компонента упоминается только часть памяти, используемая компонентом, а не все глобальное состояние системы. Приложения включают автоматическую проверку программы (когда алгоритм проверяет достоверность другого алгоритма) и автоматическое распараллеливание программного обеспечения.
Утверждения: операторы и семантика
[ редактировать ]Утверждения логики разделения описывают «состояния», состоящие из хранилища и кучи , что примерно соответствует состоянию локальных (или выделенных в стеке ) переменных и динамически выделяемых объектов в распространенных языках программирования, таких как C и Java . Магазин — это функция, отображающая переменные в значения. куча это частичная функция, отображающая адреса памяти в значения. Две кучи и ( не пересекаются обозначаются ), если их домены не перекрываются (т.е. для каждого адреса памяти , хотя бы один из и не определено).
Логика позволяет доказывать суждения вида , где это магазин, это куча, и является утверждением относительно данного хранилища и кучи. Утверждения логики разделения (обозначенные как , , ) содержат стандартные логические связки и, кроме того, , , , и , где и являются выражениями.
- Константа утверждает, что куча пуста , т.е. когда не определено для всех адресов.
- Бинарный оператор принимает адрес и значение и утверждает, что куча определена ровно в одном месте, сопоставляя данный адрес с данным значением. Т.е., когда (где обозначает значение выражения оценивается в магазине ) и в противном случае не определено.
- Бинарный оператор (произносится как звезда или разделяющий союз ) утверждает, что кучу можно разделить на две непересекающиеся части, где действуют два аргумента соответственно. Т.е., когда существуют такой, что и и и .
- Бинарный оператор (произносится как волшебная палочка или разделяющая импликация ) утверждает, что расширение кучи за счет непересекающейся части, удовлетворяющей ее первому аргументу, приводит к получению кучи, удовлетворяющей ее второму аргументу. Т.е.,. когда для каждой кучи такой, что , также держит.
Операторы и имеют некоторые общие свойства с классическими операторами конъюнкции и импликации . Их можно объединить, используя правило вывода, подобное modus ponens.
и они образуют присоединение , т. е. тогда и только тогда, когда для ; точнее, сопряженными операторами являются и .
Рассуждения о программах: тройки и правила доказательства
[ редактировать ]В логике разделения тройки Хоара имеют несколько иной смысл, чем в логике Хоара . тройка утверждает, что если программа выполняется из начального состояния, удовлетворяющего предварительному условию тогда программа не пойдет не так (например, будет иметь неопределенное поведение), и если она завершится, то конечное состояние будет удовлетворять постусловию . По сути, в ходе его исполнения может получить доступ только к областям памяти, существование которых утверждается в предварительном условии или которые были выделены сам.
Помимо стандартных правил из логики Хоара , логика разделения поддерживает следующее очень важное правило:
Это известно как правило фрейма (названное в честь проблемы с фреймом ) и обеспечивает локальное рассуждение. В нем говорится, что программа, которая безопасно выполняется в небольшом состоянии (удовлетворяющем ), также может выполняться в любом большем состоянии (удовлетворяющем ) и что его выполнение не повлияет на дополнительную часть состояния (и так останется истинным в постусловии). Побочное условие обеспечивает это, указывая, что ни одна из переменных, измененных с помощью происходить бесплатно в , т.е. ни один из них не входит в набор «свободных переменных» из .
Совместное использование
[ редактировать ]Логика разделения приводит к простым доказательствам манипулирования указателями для структур данных, которые демонстрируют регулярные шаблоны совместного использования, которые можно описать просто с помощью разделительных союзов; примеры включают одно- и двусвязные списки и разновидности деревьев. Графы, группы DAG и другие структуры данных с более общим доступом сложнее как для формального, так и для неформального доказательства. Тем не менее логика разделения успешно применялась к рассуждениям опрограммы с общим обменом.
В своей статье POPL'01 [3] О'Хирн и Иштиак объяснили, как соединяется волшебная палочка можно использовать для рассуждения при наличии обмена, по крайней мере, в принципе.Например, в тройке
мы получаем самое слабое предварительное условие для оператора, который изменяет кучу в месте , и это работает для любого постусловия, а не только для того, которое аккуратно составлено с помощью разделительного союза. Эта идея была развита Янгом гораздо дальше, который использовал предоставить локализованные рассуждения о мутациях в классическом алгоритме разметки графов Шорра-Уэйта . [8] Наконец, одна из последних работ в этом направлении принадлежит Хобору и Виллару. [9] ВОЗ нанимать не только но и связующее который по-разному называли перекрывающимся союзом или сепишом, [10] и который можно использовать для описания перекрывающихся структур данных: держит кучу когда и удерживать для подкучек и чей союз , но которые, возможно, имеют непустую часть в общем. Абстрактно, можно рассматривать как версию слитной связки логики релевантности .
Параллельная логика разделения
[ редактировать ]Логика параллельного разделения (CSL),версия логики разделения для параллельных программ, первоначально была предложена Питером О'Хирном , [11] используя правило доказательства
что позволяет независимо рассуждать о потоках, обращающихся к отдельному хранилищу. Правила доказательства О'Хирна адаптировали ранний подход Тони Хоара к рассуждениям о параллелизме. [12] замена использования ограничений области действия для обеспечения разделения рассуждениями в логике разделения. Помимо расширения подхода Хоара для его применения при наличии указателей, выделенных в куче, О'Хирн показал, как рассуждения в логике параллельного разделения могут отслеживать динамическую передачу владения частями кучи между процессами; примеры в статье включают буфер передачи указателей и диспетчер памяти .
Комментируя раннюю классическую работу Сьюзан Овики и Дэвида Грайса о говорит свободе вмешательства , О'Хирн , что явная проверка невмешательства не является необходимой, поскольку его система исключает вмешательство неявным образом, по природе способа доказательства. построен.
Модель логики параллельного разделения была впервые предложена Стивеном Бруксом в сопутствующей статье, опубликованной в журнале O'Hearn's. [13] Правильность логики была сложной проблемой, и фактически контрпример Джона Рейнольдса показал несостоятельность более ранней, неопубликованной версии логики; Проблема, поднятая примером Рейнольдса, кратко описана в статье О'Хирна и более подробно в статье Брукса.
Сначала казалось, что CSL хорошо подходит для того, что Дейкстра назвал слабосвязанными процессами. [14] но, возможно, не для мелкозернистых параллельных алгоритмов со значительными помехами. Однако постепенно стало понятно, что базовый подход CSL оказывается значительно более мощным, чем предполагалось вначале, если использовать нестандартные модели логических связок и даже тройки Хоара.
Была предложена абстрактная версия логики разделения, работающая для троек Хоара.где предусловия и постусловия представляют собой формулы, интерпретируемые для произвольного частичного коммутативного моноида, а не для конкретной модели кучи. [15] Позже, благодаря подходящему выбору коммутативного моноида, было неожиданно обнаружено, что правила доказательства абстрактных версий параллельной логики разделения могут использоваться для рассуждений о помехах в параллельных процессах, например, путем кодирования метода гарантии доверия, который первоначально был предложен для рассуждения. о помехах; [16] в данной работе элементами модели считались не ресурсы, а «представления» о состоянии программы, а нестандартная интерпретация троек Хоара сопровождает нестандартное прочтение пред- и постусловий.Наконец, принципы стиля CSL использовались для составления рассуждений об истории программ вместо состояний программ, чтобы обеспечить модульные методы рассуждений о мелкозернистых параллельных алгоритмах. [17]
Версии CSL включены во многие интерактивные и полуавтоматические (или «промежуточные») инструменты проверки, как описано в следующем разделе. Особенно значительная попытка проверки связана с упомянутым там ядром μC/OS-II. Но, хотя шаги были предприняты, [18] на данный момент рассуждения в стиле CSL включены в сравнительно небольшое числоинструменты из категории автоматического анализа программ (и ни один из них не упомянут в следующем разделе).
О'Хирн и Брукс являются со-лауреатами премии Гёделя 2016 года за изобретение логики параллельного разделения. [19]
Инструменты проверки и анализа программ
[ редактировать ]Инструменты для анализа программ делятся на диапазон от полностью автоматических инструментов анализа программ, не требующих участия пользователя, до интерактивных инструментов, в которых может участвовать человек.принимает непосредственное участие в процессе доказывания. Было разработано множество таких инструментов; следующий список включает несколько представителей в каждой категории.
- Автоматический анализ программы. Эти инструменты обычно ищут ограниченные классы ошибок (например, ошибки безопасности памяти) или пытаются доказать их отсутствие, но не могут доказать полную правильность.
- Текущий пример — Facebook Infer , инструмент статического анализа для Java, C и Objective-C, основанный на логике разделения и биабдукции. [20] По состоянию на 2015 год компания Infer обнаруживала и исправляла сотни ошибок в месяц перед отправкой в мобильные приложения Facebook. [21]
- Другие примеры включают SpaceInvader (один из первых анализаторов SL), Predator (выигравший несколько конкурсов по проверке), MemCAD (который сочетает в себе форму и числовые свойства) и SLAyer (от Microsoft Research, ориентированный на структуры данных, обнаруженные в драйверах устройств).
- Интерактивное доказательство. Доказательства проводились с использованием встраивания логики разделения в интерактивные средства доказательства теорем, такие как помощник доказательства Coq и HOL (помощник доказательства) . По сравнению с работой по анализу программ, эти инструменты требуют больше человеческих усилий, но обладают более глубокими свойствами, вплоть до функциональной корректности.
- Доказательство файловой системы FSCQ [22] где спецификация включает поведение при сбоях, а также нормальную работу. Эта работа получила награду за лучший доклад на Симпозиуме по принципам операционной системы 2015 года.
- Верификация большого фрагмента системы типов Rust и некоторых ее стандартных библиотек в проекте RustBelt с использованием фреймворка Iris для логики разделения в The Coqproof Assistant .
- Проверка реализации OpenSSL алгоритма криптографической аутентификации, [23] используя проверяемый C
- Верификация ключевых модулей коммерческого ядра ОС, ядра μC/OS-II, первого коммерческого упреждающего ядра, которое было проверено. [24]
- Другие примеры включают Ynot [25] библиотека для помощника по корректуре Coq ; встраивание Смолфута Холфутом в HOL; Мелкозернистая логика параллельного разделения и Bedrock (библиотека Coq для низкоуровневого программирования).
- Между. Многие инструменты требуют большего вмешательства пользователя, чем программный анализ, поскольку они ожидают, что пользователь введет утверждения, такие как спецификации до / после для функций или инварианты цикла, но после этого ввода они пытаются быть полностью или почти полностью автоматическими; этот способ проверки восходит к классическим работам 1970-х годов, таким как верификатор Дж. Кинга и верификатор Стэнфордского Паскаля. Этот стиль верификатора недавно был назван автоматической активной проверкой , термин, который призван обозначить способ взаимодействия с верификатором через цикл проверки утверждений, аналогичный взаимодействию между программистом и проверкой типов.
- Самый первый верификатор Логики Разделения, Смоллфут , находился в этой промежуточной категории. От пользователя требовалось ввести спецификации до и после, инварианты циклов и инварианты ресурсов для блокировок. Он представил метод символического выполнения, а также автоматический способ вывода аксиом фрейма. Смоллфут включил параллельную логику разделения.
- SmallfootRG — это средство проверки сочетания логики разделения и классического метода доверия/гарантии для параллельных программ.
- Heap Hop реализует логику разделения для передачи сообщений, следуя идеям Singularity (операционной системы) .
- VeriFast — это современный современный инструмент промежуточной категории. Он продемонстрировал доказательства, начиная от объектно-ориентированных шаблонов и заканчивая высококонкурентными алгоритмами и системными программами.
- Viper — это современная автоматизированная инфраструктура проверки для рассуждений на основе разрешений. В основном он состоит из языка программирования и двух механизмов проверки: одна основана на символьном выполнении, а другая — на генерации условий проверки (VCG). [26] На базе инфраструктуры Viper появилось несколько интерфейсов для различных языков программирования: Gobra для Go, Nagini для Python, Prusti для Rust и VerCors для C, Java, OpenCL и OpenMP. Эти внешние интерфейсы переводят язык программирования внешнего интерфейса в Viper, чтобы затем использовать серверную часть проверки Viper для подтверждения правильности входной программы.
- Язык программирования Mezzo и типы асинхронного разделения жидкостей включают идеи, связанные с CSL, в системе типов языка программирования. Идея включить разделение в систему типов уже имела более ранние примеры в разделах «Псевдонимы типов» и «Синтаксический контроль интерференции» .
Различие между интерактивными и промежуточными верификаторами не является резким. Например,Компания Bedrock стремится к высокой степени автоматизации, в основном к автоматической проверке, при которойVerifast иногда требует аннотаций, напоминающих тактику (небольшие программы), используемые в интерактивных верификаторах.
Разрешимость и сложность
[ редактировать ]Можно показать, что проблема выполнимости для многосортированного фрагмента логики разделения без кванторов, параметризованного по типам местоположений и данных, является PSPACE-полной . [27] Алгоритм решения этого фрагмента в DPLL(T) на основе решателях SMT был интегрирован в cvc5 . [28] Расширяя этот результат, можно также показать, что выполнимость аналога класса Бернейса – Шенфинкеля для логики разделения с неинтерпретируемыми ячейками памяти является PSPACE-полной, тогда как проблема неразрешима с интерпретируемыми ячейками памяти (например, целыми числами) или дальнейшими изменениями кванторов. [29]
Ссылки
[ редактировать ]- ^ Перейти обратно: а б Рейнольдс, Джон К. (2002). «Логика разделения: логика для общих изменяемых структур данных» (PDF) . ЛИКС .
- ^ Рейнольдс, Джон К. (1999). «Интуиционистские рассуждения об общей изменяемой структуре данных». В Дэвисе, Джим ; Роско, Билл ; Вудкок, Джим (ред.). Перспективы тысячелетия в области компьютерных наук, материалы симпозиума Оксфорд-Майкрософт 1999 года в честь сэра Тони Хоара . Пэлгрейв .
- ^ Перейти обратно: а б Иштиак, Самин; О'Хирн, Питер (2001). «BI как язык утверждений для изменяемых структур данных». Материалы 28-го симпозиума ACM SIGPLAN-SIGACT по принципам языков программирования . АКМ . стр. 14–26. дои : 10.1145/360204.375719 . ISBN 1581133367 . S2CID 2652274 .
{{cite book}}
:|journal=
игнорируется ( помогите ) - ^ О'Хирн, Питер; Рейнольдс, Джон К.; Ян, Хонсок (2001). «Локальные рассуждения о программах, изменяющих структуры данных». КСЛ . CiteSeerX 10.1.1.29.1331 .
- ^ Берстолл, РМ (1972). «Некоторые методы проверки программ, изменяющих структуры данных». Машинный интеллект . 7 .
- ^ О'Хирн, PW; Пим, диджей (июнь 1999 г.). «Логика объединенных импликаций». Бюллетень символической логики . 5 (2): 215–244. CiteSeerX 10.1.1.27.4742 . дои : 10.2307/421090 . JSTOR 421090 . S2CID 2948552 .
- ^ О'Хирн, Питер (февраль 2019 г.). «Логика разделения» . Коммун. АКМ . 62 (2): 86–95. дои : 10.1145/3211968 . ISSN 0001-0782 .
- ^ Ян, Хонсок (2001). «Пример локальных рассуждений в логике указателей BI: алгоритм маркировки графа Шорра-Уэйта» . Материалы 1-го семинара по семантике «Программный анализ» и вычислительным средам для управления памятью .
- ^ Хобор, Фома Аквинский; Виллар, Жюль (2013). «Последствия совместного использования структур данных» (PDF) . Уведомления ACM SIGPLAN . 48 : 523–536. дои : 10.1145/2480359.2429131 .
- ^ Гарднер, Филиппа; Маффейс, Серхио; Смит, Харет (2012). «К программной логике для Java Script » (PDF) . Материалы 39-го ежегодного симпозиума ACM SIGPLAN-SIGACT по принципам языков программирования — POPL '12 . стр. 31–44. дои : 10.1145/2103656.2103663 . hdl : 10044/1/33265 . ISBN 9781450310833 . S2CID 9571576 .
- ^ О'Хирн, Питер (2007). «Ресурсы, параллелизм и локальное мышление» (PDF) . Теоретическая информатика . 375 (1–3): 271–307. дои : 10.1016/j.tcs.2006.12.035 .
- ^ Хоар, ЦАР (1972). «К теории параллельного программирования». Техники операционной системы. Академическая пресса .
- ^ Брукс, Стивен (2007). «Семантика логики параллельного разделения» (PDF) . Теоретическая информатика . 375 (1–3): 227–270. дои : 10.1016/j.tcs.2006.12.034 .
- ^ Дейкстра, Эдсгер В. Сотрудничающие последовательные процессы (EWD-123) (PDF) . Архив Э. В. Дейкстры. Центр американской истории Техасского университета в Остине . ( транскрипция ) (сентябрь 1965 г.)
- ^ Кальканьо, Криштиану; О'Хирн, Питер В.; Ян, Хонсок (2007). «Локальное действие и абстрактная логика разделения» (PDF) . 22-й ежегодный симпозиум IEEE по логике в информатике (LICS 2007) . стр. 366–378. CiteSeerX 10.1.1.66.6337 . дои : 10.1109/LICS.2007.30 . ISBN 978-0-7695-2908-0 . S2CID 1044254 .
- ^ Динсдейл-Янг, Томас; Биркедал, Ларс; Гарднер, Филиппа; Паркинсон, Мэтью; Ян, Хонсок (2013). «Просмотры» (PDF) . Уведомления ACM SIGPLAN . 48 : 287–300. дои : 10.1145/2480359.2429104 .
- ^ Сергей, Илья; Наневский, Александр; Банерджи, Аниндья (2015). «Определение и проверка параллельных алгоритмов с историей и субъективностью» (PDF) . 24-й Европейский симпозиум по программированию . arXiv : 1410.0306 . Бибкод : 2014arXiv1410.0306S .
- ^ Гоцман, Алексей; Бердин, Джош; Кук, Байрон; Сагив, Мули (2007). «Анализ резьбо-модульной формы». Верификация, проверка модели и абстрактная интерпретация (PDF) . Конспекты лекций по информатике. Том. 5403. стр. 266–277. дои : 10.1007/978-3-540-93900-9_3 . ISBN 978-3-540-93899-6 .
{{cite book}}
:|journal=
игнорируется ( помогите ) - ^ «Премия Гёделя 2016» . Европейская ассоциация теоретической информатики . Проверено 29 августа 2022 г.
- ^ Логика разделения и двойное похищение, страница , сайт проекта Infer .
- ^ Facebook Infer с открытым исходным кодом: выявляйте ошибки перед отправкой. К. Кальканьо, Д. Дистефано и П. О'Хирн. 11 июня 2015 г.
- ^ Использование логики Crash Hoare для сертификации файловой системы FSCQ , Х. Чен и др., SOSP'15
- ^ Проверена правильность и безопасность OpenSSL HMAC . Леннарт Беринджер, Адам Петчер, Кэтрин К. Йе и Эндрю В. Аппель. На 24-м симпозиуме USENIX по безопасности , август 2015 г.
- ^ Практическая основа проверки для ядер упреждающей ОС . Фэнвэй Сюй, Мин Фу, Синьюй Фэн, Сяоран Чжан, Хуэй Чжан и Чжаохуэй Ли: В CAV 2016: 59-79.
- ^ Домашняя страница проекта Ynot , Гарвардский университет , США.
- ^ Viper: Инфраструктура проверки для рассуждений на основе разрешений , П. Мюллер, М. Шверхофф и Эй Джей Саммерс, VMCAI'16
- ^ Рейнольдс, Эндрю; Иосиф, Раду; Сербан, Кристина; Кинг, Тим (2016). «Процедура принятия решения для логики разделения в SMT» . В Арто, Сирилл; Легай, Аксель; Пелед, Дорон (ред.). Автоматизированная технология проверки и анализа . Конспекты лекций по информатике. Чам: Международное издательство Springer. стр. 244–261. arXiv : 1603.06844 . дои : 10.1007/978-3-319-46520-3_16 . ISBN 978-3-319-46520-3 .
- ^ Барбоза, Ханиэль; Барретт, Кларк; Брэйн, Мартин; Кремер, Гереон; Лахнитт, Ханна; Манн, Макай; Мохамед, Абдалрахман; Мохамед, Мудатир; Нимец, Айна; Нётцли, Андрес; Оздемир, Алекс; Прейнер, Матиас; Рейнольдс, Эндрю; Шэн, Ин; Тинелли, Чезаре (2022). «cvc5: универсальный и мощный решатель SMT». В Фисмане, Дана; Розу, Григоре (ред.). Инструменты и алгоритмы построения и анализа систем . Конспекты лекций по информатике. Чам: Международное издательство Springer. стр. 415–442. дои : 10.1007/978-3-030-99524-9_24 . ISBN 978-3-030-99524-9 .
- ^ Рейнольдс, Эндрю; Иосиф, Раду; Сербан, Кристина (2017). «Рассуждения во фрагменте логики разделения Бернейса-Шёнфинкеля-Рэмзи» . В Буаджани, Ахмед; Моннио, Дэвид (ред.). Верификация, проверка модели и абстрактная интерпретация . Конспекты лекций по информатике. Чам: Международное издательство Springer. стр. 462–482. дои : 10.1007/978-3-319-52234-0_25 . ISBN 978-3-319-52234-0 .