コンピュータサイエンスにおいて、分離論理[1]は、プログラムについての推論方法であるホーア論理の拡張です。これは、ロッド・バーストールの初期の研究を参考にして、ジョン・C・レイノルズ、ピーター・オハーン、サミン・イシュティアク、ホンソク・ヤンによって開発されました[1] [2] [3] [4]。分離論理のアサーション言語は、束ねられた含意の論理(BI)の特殊なケースです。 [6]オハーンによるCACMレビュー記事は、2019年初頭までのこの分野の発展を示しています。[7]
概要
分離ロジックにより、次の点についての推論が容易になります。
- ポインタデータ構造を操作するプログラム(ポインタの存在下での情報の隠蔽を含む)。
- 「所有権の移転」 (意味フレーム公理の回避);そして
- 同時実行モジュール間の仮想分離(モジュール推論)。
分離論理は、ピーター・オハーンらがローカル推論と呼んでいる発展途上の研究分野をサポートします。ローカル推論では、プログラム コンポーネントの仕様と証明で、コンポーネントが使用するメモリの部分のみに言及し、システムの全体的なグローバル状態には言及しません。アプリケーションには、自動プログラム検証(アルゴリズムが別のアルゴリズムの有効性をチェックする) やソフトウェアの自動並列化などがあります。
アサーション: 演算子とセマンティクス
分離ロジックアサーションは、ストアとヒープで構成される「状態」を記述します。これは、 CやJavaなどの一般的なプログラミング言語のローカル(またはスタックに割り当てられた) 変数と動的に割り当てられたオブジェクトの状態にほぼ相当します。ストアは、変数を値にマッピングする関数です。ヒープは、メモリアドレスを値にマッピングする部分関数です。2 つのヒープと は、それらのドメインが重複していない場合 (つまり、すべてのメモリアドレス について、との少なくとも 1 つが未定義の場合)、互いに素です( と表記) 。
このロジックにより、形式 の判断を証明できます。ここで、はストア、はヒープ、 は指定されたストアとヒープ上のアサーションです。分離ロジック アサーション ( 、、と表記)には、標準のブール接続子に加えて、、、、およびが含まれます。ここで、 と は式です。
- この定数は、ヒープが空である、つまり、すべてのアドレスに対して が未定義であることを示します。
- バイナリ演算子は、アドレスと値を受け取り、ヒープが正確に 1 つの場所で定義され、指定されたアドレスが指定された値にマッピングされることをアサートします。つまり、(ここで、はストアで評価された式の値を示します)の場合はであり、それ以外の場合は未定義です。
- 二項演算子(スター演算子または分離接続詞 と発音) は、2 つの引数がそれぞれ成り立つ2 つの別々の部分にヒープを分割できることを主張します。つまり、およびおよびが存在する場合です。
- 二項演算子(マジック ワンドまたは分離含意 と発音) は、最初の引数を満たす分離部分でヒープを拡張すると、2 番目の引数を満たすヒープになると主張します。つまり、となるすべてのヒープに対して の場合、 も成り立ちます。
演算子と演算子は、古典的な連言演算子および含意演算子といくつかの特性を共有しています。これらは、モーダスポネンスに似た推論規則を使用して組み合わせることができます。
そして、それらは随伴 を形成します。つまり、に対して である場合に限ります。より正確には、随伴演算子はおよびです。
プログラムについての推論: トリプルと証明規則
分離論理では、ホーア トリプルはホーア ロジックとは少し異なる意味を持ちます。このトリプルは、プログラムが前提条件を満たす初期状態から実行された場合、プログラムはエラーにならず(たとえば、未定義の動作をする)、終了した場合は最終状態が事後条件を満たすと主張します。本質的には、実行中は、前提条件で存在が主張されているメモリ位置、またはそれ自体で割り当てられたメモリ位置にのみアクセスできます。
ホーア論理の標準ルールに加えて、分離論理は次の非常に重要なルールをサポートします。
これはフレーム規則(フレーム問題にちなんで名付けられました)として知られており、局所的な推論を可能にします。これは、小さな状態( を満たす)で安全に実行されるプログラムは、より大きな状態( を満たす)でも実行でき、その実行は状態の追加部分に影響を与えない(したがって事後条件で真のままになる)と述べています。副条件は、 によって変更される変数のいずれも で自由に発生しないこと、つまり の「自由変数」セットに含まれないことを指定することによって、これを強制します。
共有
分離論理は、分離結合を使用して簡単に記述できる規則的な共有パターンを示すデータ構造のポインタ操作の簡単な証明につながります。例としては、単方向および二重にリンクされたリストやさまざまなツリーがあります。グラフや DAG など、より一般的な共有を持つ他のデータ構造は、形式的および非形式的証明の両方がより困難です。それでも、分離論理は、一般的な共有を持つプログラムに関する推論にうまく適用されてきました。
POPL'01論文[3]で、オハーンとイシュティアクは、共有が存在する場合の推論に魔法の杖接続詞をどのように使用できるかを、少なくとも原理的には説明した。例えば、
位置 にあるヒープを変更するステートメントの最も弱い前提条件が得られます。これは、分離接続詞を使用してきちんとレイアウトされたものだけでなく、任意の事後条件に機能します。このアイデアは、古典的なショール-ウェイトグラフマーキングアルゴリズムで変化についての局所的な推論を提供していたヤンによってさらに発展しました。[8]最後に、この方向での最新の研究の1つは、HoborとVillardによるものです。[9]彼らは、 だけでなく、重複接続詞またはセピッシュ[10] とも呼ばれる接続詞も使用します。これは、重複するデータ構造を記述するために使用できます。つまり、 および がサブヒープに対して成り立つとき 、ヒープ が成り立ち、その和集合は ですが、空でない部分が共通している可能性があります。抽象的には、は関連性論理 の融合接続詞のバージョンと見なすことができます。
同時分離ロジック
並行プログラムのための分離論理の一種である並行分離論理(CSL)は、もともとピーター・オハーン[11]によって提案され、 証明規則を用いている 。
これにより、別々のストレージにアクセスするスレッドについて独立した推論が可能になります。O'Hearn の証明規則は、 Tony Hoareの初期の並行性に関する推論へのアプローチを採用したもので、[12] 分離を保証するためのスコープ制約の使用を分離ロジックでの推論に置き換えました。Hoare のアプローチをヒープに割り当てられたポインターの存在下に適用するように拡張することに加えて、O'Hearn は並行分離ロジックでの推論がプロセス間のヒープ部分の動的な所有権移転を追跡する方法を示しました。論文の例には、ポインター転送バッファーとメモリマネージャーが含まれています。
スーザン・オウィッキとデイヴィッド・グリースによる干渉の自由に関する初期の古典的な研究についてコメントして、オハーンは、証明の構築方法の性質上、彼のシステムは暗黙的に干渉を排除するため、非干渉の明示的なチェックは必要ないと述べています。
並行分離論理のモデルは、オハーンの論文に付随するスティーブン・ブルックスによって初めて提示された。[13]この論理の健全性は難しい問題であり、実際、ジョン・レイノルズの反例は、この論理の以前の未発表バージョンの不健全性を示していた。レイノルズの例によって提起された問題は、オハーンの論文で簡単に説明されており、ブルックスの論文ではより詳細に説明されている。
当初、CSLはダイクストラが緩く結合したプロセスと呼んだもの[14]には適しているように見えましたが、干渉が著しい細粒度の並行アルゴリズムには適していないかもしれません。しかし、論理接続子やホーアトリプルの非標準モデルを採用すれば、CSLの基本的なアプローチは当初考えられていたよりもはるかに強力であることが徐々に認識されました。
分離論理の抽象バージョンが提案され、事前条件と事後条件が特定のヒープモデルではなく任意の部分可換モノイド上で解釈される式である Hoare トリプルで機能するようになりました。[15] その後、可換モノイドを適切に選択することで、並行分離論理の抽象バージョンの証明規則を使用して、干渉する並行プロセスについて推論できることが驚くべきことに判明しました。たとえば、干渉について推論するために最初に提案された依存保証技法をエンコードすることによってです。[16]この研究では、モデルの要素はリソースではなく、プログラム状態の「ビュー」と見なされ、Hoare トリプルの非標準的な解釈には、事前条件と事後条件の非標準的な読み取りが伴います。最後に、CSL スタイルの原則を使用して、プログラム状態ではなくプログラム履歴についての推論を構成し、細粒度の並行アルゴリズムについて推論するためのモジュール式技法を提供しました。[17]
CSL のバージョンは、次のセクションで説明するように、多くの対話型および半自動 (または「中間」) 検証ツールに組み込まれています。特に重要な検証作業は、そこで言及されている μC/OS-II カーネルの検証です。しかし、いくつかのステップは踏まれていますが、[18]現時点では、CSL スタイルの推論は、自動プログラム分析カテゴリの比較的少数のツールに組み込まれています (次のセクションで言及されているものはありません)。
オハーンとブルックスは、並行分離論理の発明により2016年のゲーデル賞を共同受賞した。 [19]
検証およびプログラム分析ツール
プログラムを推論するためのツールは、ユーザー入力を必要としない完全に自動のプログラム分析ツールから、人間が証明プロセスに深く関与する対話型ツールまで多岐にわたります。このようなツールは数多く開発されており、次のリストには各カテゴリの代表的なツールがいくつか含まれています。
- 自動プログラム分析。これらのツールは通常、限定されたクラスのバグ (メモリ安全性エラーなど) を探すか、バグが存在しないことを証明しようとしますが、完全な正しさを証明することはできません。
- 現在の例としては、 分離論理とバイアブダクションに基づくJava、C、Objective-Cの静的解析ツールであるFacebook Inferがあります。 [20] 2015年の時点で、毎月数百のバグがInferによって発見され、Facebookのモバイルアプリに出荷される前に開発者によって修正されていました。 [21]
- その他の例としては、SpaceInvader(最初のSLアナライザーの1つ)、Predator(いくつかの検証コンテストで優勝)、MemCAD(形状と数値プロパティを組み合わせたもの)、SLAyer(Microsoft Research製、デバイスドライバー内のデータ構造に重点を置いたもの)などがあります。
- インタラクティブな証明。証明は、 Coq 証明アシスタントやHOL (証明アシスタント)などのインタラクティブな定理証明器への分離ロジックの埋め込みを使用して行われてきました 。プログラム分析作業と比較すると、これらのツールは人間の労力をより多く必要としますが、機能的な正しさに至るまで、より深い特性を証明します。
- FSCQファイルシステム[22]の証明。仕様には、通常の動作だけでなくクラッシュ時の動作も含まれています。この研究は、2015年のオペレーティングシステム原則シンポジウムで最優秀論文賞を受賞しました。
- Coq 証明アシスタントの分離ロジックに Iris フレームワークを使用して、RustBelt プロジェクトのRust型システムの大部分とその標準ライブラリの一部を検証します。
- 検証可能なC言語を使用した暗号認証アルゴリズムのOpenSSL実装の検証[23]
- 商用OSカーネルの主要モジュールの検証。μC/OS-IIカーネルは、検証された最初の商用プリエンプティブカーネルです。 [24]
- その他の例としては、 Coq証明支援システム用のYnot [25]ライブラリ、HOLにおけるSmallfootのHolfoot埋め込み、細粒度並行分離ロジック、Bedrock(低レベルプログラミング用のCoqライブラリ)などがある。
- 中間。多くのツールは、プログラム解析よりもユーザーの介入を必要とします。つまり、ユーザーが関数の事前/事後仕様やループ不変条件などのアサーションを入力することを期待しますが、この入力が与えられた後は、完全にまたはほぼ完全に自動化しようとします。この検証モードは、J King の検証器や Stanford Pascal 検証器などの 1970 年代の古典的な作品にまで遡ります。このスタイルの検証器は、最近、自動アクティブ検証と呼ばれています。これは、プログラマと型チェッカーのやり取りに類似した、アサート チェック ループを介して検証器とやり取りする方法を思い起こさせる用語です。
- 最初の分離ロジック検証ツールである Smallfoot は、この中間のカテゴリに属していました。ユーザーは、事前/事後仕様、ループ不変条件、およびロックのリソース不変条件を入力する必要がありました。また、シンボリック実行の方法と、フレーム公理を自動的に推論する方法を導入しました。Smallfoot には、並行分離ロジックが含まれていました。
- SmallfootRG は、並行プログラムの分離ロジックと従来の依存/保証方式の結合を検証するツールです。
- Heap Hop は、 Singularity (オペレーティング システム)の考え方に従って、メッセージ パッシングの分離ロジックを実装します。
- VeriFast は、中間カテゴリの高度な最新ツールです。オブジェクト指向パターンから高度な並行アルゴリズム、システム プログラムまで、さまざまな証明を実現しています。
- Viperは、許可ベース推論のための最先端の自動検証インフラストラクチャです。主にプログラミング言語と2つの検証バックエンドで構成されており、1つはシンボリック実行ベース、もう1つは検証条件生成(VCG)ベースです。[26] Viperインフラストラクチャに基づいて、さまざまなプログラミング言語用のフロントエンドがいくつか登場しています。Go用のGobra、Python用のNagini、Rust用のPrusti、C、Java、OpenCL、OpenMP用のVerCorsです。これらのフロントエンドは、フロントエンドのプログラミング言語をViperに変換し、Viper検証バックエンドを使用して入力プログラムの正しさを証明します。
- Mezzo プログラミング言語と非同期液体分離型には、プログラミング言語の型システムにおける CSL に関連するアイデアが含まれています。型システムに分離を含めるというアイデアについては、エイリアス型と干渉の構文制御で以前に例が示されています。
インタラクティブな検証者と中間の検証者との区別は明確ではありません。たとえば、Bedrock は、ほぼ自動の検証と呼ばれる高度な自動化を目指していますが、Verifast では、インタラクティブな検証者で使用される戦術 (小さなプログラム) に似た注釈が必要になることがあります。
決定可能性と複雑性
場所とデータのソートでパラメータ化された、量指定子のない多重ソートされた分離ロジックのフラグメントの充足可能性問題は、PSPACE完全であることが示されます。[27] DPLL(T)ベースのSMTソルバーでこのフラグメントを解くアルゴリズムは、 cvc5に統合されています。[28]この結果を拡張すると、解釈されないメモリ場所を持つ分離ロジックのBernays-Schönfinkelクラスの類似体の充足可能性もPSPACE完全であることが示されますが、解釈されるメモリ場所(整数など)や量指定子のさらなる交替では問題は決定不能です。[29]
参考文献
- ^ ab Reynolds, John C. (2002). 「分離ロジック: 共有可変データ構造のロジック」(PDF) . LICS .
- ^ Reynolds, John C. (1999)。「共有可変データ構造に関する直観主義的推論」。Davies , Jim、Roscoe, Bill、Woodcock, Jim (編)。Millennial Perspectives in Computer Science、1999 Oxford–Microsoft Symposium in Honour of Sir Tony Hoare の議事録。Palgrave 。
- ^ ab Ishtiaq, Samin; O'Hearn, Peter (2001). 「可変データ構造のアサーション言語としての BI」。プログラミング言語の原理に関する第 28 回 ACM SIGPLAN-SIGACT シンポジウムの議事録。ACM。pp . 14–26。doi :10.1145/ 360204.375719。ISBN 1581133367.S2CID 2652274 。
{{cite book}}:|journal=無視されました (ヘルプ) - ^ O'Hearn, Peter; Reynolds, John C.; Yang, Hongseok (2001). 「データ構造を変更するプログラムに関するローカル推論」CSL . CiteSeerX 10.1.1.29.1331 .
- ^ Burstall, RM (1972). 「データ構造を変更するプログラムを証明するいくつかの手法」.マシンインテリジェンス. 7 .
- ^ O'Hearn, PW; Pym, DJ (1999 年 6 月). 「束ねられた含意の論理」. Bulletin of Symbolic Logic . 5 (2): 215–244. CiteSeerX 10.1.1.27.4742 . doi :10.2307/421090. JSTOR 421090. S2CID 2948552.
- ^ O'Hearn, Peter (2019年2月). 「分離ロジック」. Commun. ACM . 62 (2): 86–95. doi : 10.1145/3211968 . ISSN 0001-0782.
- ^ Yang, Hongseok (2001). 「BI ポインター ロジックにおけるローカル推論の例: Schorr−Waite グラフ マーキング アルゴリズム」。第 1 回セマンティクス、プログラム分析、およびメモリ管理のためのコンピューティング環境に関するワークショップの議事録。
- ^ Hobor, Aquinas; Villard, Jules (2013). 「データ構造の共有の影響」(PDF) . ACM SIGPLAN Notices . 48 : 523–536. doi :10.1145/2480359.2429131.
- ^ Gardner, Philippa; Maffeis, Sergio; Smith, Hareth (2012). 「Java Script のプログラム ロジックに向けて」(PDF)。第 39 回 ACM SIGPLAN-SIGACT シンポジウム「プログラミング言語の原理」の議事録 - POPL '12。pp. 31–44。doi : 10.1145/2103656.2103663。hdl : 10044/1/ 33265。ISBN 9781450310833. S2CID 9571576。
- ^ O'Hearn, Peter (2007). 「リソース、並行性、ローカル推論」(PDF) .理論計算機科学. 375 (1–3): 271–307. doi : 10.1016/j.tcs.2006.12.035 .
- ^ Hoare, CAR (1972)。「並列プログラミングの理論に向けて」。オペレーティングシステムテクニック。Academic Press。
- ^ Brookes, Stephen (2007). 「並行分離ロジックのセマンティクス」(PDF) .理論計算機科学. 375 (1–3): 227–270. doi :10.1016/j.tcs.2006.12.034.
- ^ Dijkstra, Edsger W.協調する連続プロセス (EWD-123) (PDF) 。EW Dijkstra アーカイブ。テキサス大学オースティン校アメリカ歴史センター。(転写)(1965年9月)
- ^ Calcagno, Cristiano; O'Hearn, Peter W.; Yang, Hongseok (2007). 「ローカルアクションと抽象分離ロジック」(PDF) .第 22 回 IEEE コンピュータサイエンスにおけるロジックに関するシンポジウム (LICS 2007) . pp. 366–378. CiteSeerX 10.1.1.66.6337 . doi :10.1109/LICS.2007.30. ISBN 978-0-7695-2908-0. S2CID 1044254。
- ^ Dinsdale-Young, Thomas; Birkedal, Lars; Gardner, Philippa; Parkinson, Matthew; Yang, Hongseok (2013). 「Views」(PDF) . ACM SIGPLAN Notices . 48 : 287–300. doi :10.1145/2480359.2429104.
- ^ Sergey, Ilya; Nanevski, Aleksandar; Banerjee, Anindya (2015). 「履歴と主観性による並行アルゴリズムの指定と検証」(PDF) .第 24 回ヨーロッパプログラミングシンポジウム. arXiv : 1410.0306 . Bibcode :2014arXiv1410.0306S.
- ^ Gotsman, Alexey; Berdine, Josh; Cook, Byron; Sagiv, Mooly (2007). 「スレッド モジュラー形状解析」。検証、モデル検査、抽象解釈(PDF)。コンピュータ サイエンスの講義ノート。第 5403 巻。pp. 266–277。doi : 10.1007 / 978-3-540-93900-9_3。ISBN 978-3-540-93899-6。
{{cite book}}:|journal=無視されました (ヘルプ) - ^ 「2016 ゲーデル賞」。欧州理論計算機科学協会。 2022年8月29日閲覧。
- ^ 分離論理とバイアブダクション、ページ、Infer プロジェクト サイト。
- ^ Facebook Infer をオープンソース化: 出荷前にバグを特定。C Calcagno、D DIstefano、P O'Hearn。2015 年 6 月 11 日
- ^ FSCQ ファイル システムの認証にクラッシュ ホア ロジックを使用する、H Chen 他、SOSP'15
- ^ OpenSSL HMAC の正確性とセキュリティを検証しました。Lennart Beringer、Adam Petcher、Katherine Q. Ye、Andrew W. Appel。2015年 8 月の第 24 回 USENIX セキュリティ シンポジウムで発表
- ^ プリエンプティブ OS カーネルの実用的な検証フレームワーク。 Fengwei Xu、Ming Fu、Xinyu Feng、Xiaoran Zhang、Hui Zhang、Zhaohui Li:。 CAV 2016: 59-79
- ^ Ynotプロジェクトのホームページ、ハーバード大学、米国。
- ^ Viper: 許可ベース推論のための検証インフラストラクチャ、P. Müller、M. Schwerhoff、AJ Summers、VMCAI'16
- ^ Reynolds, Andrew; Iosif, Radu; Serban, Cristina; King, Tim (2016). 「SMT における分離ロジックの決定手順」 Artho, Cyrille; Legay, Axel; Peled, Doron (編)。検証と分析のための自動化技術。コンピュータサイエンスの講義ノート。Cham: Springer International Publishing。pp. 244–261。arXiv : 1603.06844。doi : 10.1007 /978-3-319-46520-3_16。ISBN 978-3-319-46520-3。
- ^ Barbosa, Haniel; Barrett, Clark; Brain, Martin; Kremer, Gereon; Lachnitt, Hanna; Mann, Makai; Mohamed, Abdalrhman; Mohamed, Mudathir; Niemetz, Aina; Nötzli, Andres; Ozdemir, Alex; Preiner, Mathias; Reynolds, Andrew; Sheng, Ying; Tinelli, Cesare (2022). 「cvc5: 多用途で産業用レベルの SMT ソルバー」。Fisman, Dana; Rosu, Grigore (編)。システムの構築と分析のためのツールとアルゴリズム。コンピュータサイエンスの講義ノート。Cham: Springer International Publishing。pp. 415–442。doi : 10.1007 / 978-3-030-99524-9_24。ISBN 978-3-030-99524-9。
- ^ レイノルズ、アンドリュー、イオシフ、ラドゥ、セルバン、クリスティーナ (2017)。「分離論理のベルネイス・シェーンフィンケル・ラムゼイ断片における推論」。ブアジャニ、アーメド、モニオー、デイヴィッド (編)。検証、モデル検査、抽象解釈。コンピュータサイエンスの講義ノート。チャム: シュプリンガー・インターナショナル・パブリッシング。pp. 462–482。doi :10.1007/ 978-3-319-52234-0_25。ISBN 978-3-319-52234-0。
