メモリ 管理コードの包括的検証の ための階層化された

メモリ管理コードの包括的検証の
ための階層化されたメモリモデル
吉野 寿宏, 前田 俊行, 米澤 明憲
(東京大学 情報理工学系研究科)
背景

これまでのプログラム検証では、メモリ管理コードは
ア・プリオリに与えられてきた
• たとえば GC に依存していたり、
• 明示的な new, free があってもそれ自体は言語にビルト
インであったり
• Alias Types, Region-based Memory Management

それに対し、メモリ管理ルーチン自体を検証しようと
いう研究が近年提案されている
• TALK [Maeda et al. ’06]
• Separation Logic による Topsy ヒープマネージャの正当
性証明 [Nicolas et al. ’06]
しかし

ユーザのコードにもメモリ管理ルーチン用の理論を
そのまま適用することは正しいのだろうか?
• メモリ管理ルーチンとユーザコードに、それぞれ専用の
システムが必要なのは好ましくない
• 既存研究ではメモリ管理専用の拡張を行っているものが
多いが、そのままユーザプログラムに応用できるか?
• たとえばリンク済みバイナリ全体を検証する場合
• ユーザプログラム側が独自でメモリ管理ルーチンを
持っている場合もある
• 言語処理系などを相手にする場合には特によくあること
そこで本研究では

OS の特権階層にヒントを得て、階層化
されたメモリモデルを設計する
• メモリ操作を包括的に検証するための理論を
構築することを目標
• メモリ管理ルーチンからユーザプログラムまでを
モデル化
• プロトタイプの意味論、型システムの設計を
行った
階層化されたメモリモデル

プログラムは、いくつかのモジュールから構成
• OS カーネル、libc (特にメモリ管理ルーチン)、
ユーザプログラム など

それらのモジュールを「階層」と考え、メモリ割り当て、
解放を階層間インタラクションと捉える
cf. リングプロテクションとシステムコール
階層化されたメモリモデル
malloc/free の作る階層
メモリ割り当ては、自分の管理しているメモリ
を下位階層へ分譲することとして解釈できる
 解放は逆に、分譲していた領域の回収

OS
libc
malloc call
ユーザ
プログラム
memory return
階層化されたメモリモデル
malloc/free の作る階層

この各階層は隔離されている必要
• メモリブロックは各層で固有の意味を持って利用される (上位で利用
をトレースする必要はない)
• 上位には管理情報などが存在し、下位からはアクセスされたくない
管理情報: 下位階層
からはアクセス不可能
OS
libc
ユーザ
プログラム
…
int[2]
メモリをどう使うかは割り当
てられた側の自由
…
割り当てた側は関知しない
inet_addr[8]
言語・型システムの
プロトタイプの設計

Alias Type[Walker et al. ‘00] をベースに
• メモリの明示的管理、型の strong update に
対応
• CPS スタイルの関数呼び出し
• Constraint の部分を、location と layer に関する
記述に拡張することで実現できる
• 新しい操作として、export, unexport を導入
• export がメモリブロックを他レイヤに与え、unexport
で奪う
言語・型システムのプロトタイプの設計
構文定義
Alias Type の Heap
Constraint にレイヤ情報追加
関数にも実行レイヤ情報付加
どのレイヤから割り当てられた
か(origin)、また現在の所有者
(ownership)を識別
言語・型システムのプロトタイプの設計
静的意味論 (抜粋)
逆操作
所有権の確認
逆操作
言語・型システムのプロトタイプの設計
静的意味論 (抜粋)
読み込みは誰でも可能
所有者のみが書き込める
このモデルの性質 (1/2)

各階層ごとのメモリ割り当てについては、
containment が成り立つ
• 上位階層の持つメモリ ⊇ 下位階層の持つメモリ
• 同一のブロックについては委譲関係がリスト(origin 情報
をたどれる)になっている
• 現在の定式化では委譲関係を覚えておく必要がある
• また同一ブロックの所有者(ownership = +)は常にただ
ひとつの階層のみ

new-free の対応、export-unexport の対応が
つけられる
このモデルの性質 (2/2)

各階層ごとに、同一メモリブロックに対して
異なるビューが持てる
• ポインタを、上位から見ると int に見えたりする
• 階層間の隔離の緩和を定式化している
• Strong update 時には、他のレイヤの invariant
を壊さないように注意
• 現在の定式化では、int 型が subtyping relation に
おける top 型に相当
• 現在他のレイヤでは int になっていることを制約として
強制
Future Work (1/2)

レイヤに対して順序構造の導入
• 関数に呼び出し特権レベルなどを記述
• 順序構造に関する制約記述ができるように
• モジュール化
• existential type の応用でできる

応用について考える
• たとえば conservative GC の管理ルーチンの検証に
応用することができると考えている
• GC Safety を証明するには、reachability の概念が必要になる
ので、そのための拡張が必要
• その他に記述できるような性質はないか?
Future Work (2/2)

上位に int 以外でのビューを提供
• どういった形の invariant が書けるか?

Recursive Type, Union Type などの導入
• coercion においてレイヤ情報をどうやって保持するか

Dependent Type の導入
• split, concat による領域分割・結合
• より現実的なメモリ管理コードをチェックできるようになる
Related Work

Region-based Memory Management
[Tofte, Talpin ’97]
• メモリを Region という単位に分けて管理するという
アイデアを提唱

Capability Calculus [Crary et al. ‘99]
• 上記の研究を拡張し、Capability という概念を用いること
でメモリ管理を明示的に行うコードに型をつける
• Capability ≒ 領域へのアクセス権限
• メモリ操作には capability を持っている必要
• そのため関数引数などに明示的に引き渡される
• 複数のビューを持ったりはできない