SlideShare ist ein Scribd-Unternehmen logo
1 von 49
Downloaden Sie, um offline zu lesen
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のデータ 
•clightgenhoge.c 
–includeディレクティブを入れると 大体エラーで死ぬ 
•処理はできているらしい 
•ヘッダーは普通のgccを読みに行った ようだ 
–CompCert用のどこかにある? 
ProofSummit2014 
御清聴誠に感謝しております!
VSTで読み込み 
•hoge.vをVSTフォルダにおいて 開く 
•coqide`cat .loadpath` hoge.v 
–.loadpathに「必要なモジュール類の ある場所」と「CompCertコンパイラ のモジュール」が指定されてる 
•開けましたね読めましたね 
ProofSummit2014 
御清聴誠に感謝しております!
新しいファイルを 読むときは 
•そのCoqIDEから開く方が楽で しょう 
ProofSummit2014 
御清聴誠に感謝しております!
けんしょう 
•できたファイルは CプログラムのCoq上での表現 に過ぎない 
•正しさもなにもない 
ProofSummit2014 
御清聴誠に感謝しております!
とりあえず動かす 
•0を返すだけの関数を定義 
–intzero(void) { return 0; } 
–intmain(void) { return zero(); } 
•仕様は特にないので、返し値 が0であることを確かめるだけ 
ProofSummit2014 
御清聴誠に感謝しております!
検証の流れ 
•仕様の定義 
•各関数の本体の検証 
•全体の検証 
–ただの組み合わせ 
ProofSummit2014 
御清聴誠に感謝しております!
仕様の定義 
•関数の事前・事後条件 
•大域変数の条件 
•ループ不変条件は検証時 
ProofSummit2014 
御清聴誠に感謝しております!
仕様の書き方 
•Definition hoge_spec:= DECLARE _hogeWITH Coqで使う変数 PRE [ 引数] 事前条件 POST [ rettype] 事後条件 
ProofSummit2014 
御清聴誠に感謝しております!
intzero(void)に対して 
•Definition zero_spec:= DECLARE_zeroWITH u : unitPRE [ ] PROP () LOCAL () SEP () POST [ tint ] local (`(eq(VintInt.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_preproguPOST [ tint ] main_postprogu. 
ProofSummit2014 
御清聴誠に感謝しております!
本体の検証 
•body_hoge: semax_body Vprog Gprogf_hogehoge_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_consbody_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 
御清聴誠に感謝しております!
御清聴誠に感謝しました! 
日本語がおかしい?いや知りませんよ。

Weitere ähnliche Inhalte

Mehr von Sosuke MORIGUCHI

Nagoya Matsuri 2013 ぐだぐだAgda
Nagoya Matsuri 2013 ぐだぐだAgdaNagoya Matsuri 2013 ぐだぐだAgda
Nagoya Matsuri 2013 ぐだぐだAgdaSosuke MORIGUCHI
 
ProofSummit2013 べらべらAbella
ProofSummit2013 べらべらAbellaProofSummit2013 べらべらAbella
ProofSummit2013 べらべらAbellaSosuke MORIGUCHI
 
Curry-Howard同型から単純型付ラムダ計算の項を作る
Curry-Howard同型から単純型付ラムダ計算の項を作るCurry-Howard同型から単純型付ラムダ計算の項を作る
Curry-Howard同型から単純型付ラムダ計算の項を作るSosuke MORIGUCHI
 

Mehr von Sosuke MORIGUCHI (7)

fibsを読む
fibsを読むfibsを読む
fibsを読む
 
Nagoya Matsuri 2013 ぐだぐだAgda
Nagoya Matsuri 2013 ぐだぐだAgdaNagoya Matsuri 2013 ぐだぐだAgda
Nagoya Matsuri 2013 ぐだぐだAgda
 
ProofSummit2013 べらべらAbella
ProofSummit2013 べらべらAbellaProofSummit2013 べらべらAbella
ProofSummit2013 べらべらAbella
 
A/F/C-orientation
A/F/C-orientationA/F/C-orientation
A/F/C-orientation
 
Proof Summit 2012
Proof Summit 2012Proof Summit 2012
Proof Summit 2012
 
Curry-Howard同型から単純型付ラムダ計算の項を作る
Curry-Howard同型から単純型付ラムダ計算の項を作るCurry-Howard同型から単純型付ラムダ計算の項を作る
Curry-Howard同型から単純型付ラムダ計算の項を作る
 
Cartesian Closed Category
Cartesian Closed CategoryCartesian Closed Category
Cartesian Closed Category
 

ProofSummit2014 : VSTでCの検証