Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

В информатике , логика разделения [1] является продолжением логики Хора , способ рассуждения о программах. Он был разработан Джоном К. Рейнольдсом , Питером О'Хирном , Самином Иштиаком и Хонгсоком Яном [1] [2] [3] [4], опираясь на ранние работы Рода Берстолла . [5] Язык утверждений логики разделения - это частный случай логики сгруппированных импликаций (BI). [6] В обзорной статье CACM, написанной О'Хирном, показаны изменения в данной теме до начала 2019 года. [7]

Обзор [ править ]

Логика разделения помогает рассуждать о:

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

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

Утверждения: операторы и семантика [ править ]

Утверждения логики разделения описывают «состояния», состоящие из хранилища и кучи , примерно соответствующие состоянию локальных (или выделенных стеком ) переменных и динамически выделяемых объектов в распространенных языках программирования, таких как C и Java . Хранилище - это функция, отображающая переменные в значения. Куча - это частичная функция, отображающая адреса памяти в значения. Две кучи и не пересекаются (обозначаются ), если их домены не перекрываются (т. Е. Для каждого адреса памяти хотя бы один изи не определено).

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

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

Операторы и имеют общие свойства с классическими операторами конъюнкции и импликации . Их можно комбинировать с помощью правила вывода, аналогичного modus ponens.

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

Рассуждения о программах: тройки и правила доказательства [ править ]

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

В дополнение к стандартным правилам из логики Хоара, логика разделения поддерживает следующее очень важное правило:

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

Совместное использование [ править ]

Логика разделения приводит к простым доказательствам манипулирования указателями для структур данных, которые демонстрируют регулярные шаблоны совместного использования, которые можно описать просто с помощью разделяющих союзов; примеры включают односвязные и двусвязные списки и разновидности деревьев. Графы, группы DAG и другие структуры данных с более общим разделением сложнее как для формального, так и для неформального доказательства. Тем не менее, логика разделения успешно применялась к рассуждениям о программах с общим разделением.

В своей статье POPL'01 [3] О'Хирн и Иштиак объяснили, как связку волшебной палочки можно использовать для рассуждения при наличии разделения, по крайней мере, в принципе. Например, в тройном

мы получаем самое слабое предусловие для оператора, который изменяет кучу в определенном месте , и это работает для любого постусловия, а не только для того, которое аккуратно выложено с помощью разделяющего конъюнкции. Эта идея была значительно продвинута Янгом, который использовал локализованные рассуждения о мутациях в классическом алгоритме маркировки графов Шорра-Уэйта . [8] Наконец, один из самых последних работ в этом направлении является то , что Hobor и Виара, [9] , которые используют не только также соединительно , но который по- разному называют перекрытием конъюнкции или sepish, [10] , и которые могут быть использованы для описания перекрывающихся структур данных: удерживает кучу, когда исправедливы для подкучков и чье объединение есть , но которые, возможно, имеют непустую общую часть . Абстрактно его можно рассматривать как версию логики слияния логики релевантности .

Логика параллельного разделения [ править ]

Параллельная Разделение логики (CSL), версия логики разделения для параллельных программ, первоначально был предложен Питером O'Hearn , [11] с использованием доказательства правила

что позволяет независимо рассуждать о потоках, обращающихся к отдельному хранилищу. Правила доказательства О'Хирна адаптировали ранний подход Тони Хоара к рассуждениям о параллелизме [12], заменив использование ограничений области видимости для обеспечения разделения рассуждениями в логике разделения. В дополнение к расширению подхода Хоара для применения в присутствии указателей, выделенных в куче, О'Хирн показал, как логика параллельного разделения может отслеживать динамическую передачу владения частями кучи между процессами; Примеры в статье включают буфер передачи указателя и диспетчер памяти .

Модель для параллельной логики разделения была впервые представлена ​​Стивеном Бруксом в статье, сопутствующей О'Хирну. [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 для логики разделения в помощнике доказательства Coq .
    • Проверка реализации OpenSSL алгоритма криптографической аутентификации [23] с использованием проверяемого языка C
    • Проверка ключевых модулей коммерческого ядра ОС, ядра μC / OS-II, первого коммерческого упреждающего ядра, которое было проверено. [24]
    • Другие примеры включают библиотеку Ynot [25] для помощника доказательства Coq ; Holfoot вложения Smallfoot в HOL; Подробная логика параллельного разделения и Bedrock (библиотека Coq для низкоуровневого программирования).
  • Между. Многие инструменты требуют большего вмешательства пользователя, чем анализ программы, поскольку они ожидают, что пользователь введет утверждения, такие как предварительные / последующие спецификации для функций или инварианты цикла, но после этого ввода они пытаются быть полностью или почти полностью автоматическими; Этот способ проверки восходит к классическим работам 1970-х годов, таким как верификатор Дж. Кинга и Стэнфордский верификатор Паскаля. Этот стиль верификатора недавно был назван автоматической активной верификацией , термин, который предназначен для обозначения способа взаимодействия с верификатором через цикл assert-check, аналогичный взаимодействию между программистом и проверкой типов.
    • Самый первый верификатор логики разделения, Смоллфут , находился в этой промежуточной категории. Это требовало, чтобы пользователь вводил спецификации до / после, инварианты цикла и инварианты ресурсов для блокировок. Он представил метод символического исполнения, а также автоматический способ вывода аксиом фрейма. Смоллфут включил логику параллельного разделения.
    • SmallfootRG - это средство проверки сочетания логики разделения и классического метода полагаться / гарантировать для параллельных программ.
    • Heap Hop реализует логику разделения для передачи сообщений, следуя идеям Singularity (операционная система) .
    • Verifast - это продвинутый текущий инструмент в промежуточной категории. Он продемонстрировал различные доказательства, начиная от объектно-ориентированных шаблонов и заканчивая алгоритмами с высокой степенью параллелизма и системными программами.
    • Язык программирования Mezzo и типы асинхронного разделения жидкости включают идеи, связанные с CSL в системе типов для языка программирования. Идея включения разделения в систему типов уже упоминалась в предыдущих примерах в статьях «Псевдонимы» и « Синтаксическое управление помехами» .

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

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

  1. ^ a b Рейнольдс, Джон К. (2002). «Логика разделения: логика для общих изменяемых структур данных» (PDF) . LICS . CS1 maint: discouraged parameter (link)
  2. Перейти ↑ Reynolds, John C. (1999). «Интуиционистские рассуждения об общей изменяемой структуре данных». В Дэвисе, Джиме ; Роско, Билл ; Вудкок, Джим (ред.). Millennium Perspectives in Computer Science, Proceedings of the 1999 Oxford – Microsoft Symposium in Honor of Sir Tony Hoare . Palgrave .
  3. ^ а б Иштиак, Самин; О'Хирн, Питер (2001). «BI как язык утверждений для изменяемых структур данных». ПОПЛ . ACM . CS1 maint: discouraged parameter (link)
  4. ^ О'Хирн, Питер; Рейнольдс, Джон С .; Ян, Хонгсок (2001). «Местные рассуждения о программах, изменяющих структуры данных». CSL . CiteSeerX 10.1.1.29.1331 . 
  5. ^ Burstall, RM (1972). «Некоторые методы доказательства программ, изменяющих структуры данных». Машинный интеллект . 7 . CS1 maint: discouraged parameter (link)
  6. ^ О'Хирн, PW; Пим, ди-джей (июнь 1999 г.). «Логика сгруппированных следствий». Вестник символической логики . 5 (2): 215–244. CiteSeerX 10.1.1.27.4742 . DOI : 10.2307 / 421090 . JSTOR 421090 .  
  7. ^ O'Hearn, Питер (февраль 2019). «Логика разделения» . Commun. ACM . 62 (2): 86–95. DOI : 10.1145 / 3211968 . ISSN 0001-0782 . 
  8. ^ Ян, Hongseok (2001). «Пример локального рассуждения в логике указателя BI: алгоритм маркировки графа Шорра-Уэйта» . Труды 1-го семинара по семантике «Программный анализ» и вычислительным средам для управления памятью .
  9. ^ Hobor, Фома Аквинский; Виллар, Жюль (2013). «Разветвления совместного использования в структурах данных» (PDF) . Уведомления ACM SIGPLAN . 48 : 523–536. DOI : 10.1145 / 2480359.2429131 .
  10. ^ Гарднер, Филиппа; Маффейс, Серджио; Смит, Харет (2012). «К программной логике для Java Script » (PDF) . Материалы 39-го ежегодного симпозиума ACM SIGPLAN-SIGACT по принципам языков программирования - POPL '12 . С. 31–44. DOI : 10.1145 / 2103656.2103663 . ЛВП : 10044/1/33265 . ISBN  9781450310833. S2CID  9571576 .
  11. ^ O'Hearn, Питер (2007). «Ресурсы, параллелизм и локальное мышление» (PDF) . Теоретическая информатика . 375 (1–3): 271–307. DOI : 10.1016 / j.tcs.2006.12.035 .
  12. Перейти ↑ Hoare, CAR (1972). «К теории параллельного программирования». Операционная система. Академическая пресса .
  13. ^ Брукс, Стивен (2007). «Семантика для логики параллельного разделения» (PDF) . Теоретическая информатика . 375 (1–3): 227–270. DOI : 10.1016 / j.tcs.2006.12.034 .
  14. ^ Дейкстра, Эдсгер В. Взаимодействие последовательных процессов (EWD-123) (PDF) . EW Dijkstra Archive. Центр американской истории Техасского университета в Остине . ( транскрипция ) (сентябрь 1965)
  15. ^ Кальканьо, Криштиану; О'Хирн, Питер В .; Ян, Хонгсок (2007). «Локальное действие и логика абстрактного разделения» (PDF) . 22-й ежегодный симпозиум IEEE по логике в компьютерных науках (LICS 2007) . С. 366–378. CiteSeerX 10.1.1.66.6337 . DOI : 10,1109 / LICS.2007.30 . ISBN   978-0-7695-2908-0. S2CID  1044254 .
  16. ^ Динсдейл-Янг, Томас; Биркедал, Ларс; Гарднер, Филиппа; Паркинсон, Мэтью; Ян, Хонгсок (2013). «Просмотры» (PDF) . Уведомления ACM SIGPLAN . 48 : 287–300. DOI : 10.1145 / 2480359.2429104 .
  17. ^ Сергей, Илья; Наневский, Александар; Банерджи, Аниндья (2015). «Определение и проверка параллельных алгоритмов с историей и субъективностью» (PDF) . 24-й Европейский симпозиум по программированию . arXiv : 1410.0306 . Bibcode : 2014arXiv1410.0306S .
  18. ^ Гоцман Алексей; Бердин, Джош; Повар, Байрон; Сагив, Мули (2007). Анализ модульной формы резьбы (PDF) . PLDI . Конспект лекций по информатике. 5403 . С. 266–277. DOI : 10.1007 / 978-3-540-93900-9_3 . ISBN  978-3-540-93899-6.
  19. ^ https://www.eatcs.org/index.php/component/content/article/1-news/2280-2016-godel-prize-
  20. ^ Логика разделения и двойное похищение, страница , сайт проекта Infer .
  21. ^ Вывод на Facebook с открытым исходным кодом: выявление ошибок перед отправкой. С. Кальканьо, Д. Дистефано и П. О'Хирн. 11 июня 2015 г.
  22. ^ Использование Crash Hoare Logic для сертификации файловой системы FSCQ , Х. Чен и др., SOSP'15
  23. ^ Проверенная корректность и безопасность OpenSSL HMAC . Леннарт Берингер, Адам Петчер, Кэтрин К. Йе и Эндрю В. Аппель. На 24-м симпозиуме по безопасности USENIX , август 2015 г.
  24. ^ Практическая структура проверки для превентивных ядер ОС . Фэнвэй Сюй, Мин Фу, Синью Фэн, Сяоран Чжан, Хуэй Чжан и Чжаохуэй Ли: В CAV 2016: 59-79
  25. ^ Домашняя страница проекта Ynot , Гарвардский университет , США.