Upload
sosuke-moriguchi
View
495
Download
2
Embed Size (px)
DESCRIPTION
VST(Verifiable C)でCのプログラムを検証する・・・ための入り口 これ以降
Citation preview
VSTでCの検証を始められる入り口まで
@chiguri
森口 草介
ProofSummit2014御清聴誠に感謝しております!
お前誰だよ
• パンダ–雄鶏付き
• Coq
• 通称chiguri
• 今:関西学院大学–来年はどこだろう
•未定
ProofSummit2014御清聴誠に感謝しております!
ソフトウェア科学会大会で
• 普通(?)の研究発表をします。
ProofSummit2014御清聴誠に感謝しております!
7月某日
• :「Proof Summitのページ作った」
• chiguri:「あ、参加できそう」
ProofSummit2014御清聴誠に感謝しております!
つぶやきの数分後
• :「ProofSummitで話せ?」
• 「Yes, Sir!」
3割くらいフィクションです
ProofSummit2014御清聴誠に感謝しております!
気づいたら
• 3年目–一昨年:Coqの中身
–去年:Abella
• 今度のネタは・・・?
ProofSummit2014御清聴誠に感謝しております!
今日の話
VST
ProofSummit2014御清聴誠に感謝しております!
今日の話の流れ
• VSTってなに?
• VSTっておいしいの?
• VSTってどう使うの?
• 結局どうなの?
ProofSummit2014御清聴誠に感謝しております!
VSTって?
• 音楽のアレじゃなくて–それはVirtual Studio Technology
• Cプログラムのツール群–Verified Software Toolchainの略
–http://vst.cs.princeton.edu/
• Coqを使う
ProofSummit2014御清聴誠に感謝しております!
VSTの中身
• Verifiable C–今回はこの話
• VeriStar
• Verismall–Shape analysis用
• 右図はVST公式ページより引用
ProofSummit2014御清聴誠に感謝しております!
Verifiable Cってなに?
• 分離論理を用いたCプログラムの検証システム–分離論理ではなくプログラム論理と呼んでいるが、細かい差がよくわからないのでパス
–厳密にはC light
ProofSummit2014御清聴誠に感謝しております!
本
• Program Logics forCertified Compilers
ProofSummit2014御清聴誠に感謝しております!
つまりVSTとは
• C用(限らないけど)のツール–ただし正しさの検証済み
ProofSummit2014御清聴誠に感謝しております!
おいしそうなの?
• 他にも似たようなのありそうだけど、なんか違うの?
ProofSummit2014御清聴誠に感謝しております!
CoqにCといえば
• CompCert!
ProofSummit2014御清聴誠に感謝しております!
VSTでは
• Cから内部表現への変換にCompCertコンパイラを使用–出力だけじゃない!入力もだ!
ProofSummit2014御清聴誠に感謝しております!
VSTでは
• 分離論理の正当性の証明にCompCertでの意味論を使用–中身もだ!
ProofSummit2014御清聴誠に感謝しております!
VSTは
• CompCertにべったり!
ProofSummit2014御清聴誠に感謝しております!
VSTは
• なんかおいしそう?
• CompCertのおかげで信頼?–特に論理部分の信頼性があるのは大きい
ProofSummit2014御清聴誠に感謝しております!
どう使うのか
• まずCompCertコンパイラとVSTのコードをダウンロード–VST公式Webからどうぞ
• CompCertもリンクあり
–現時点でVSTの最新1.4
ProofSummit2014御清聴誠に感謝しております!
次に
• OCamlとCoqを準備–OCamlは4以降
–Coqは8.4以降
• Windows?VMを入れろくださいめんどくさい。
ProofSummit2014御清聴誠に感謝しております!
ビルド
• VSTのBUILDなんちゃらというファイルにありますので指示に従ってビルド
ProofSummit2014御清聴誠に感謝しております!
まずCompCert...
• 時間かかる–clightgenもお忘れなく
• C lightのコードをCoqのデータに落とすプログラム
ProofSummit2014御清聴誠に感謝しております!
次にVST...
• 時間かかる–めっさかかる
–Coqの速度向上キボンヌ!
ProofSummit2014御清聴誠に感謝しております!
やっと使える
• まず、Cのコードを準備する
ProofSummit2014御清聴誠に感謝しております!
clightgenでCoqのデータ
• clightgen hoge.c–includeディレクティブを入れると大体エラーで死ぬ
•処理はできているらしい
•ヘッダーは普通のgccを読みに行ったようだ
–CompCert用のどこかにある?
ProofSummit2014御清聴誠に感謝しております!
VSTで読み込み
• hoge.vをVSTフォルダにおいて開く
• coqide `cat .loadpath` hoge.v– .loadpathに「必要なモジュール類の
ある場所」と「CompCertコンパイラのモジュール」が指定されてる
• 開けましたね読めましたね
ProofSummit2014御清聴誠に感謝しております!
新しいファイルを読むときは
• そのCoqIDEから開く方が楽でしょう
ProofSummit2014御清聴誠に感謝しております!
け ん し ょ う
• できたファイルはCプログラムのCoq上での表現に過ぎない
• 正しさもなにもない
ProofSummit2014御清聴誠に感謝しております!
とりあえず動かす
• 0を返すだけの関数を定義–int zero(void) { return 0; }
–int main(void) { return zero(); }
• 仕様は特にないので、返し値が0であることを確かめるだけ
ProofSummit2014御清聴誠に感謝しております!
検証の流れ
• 仕様の定義
• 各関数の本体の検証
• 全体の検証–ただの組み合わせ
ProofSummit2014御清聴誠に感謝しております!
仕様の定義
• 関数の事前・事後条件
• 大域変数の条件
• ループ不変条件は検証時
ProofSummit2014御清聴誠に感謝しております!
仕様の書き方
• Definition hoge_spec :=DECLARE _hogeWITH Coqで使う変数PRE [ 引数 ] 事前条件POST [ rettype ] 事後条件
ProofSummit2014御清聴誠に感謝しております!
int zero(void)に対して
• Definition zero_spec :=DECLARE _zeroWITH u : unitPRE [ ]PROP () LOCAL () SEP ()
POST [ tint ]local (`(eq (Vint Int.zero))
retval).
ProofSummit2014御清聴誠に感謝しております!
事前条件
• PROP (P1; P2; …)LOCAL (Q1; Q2; …)SEP (R1; R2; …)– 順に、
Coqの命題のリスト(WITHで書いたCoqの変数に関する命題)、Cにおける局所変数(引数)の関係を表す述語のリスト、分離論理用の仮定• 変数の範囲などの条件をPROPに書き、LOCALに引数
とCoq上の変数との関係を書く• SEPはメモリ関係を記述• 今回はどれも特にないので、全部空
ProofSummit2014御清聴誠に感謝しております!
main関数の仕様
• 事前事後条件のテンプレートがある
• Definition main_spec :=DECLARE _mainWITH u : unitPRE [] main_pre prog uPOST [ tint ] main_post prog u.
ProofSummit2014御清聴誠に感謝しております!
本体の検証
• body_hoge :semax_body Vprog Gprog
f_hoge hoge_spec.
–Vprogは大域変数の条件• 型以外書いているケースがほとんどないため詳細がまだよくわからない
–Gprogは「各関数の仕様」• Vprog/Gprogはあらかじめリストとして定義する
ProofSummit2014御清聴誠に感謝しております!
今回の場合
• Definition Vprog : varspecs := nil.
• Definition Gprog : funspecs :=zero_spec::main_spec::nil.
• Lemma body_zero :semax_body Vprog Gprog
f_zero zero_spec.
ProofSummit2014御清聴誠に感謝しております!
証明に使うtactic• forward
– 先頭の文について分離論理の規則に基づいて解釈する– 代入文など、多くの文で実行できる
• 一部特化したtacticもある(以下)
• entailer– 証明するものが分離論理の式の場合、自動証明を試みる– 一部残る場合もある
• 整数の式などがあると残る
• forward_call– 関数呼び出しに対して使用– 引数を明示的に与える
• 配列などの場合対応するヒープなどを渡す必要がある• とりあえず型が分かりづらい
ProofSummit2014御清聴誠に感謝しております!
他
• forward_while–次がwhile文の場合に使用–パラメータとして不変条件が必要
• 不変条件の書き方は事前条件と同じ
• entailer!–entailerに比べて自動証明が強化され
ているようだが、残念ながら詳細不明–とりあえずentailerより先に使ってい
る
ProofSummit2014御清聴誠に感謝しております!
全体の検証
• 全ての関数について正しさが検証されているか– 組み込み関数が多数あるが、
semax_func_skipnで解決
– それぞれ検証したものはsemax_func_cons body_hogeでつなげ、semax_func_nilで終了• 全部tactic
ProofSummit2014御清聴誠に感謝しております!
え、例題他には?
• 提供されてるものはそれなりに読んだ(vst/prog内にいろいろ存在)が、自分で作るのはまだ辛い–Verifiable CのPDFは存在するが、
文法・論理の説明ばっかりで肝心の「どう仕様を書くか」がさっぱりだったりする
ProofSummit2014御清聴誠に感謝しております!
肝心の仕様の書き方は?
• まだ分からない範囲が広い–eqという述語すら例題から拾ってきた
• もっとドキュメント書いてほしい–作るしかないのか
ProofSummit2014御清聴誠に感謝しております!
構造体は?
• listの例がいくつか(progs/reverse.vやprogs/queue.v)あるので参照–progs/list_dt.vに様々な定理が記述されている
–簡単な例はprogs/nest2.vなどを参照
ProofSummit2014御清聴誠に感謝しております!
malloc/freeは?
• 外部関数として仕様を書きましょう–progs/queue.cなどを参照
ProofSummit2014御清聴誠に感謝しております!
結局どうなの?
• VSTいいんじゃない?–基盤も割としっかりしてる
–ツールの導入もそこそこ楽
•時間かかるけど
• ただし改善の余地がある–チュートリアルとドキュメント
ProofSummit2014御清聴誠に感謝しております!
要望は?
• ライブラリのページがほしい–coqdocで作ればいいんだけど
• チュートリアルほしいなあ–書くための情報がPDFのいろんな節に
またがっていて、自分ではかけない
• 個人的にはcoqtopのラッパーか何かを作って、より検証に専念できるようにしてほしいところ
ProofSummit2014御清聴誠に感謝しております!
最後に一言
• Coqのタグジャンプほしい–どこで定義されてるかさっぱり分からない
• 知ってる人いたら情報ください–Coqdoc使えという指摘!
ProofSummit2014御清聴誠に感謝しております!
御清聴誠に感謝しました!
日本語がおかしい?いや知りませんよ。