49
VSTでCの検証 を始められる入り口まで @chiguri 森口 草介 ProofSummit2014 御清聴誠に感謝しております!

ProofSummit2014 : VSTでCの検証

Embed Size (px)

DESCRIPTION

VST(Verifiable C)でCのプログラムを検証する・・・ための入り口 これ以降

Citation preview

Page 1: ProofSummit2014 : VSTでCの検証

VSTでCの検証を始められる入り口まで

@chiguri

森口 草介

ProofSummit2014御清聴誠に感謝しております!

Page 2: ProofSummit2014 : VSTでCの検証

お前誰だよ

• パンダ–雄鶏付き

• Coq

• 通称chiguri

• 今:関西学院大学–来年はどこだろう

•未定

ProofSummit2014御清聴誠に感謝しております!

Page 3: ProofSummit2014 : VSTでCの検証

ソフトウェア科学会大会で

• 普通(?)の研究発表をします。

ProofSummit2014御清聴誠に感謝しております!

Page 4: ProofSummit2014 : VSTでCの検証

7月某日

• :「Proof Summitのページ作った」

• chiguri:「あ、参加できそう」

ProofSummit2014御清聴誠に感謝しております!

Page 5: ProofSummit2014 : VSTでCの検証

つぶやきの数分後

• :「ProofSummitで話せ?」

• 「Yes, Sir!」

3割くらいフィクションです

ProofSummit2014御清聴誠に感謝しております!

Page 6: ProofSummit2014 : VSTでCの検証

気づいたら

• 3年目–一昨年:Coqの中身

–去年:Abella

• 今度のネタは・・・?

ProofSummit2014御清聴誠に感謝しております!

Page 7: ProofSummit2014 : VSTでCの検証

今日の話

VST

ProofSummit2014御清聴誠に感謝しております!

Page 8: ProofSummit2014 : VSTでCの検証

今日の話の流れ

• VSTってなに?

• VSTっておいしいの?

• VSTってどう使うの?

• 結局どうなの?

ProofSummit2014御清聴誠に感謝しております!

Page 9: ProofSummit2014 : VSTでCの検証

VSTって?

• 音楽のアレじゃなくて–それはVirtual Studio Technology

• Cプログラムのツール群–Verified Software Toolchainの略

–http://vst.cs.princeton.edu/

• Coqを使う

ProofSummit2014御清聴誠に感謝しております!

Page 10: ProofSummit2014 : VSTでCの検証

VSTの中身

• Verifiable C–今回はこの話

• VeriStar

• Verismall–Shape analysis用

• 右図はVST公式ページより引用

ProofSummit2014御清聴誠に感謝しております!

Page 11: ProofSummit2014 : VSTでCの検証

Verifiable Cってなに?

• 分離論理を用いたCプログラムの検証システム–分離論理ではなくプログラム論理と呼んでいるが、細かい差がよくわからないのでパス

–厳密にはC light

ProofSummit2014御清聴誠に感謝しております!

Page 12: ProofSummit2014 : VSTでCの検証

• Program Logics forCertified Compilers

ProofSummit2014御清聴誠に感謝しております!

Page 13: ProofSummit2014 : VSTでCの検証

つまりVSTとは

• C用(限らないけど)のツール–ただし正しさの検証済み

ProofSummit2014御清聴誠に感謝しております!

Page 14: ProofSummit2014 : VSTでCの検証

おいしそうなの?

• 他にも似たようなのありそうだけど、なんか違うの?

ProofSummit2014御清聴誠に感謝しております!

Page 15: ProofSummit2014 : VSTでCの検証

CoqにCといえば

• CompCert!

ProofSummit2014御清聴誠に感謝しております!

Page 16: ProofSummit2014 : VSTでCの検証

VSTでは

• Cから内部表現への変換にCompCertコンパイラを使用–出力だけじゃない!入力もだ!

ProofSummit2014御清聴誠に感謝しております!

Page 17: ProofSummit2014 : VSTでCの検証

VSTでは

• 分離論理の正当性の証明にCompCertでの意味論を使用–中身もだ!

ProofSummit2014御清聴誠に感謝しております!

Page 18: ProofSummit2014 : VSTでCの検証

VSTは

• CompCertにべったり!

ProofSummit2014御清聴誠に感謝しております!

Page 19: ProofSummit2014 : VSTでCの検証

VSTは

• なんかおいしそう?

• CompCertのおかげで信頼?–特に論理部分の信頼性があるのは大きい

ProofSummit2014御清聴誠に感謝しております!

Page 20: ProofSummit2014 : VSTでCの検証

どう使うのか

• まずCompCertコンパイラとVSTのコードをダウンロード–VST公式Webからどうぞ

• CompCertもリンクあり

–現時点でVSTの最新1.4

ProofSummit2014御清聴誠に感謝しております!

Page 21: ProofSummit2014 : VSTでCの検証

次に

• OCamlとCoqを準備–OCamlは4以降

–Coqは8.4以降

• Windows?VMを入れろくださいめんどくさい。

ProofSummit2014御清聴誠に感謝しております!

Page 22: ProofSummit2014 : VSTでCの検証

ビルド

• VSTのBUILDなんちゃらというファイルにありますので指示に従ってビルド

ProofSummit2014御清聴誠に感謝しております!

Page 23: ProofSummit2014 : VSTでCの検証

まずCompCert...

• 時間かかる–clightgenもお忘れなく

• C lightのコードをCoqのデータに落とすプログラム

ProofSummit2014御清聴誠に感謝しております!

Page 24: ProofSummit2014 : VSTでCの検証

次にVST...

• 時間かかる–めっさかかる

–Coqの速度向上キボンヌ!

ProofSummit2014御清聴誠に感謝しております!

Page 25: ProofSummit2014 : VSTでCの検証

やっと使える

• まず、Cのコードを準備する

ProofSummit2014御清聴誠に感謝しております!

Page 26: ProofSummit2014 : VSTでCの検証

clightgenでCoqのデータ

• clightgen hoge.c–includeディレクティブを入れると大体エラーで死ぬ

•処理はできているらしい

•ヘッダーは普通のgccを読みに行ったようだ

–CompCert用のどこかにある?

ProofSummit2014御清聴誠に感謝しております!

Page 27: ProofSummit2014 : VSTでCの検証

VSTで読み込み

• hoge.vをVSTフォルダにおいて開く

• coqide `cat .loadpath` hoge.v– .loadpathに「必要なモジュール類の

ある場所」と「CompCertコンパイラのモジュール」が指定されてる

• 開けましたね読めましたね

ProofSummit2014御清聴誠に感謝しております!

Page 28: ProofSummit2014 : VSTでCの検証

新しいファイルを読むときは

• そのCoqIDEから開く方が楽でしょう

ProofSummit2014御清聴誠に感謝しております!

Page 29: ProofSummit2014 : VSTでCの検証

け ん し ょ う

• できたファイルはCプログラムのCoq上での表現に過ぎない

• 正しさもなにもない

ProofSummit2014御清聴誠に感謝しております!

Page 30: ProofSummit2014 : VSTでCの検証

とりあえず動かす

• 0を返すだけの関数を定義–int zero(void) { return 0; }

–int main(void) { return zero(); }

• 仕様は特にないので、返し値が0であることを確かめるだけ

ProofSummit2014御清聴誠に感謝しております!

Page 31: ProofSummit2014 : VSTでCの検証

検証の流れ

• 仕様の定義

• 各関数の本体の検証

• 全体の検証–ただの組み合わせ

ProofSummit2014御清聴誠に感謝しております!

Page 32: ProofSummit2014 : VSTでCの検証

仕様の定義

• 関数の事前・事後条件

• 大域変数の条件

• ループ不変条件は検証時

ProofSummit2014御清聴誠に感謝しております!

Page 33: ProofSummit2014 : VSTでCの検証

仕様の書き方

• Definition hoge_spec :=DECLARE _hogeWITH Coqで使う変数PRE [ 引数 ] 事前条件POST [ rettype ] 事後条件

ProofSummit2014御清聴誠に感謝しております!

Page 34: ProofSummit2014 : VSTでCの検証

int zero(void)に対して

• Definition zero_spec :=DECLARE _zeroWITH u : unitPRE [ ]PROP () LOCAL () SEP ()

POST [ tint ]local (`(eq (Vint Int.zero))

retval).

ProofSummit2014御清聴誠に感謝しております!

Page 35: ProofSummit2014 : VSTでCの検証

事前条件

• PROP (P1; P2; …)LOCAL (Q1; Q2; …)SEP (R1; R2; …)– 順に、

Coqの命題のリスト(WITHで書いたCoqの変数に関する命題)、Cにおける局所変数(引数)の関係を表す述語のリスト、分離論理用の仮定• 変数の範囲などの条件をPROPに書き、LOCALに引数

とCoq上の変数との関係を書く• SEPはメモリ関係を記述• 今回はどれも特にないので、全部空

ProofSummit2014御清聴誠に感謝しております!

Page 36: ProofSummit2014 : VSTでCの検証

main関数の仕様

• 事前事後条件のテンプレートがある

• Definition main_spec :=DECLARE _mainWITH u : unitPRE [] main_pre prog uPOST [ tint ] main_post prog u.

ProofSummit2014御清聴誠に感謝しております!

Page 37: ProofSummit2014 : VSTでCの検証

本体の検証

• body_hoge :semax_body Vprog Gprog

f_hoge hoge_spec.

–Vprogは大域変数の条件• 型以外書いているケースがほとんどないため詳細がまだよくわからない

–Gprogは「各関数の仕様」• Vprog/Gprogはあらかじめリストとして定義する

ProofSummit2014御清聴誠に感謝しております!

Page 38: ProofSummit2014 : VSTでCの検証

今回の場合

• Definition Vprog : varspecs := nil.

• Definition Gprog : funspecs :=zero_spec::main_spec::nil.

• Lemma body_zero :semax_body Vprog Gprog

f_zero zero_spec.

ProofSummit2014御清聴誠に感謝しております!

Page 39: ProofSummit2014 : VSTでCの検証

証明に使うtactic• forward

– 先頭の文について分離論理の規則に基づいて解釈する– 代入文など、多くの文で実行できる

• 一部特化したtacticもある(以下)

• entailer– 証明するものが分離論理の式の場合、自動証明を試みる– 一部残る場合もある

• 整数の式などがあると残る

• forward_call– 関数呼び出しに対して使用– 引数を明示的に与える

• 配列などの場合対応するヒープなどを渡す必要がある• とりあえず型が分かりづらい

ProofSummit2014御清聴誠に感謝しております!

Page 40: ProofSummit2014 : VSTでCの検証

• forward_while–次がwhile文の場合に使用–パラメータとして不変条件が必要

• 不変条件の書き方は事前条件と同じ

• entailer!–entailerに比べて自動証明が強化され

ているようだが、残念ながら詳細不明–とりあえずentailerより先に使ってい

ProofSummit2014御清聴誠に感謝しております!

Page 41: ProofSummit2014 : VSTでCの検証

全体の検証

• 全ての関数について正しさが検証されているか– 組み込み関数が多数あるが、

semax_func_skipnで解決

– それぞれ検証したものはsemax_func_cons body_hogeでつなげ、semax_func_nilで終了• 全部tactic

ProofSummit2014御清聴誠に感謝しております!

Page 42: ProofSummit2014 : VSTでCの検証

え、例題他には?

• 提供されてるものはそれなりに読んだ(vst/prog内にいろいろ存在)が、自分で作るのはまだ辛い–Verifiable CのPDFは存在するが、

文法・論理の説明ばっかりで肝心の「どう仕様を書くか」がさっぱりだったりする

ProofSummit2014御清聴誠に感謝しております!

Page 43: ProofSummit2014 : VSTでCの検証

肝心の仕様の書き方は?

• まだ分からない範囲が広い–eqという述語すら例題から拾ってきた

• もっとドキュメント書いてほしい–作るしかないのか

ProofSummit2014御清聴誠に感謝しております!

Page 44: ProofSummit2014 : VSTでCの検証

構造体は?

• listの例がいくつか(progs/reverse.vやprogs/queue.v)あるので参照–progs/list_dt.vに様々な定理が記述されている

–簡単な例はprogs/nest2.vなどを参照

ProofSummit2014御清聴誠に感謝しております!

Page 45: ProofSummit2014 : VSTでCの検証

malloc/freeは?

• 外部関数として仕様を書きましょう–progs/queue.cなどを参照

ProofSummit2014御清聴誠に感謝しております!

Page 46: ProofSummit2014 : VSTでCの検証

結局どうなの?

• VSTいいんじゃない?–基盤も割としっかりしてる

–ツールの導入もそこそこ楽

•時間かかるけど

• ただし改善の余地がある–チュートリアルとドキュメント

ProofSummit2014御清聴誠に感謝しております!

Page 47: ProofSummit2014 : VSTでCの検証

要望は?

• ライブラリのページがほしい–coqdocで作ればいいんだけど

• チュートリアルほしいなあ–書くための情報がPDFのいろんな節に

またがっていて、自分ではかけない

• 個人的にはcoqtopのラッパーか何かを作って、より検証に専念できるようにしてほしいところ

ProofSummit2014御清聴誠に感謝しております!

Page 48: ProofSummit2014 : VSTでCの検証

最後に一言

• Coqのタグジャンプほしい–どこで定義されてるかさっぱり分からない

• 知ってる人いたら情報ください–Coqdoc使えという指摘!

ProofSummit2014御清聴誠に感謝しております!

Page 49: ProofSummit2014 : VSTでCの検証

御清聴誠に感謝しました!

日本語がおかしい?いや知りませんよ。