モデル検査の応用 徳田研究室 西村太一.

Slides:



Advertisements
Similar presentations
1 情報基礎 A 第 9 週 プログラミング入門 VBA の基本文法 1 準備・変数・データの入出力 徳山 豪・全 眞嬉 東北大学情報科学研究科 システム情報科学専攻 情報システム評価学分野.
Advertisements

OWL-Sを用いたWebアプリケーションの検査と生成
第12回 順序回路の解析方法 瀬戸 順序回路から,以下を導き、解析を行えるようにする タイムチャート 状態遷移関数・出力関数 状態遷移表
情報理工学部 情報システム工学科 ラシキアゼミ3年 H 岡田 貴大
プログラミング基礎I(再) 山元進.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
稚内北星学園大学 情報メディア学部 助教授 安藤 友晴
変数のスコープの設計判断能力 を育成するプログラミング教育
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
CSP記述によるモデル設計と ツールによる検証
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
第7回 条件による繰り返し.
2004年度 サマースクール in 稚内 JavaによるWebアプリケーション入門
2003年度 データベース論 安藤 友晴.
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
プログラムの制御構造 選択・繰り返し.
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
暗黙的に型付けされる構造体の Java言語への導入
7 ソフトウェア工学 Software Engineering モデル検査 MODEL CHECKING.
関数の定義.
第10回関数 Ⅱ (ローカル変数とスコープ).
SPINを用いたウェブアプリケーションにおける 階層別モデル検査支援方法
プログラミング入門2 第2回 型と演算 条件分岐 篠埜 功.
第7回 条件による繰り返し.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
社会シミュレーションのための モデル作成環境
通信機構合わせた最適化をおこなう並列化ンパイラ
データ構造とアルゴリズム論 第1章 アルゴリズムの表現-流れ図
動的データ依存関係解析を用いた Javaプログラムスライス手法
モデル検査(3) 手続き型言語に基づくモデリング
シナリオのアニメーション表示による 妥当性確認支援
関数への道.
プログラムの制御構造 配列・繰り返し.
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
モデル検査(5) CTLモデル検査アルゴリズム
JAVAバイトコードにおける データ依存解析手法の提案と実装
環境モデリングによるモデル検査スクリプトの自動生成
JavaScriptを含んだHTML文書に対する データフロー解析を用いた構文検証手法の提案
曲がった時空上の場の理論の熱的な性質と二次元CFT
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
Webアプリケーションと JSPの基本 ソフトウェア特論 第4回.
情報基礎Ⅱ (第1回) 月曜4限 担当:北川 晃.
4 形式的設計検証技術 検証 verification 形式的検証 (4.1.2)
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
ディペンダブル組込みシステムのためのコンテキスト分析手法
第5回 プログラミングⅡ 第5回
復習 if ~ 選択制御文(条件分岐) カッコが必要 true 条件 false 真(true)なら この中が aを2倍する 実行される
SMP/マルチコアに対応した 型付きアセンブリ言語
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
岩村雅一 知能情報工学演習I 第12回(後半第6回) 岩村雅一
ソフトウェア工学 知能情報学部 新田直也.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
skill-net(MILESTONE CAI,笈川他,1982)[Fortranの課題選択など]
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
Q q 情報セキュリティ 第7回:2005年5月27日(金) q q.
プログラミング1 プログラミング演習I 第2回.
オブジェクト指向メトリクスを用いた 開発支援に関する研究 --- VC++とMFCを用いた開発を対象として ---
復習 いろいろな変数型(2) char 1バイト → 英数字1文字を入れるのにぴったり アスキーコード → 付録 int
C言語講座 四則演算  if ,  switch 制御文.
知能情報工学演習I 第10回( C言語第4回) 課題の回答
第1章 文字の表示と計算 printfと演算子をやります.
= 55 課題6-1 #define _CRT_SECURE_NO_WARNINGS
Presentation transcript:

モデル検査の応用 徳田研究室 西村太一

目次 モデル検査とSPINついて 仕様の検証例 Cプログラムの検証例 問題点 プログラムをそのまま検査するツールの紹介

モデル検査とは ハードウェアやソフトウェアの「モデル」が形式仕様を満足するか検証 状態遷移系を網羅的にチェック 状態の組み合わせが爆発しないように数理論理学の手法を用いる 命題の記述には時相論理が使われることが多い

SPINとは Promelaという言語で状態遷移系を記述 日本語の本も出版されているくらいメジャー 命題は時相論理式で記述 シェルスクリプトに似た文法 日本語の本も出版されているくらいメジャー 命題は時相論理式で記述 [] p 今も将来もずっとpが成り立つ <> p 将来いずれpが成り立つ P U q qが成り立つまではpが成り立つ ->, <->, !, &&, ||

仕様の検証 仕様書に漏れがないか確認する 例として自動販売機の検証を行う

仕様書 静的な状態 コイン投入口、コイン返却口、商品取出口、電源がある 使用できる硬貨は100円硬貨のみ ジュースはAとBの2種類でどちらも1缶100円 ジュースの在庫量はそれぞれ5つずつ 貯蔵可能なコインの最大枚数は3枚 3つの状態を持つ 停電状態=電源OFF 待機状態=電源ON コイン投入状態=コインが投入されている状態

仕様書(2) 動的な振舞い 停電状態において電源がONにされた場合、待機状態に遷移 停電状態にコインが投入された場合は ジュースの在庫がともに0の場合は、投入されたコインをコイン返却口に返却し、待機状態を維持 どちらかのジュースの在庫がある場合、投入されたコインを貯蔵し、コイン投入状態に遷移 コイン投入状態においてさらにコインが投入された場合は 貯蔵したコインが3枚の場合、投入されたコインをコイン返却口に返しコイン投入状態を維持 3枚未満の場合は投入されたコインを貯蔵し、コイン投入状態を維持 コイン投入状態において購入ボタンが押された場合は… etc

Promelaコード(抜粋) if ::total==Unpower -> :: power==On -> total=Wait :: (power!=On) && coinIn==On -> rest=1; :: else -> skip fi ::total==Wait -> :: (power!=Off && coinIn==On && stkA==0 && stkB==0) -> rest=1; :: (power!=Off && coinIn==On && !(stkA==0 && stkB==0)) -> stkC++; total==CoinIn :: (power==Off) -> total=Unpower ::total==CoinIn -> :: (power!=Off && coinIn==On && stkC==3) -> rest=1

LTL式の例 停電状態において電源がONにされた場合、待機状態に遷移する []((total==Unpower && power==On) -> <>total==Wait) 待機状態においてコインが投入された場合、いずれかのジュースの在庫がある場合、コインを貯蔵しコイン投入状態に遷移する []((total==Wait && coinIn==On && !(stkA==0 && stkB==0)) -> <>(total==CoinIn && stkC==1)) コインを投入したら、必ず商品を得るかコインが戻ってくる [](coinIn==On -> <>(outlet!=No || rest!=0))

検証の結果 それぞれのLTL式に対して、validかinvalid、どちらかの結果が得られる コイン投入状態でAの在庫が0でBの在庫が1以上の場合、ボタンAが押されると何も起こらない。したがって「必ず商品を得るかコインが戻ってくる」とはいえない 電源Offとコイン投入が同時に発生した場合に、電源Offを優先すると、コイン投入の情報が失われてしまう ボタンAとボタンBが同時に押されたときの振る舞いも未定義

簡単なCプログラムの検証 次のようなプログラムに対して検査を行う 整数(1から1000まで)を入力する 入力した整数が6で割り切れれば“OK”を出力 入力した整数が6で割り切れなければ“NG”を出力

Cプログラム #include <stdio.h> main(){ int a; printf(“a = ? >>>”); scanf(“%d”, &a); if(a % 6 == 0){ printf(“OK\n”); }else{ printf(“NG\n”); }

Promelaコード mtype = {OK, NG, NT}; int seisu = 1; int a; mtype prt; active proctype p(){ prt = NT; do :: (seisu <= 1000) -> a=seisu; if ::(a % 6 == 0) -> prt = OK; prt = NT ::else -> prt = NG; fi; seisu++ ::else -> break od }

LTL式 [](p -> q) 6で割り切れるときには決してNGにはならない 6で割り切れないときには決してOKにはならない #define p (a % 6 == 0) #define q (prt != NG) 6で割り切れないときには決してOKにはならない #define p (a % 6 != 0) #define q (prt != OK)

問題点 元のCプログラムは、1から1000までという限定した値のみを受け取るようにはできていない 入力値が網羅的なので、状態組み合わせが爆発しがち この程度のテストであれば一般的なテストツールで十分 複数のスレッド間の並列動作の検証などではかなり有効

問題点(2) プログラムをPromelaコードに手作業で変換するのは面倒 Promelaコードを美しく書くのは非常に困難 『4日で学ぶモデル検査』に載っている例はコピペばかり XMLのように自動生成して使うもの?

Cプログラムをそのまま検査するツール BLAST SLAM 述語抽象化法でモデル検査 2つの定理証明器 SIMPLYFY と VAMPYREを使用 SLAM Microsoft製 Static Driver Verifierに含まれている 仕様記述言語SLICによって、APIの使用法が正しいかどうかを検証

Javaプログラムの検査 JPF(Java Path Finder) Bandera Bogor、JNuke Javaのバイトコードを検証 ソースコード中にアサーションや抽象化した述語変数などの注釈を埋め込む Bandera LTL式によって検証 SPIN、SMV、JPFといった外部のモデル検査器を利用 Bogor、JNuke