annotate resume/master_resume.tex @ 20:97f508fb5bf2

*** empty log message ***
author atsuki
date Wed, 20 Feb 2008 05:53:14 +0900
parents aadf38a2deb2
children d66662b295ba
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
19
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
1 \documentclass[twocolumn, a4j, twoside]{jarticle}
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
2 \usepackage{master_proc}
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
3 \usepackage[dvips]{graphicx}
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
4
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
5 % dvipdfm を使って PDF ファイルに日本語の栞をつける
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
6 % \usepackage[dvipdfm]{color}
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
7 % \usepackage[dvipdfm,bookmarks=true,bookmarksnumbered=true,%
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
8 % bookmarkstype=toc]{hyperref}
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
9
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
10 \jtitle{線形時相論理によるContinuation based Cプログラムの検証} %和文タイトル
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
11 \etitle{Verification of Continuation based C Program using Linear-time Temporal Logic} %英文タイトル
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
12 \author{下地 篤樹} %著者名
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
13 \studentid{068507B} %学籍番号
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
14 \teacher{河野 真治} %指導教官
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
15
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
16 \begin{document}
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
17 \maketitle
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
18 \section{はじめに}
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
19 リアルタイムプログラムや並列プログラムのような非決定性を含むプログラムは、
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
20 逐次型のプログラムに有効な二分法などによるデバッグ手法ではデバッグすることが
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
21 困難である。
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
22 そのため、非決定性を含むプログラムに対して有効なデバッグ手法や検証手法の
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
23 確立が重要な課題となっている。
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
24
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
25 そこで、本研究では、Continuation based C(CbC)言語による実装と
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
26 その実装に対する検証手法を提案している。
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
27 CbCは、C言語より下位でアセンブラより上位のプログラミング言語である。
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
28 また、CbCで記述されたプログラムは状態遷移記述になるという性質がある。
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
29
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
30 本研究は、CbCプログラムが状態遷移記述になることに着目し、
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
31 状態遷移記述に対して有効である、タブロー法による状態の展開を行い、
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
32 状態を展開する際に、線形時相論理も同時に展開することにより検証を行う。
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
33 検証において、時相論理はシステムの要求仕様を記述する方法として形式的検証で利用さ
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
34 れる。
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
35
20
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
36 \section{Continuation based Cの概要}
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
37 CbC は、C言語を制限したもので、機械依存性の無いアセンブラのような構成になっており、
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
38 C言語からループ制御構造と、サブルーチン・コールを取り除き、継続を導入した言語である。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
39 この言語は、C言語に継続専用のプログラム単位であるコード(code)と、
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
40 継続(goto)を導入した構成となっている。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
41 継続とは、次に実行すべきコードを直接または間接的に指定する手法である。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
42 CbC は、サブルーチンよりも小さいプログラム単位であるコードを導入しているため、
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
43 C言語よりも細かく、アセンブラよりも高度な記述が可能であるという利点がある。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
44
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
45 CbCはコードセグメントを引数付きgoto文で接続することで継続を実現している。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
46 コードセグメントとは、codeという型で定義されるプログラム単位である。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
47 原則として、このコードセグメントへの遷移は引数付きgoto文によってのみ行われる。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
48 また、コードセグメントからの脱出も引数付きgoto文によってのみ行われる。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
49 つまり、CbCプログラムは、複数のコードセグメントが引数付きgoto文で接続された構造になる。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
50
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
51 CbCのコードセグメントと引数付きgoto文、ifはそれぞれオートマトンの状態と状態遷移および
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
52 遷移条件に対応しており、CbCプログラムは状態遷移記述であると言える。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
53 また、CbCにおける並列動作はコードセグメント単位となる。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
54
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
55 CbCはC言語の下位言語であるが、C言語のサブルーチンへ戻るための環境付き継続を
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
56 導入することでC言語の上位言語となる。この言語をCwC(C with Continuation)と呼ぶ。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
57 CwCでは、CbCから通常のC言語の関数を呼び出すことができる。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
58
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
59 \section{他の検証ツール}
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
60 有限状態遷移系に対する形式的検査手法としてモデル検査手法がある。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
61 その代表的なツールとしてSPINとJava PathFinder(JPF)があげられる。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
62
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
63 SPINは、プログラム変換的な手法で検証するツールで、
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
64 検証対象をPROMELA(PROcess MEta LAnguage)という言語で記述し、
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
65 それを基にC言語で記述された検証器を生成するものである。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
66 チャネルを使っての通信や並列動作する有限オートマトンのモデル検査が可能である。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
67 SPINでは、アサーション、デッドロック、到達性、進行制、LTL式の
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
68 性質について検査することができる。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
69 また、SPINの並列動作はステートメント単位となる。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
70
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
71 JPFは、実行可能なJavaのバイトコードを検証するためのシステムである。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
72 バイトコードを状態遷移モデルとして扱い、
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
73 実行時に遷移し得る状態を網羅的に検査することにより、デッドロックを検知したり、
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
74 キャッチされていない例外(NullPointerExceptionやAssertionErrorなど)を
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
75 検出することができる。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
76 JPFで検査できる性質として、アサーション、デッドロック、キャッチされていない例外
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
77 があげられる。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
78
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
79 また、JPFはJVMベースであるため、複数のプロセスの取扱いができない。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
80 他にも、実用規模のプログラムは一般的に状態空間が巨大であるため、
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
81 直接実行することはできない。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
82 そのため、プログラムの一部を抜き出して、
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
83 それに対してデバッグをするのに使用される。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
84 他にも、Javaを仕様記述言語としてプロトコルの検証などに用いられる。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
85 JPFの並列動作はスレッド単位となる。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
86 \section{実装}
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
87 検証用のサンプルプログラムとしてDining Philosophers Problemを用いる。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
88 これは資源共有問題の一つで、次のような内容である。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
89 5人の哲学者が円卓についており、それぞれ思索と食事を交互に繰り返す。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
90 円卓には5本のフォークが置かれており、哲学者は左右のフォーク2本を使って食事をする。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
91 フォークが取れない場合はフォークが空くのを待つ。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
92 この問題では、すべての哲学者が一斉に左手でフォークを取るとデッドロックが起きる。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
93 例として、左手でフォークを取るコードセグメントを示す。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
94 {\footnotesize
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
95 \begin{verbatim}
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
96 code pickup_lfork(PhilsPtr self)
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
97 {
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
98 if (self->left_fork->owner == NULL) {
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
99 self->left_fork->owner = self;
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
100 goto pickup_rfork(self);
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
101 } else {
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
102 goto pickup_lfork(self);
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
103 }
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
104 }
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
105 \end{verbatim}
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
106 }
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
107 codeがコードセグメントの定義であり、
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
108 コードセグメントの引数部分をインターフェースと呼ぶ。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
109 このコードセグメントは左手でフォークが取れた場合は、
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
110 右手でフォークを取るコードセグメントへ遷移する。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
111 取れなかった場合は、またこのコードセグメントへ遷移する。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
112
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
113 次に、タブロー法による状態の展開の実装について説明する。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
114 タブロー法による状態の展開をタブロー展開と呼ぶ。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
115
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
116 CbCプログラムのタブロー展開の特徴として、
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
117 プログラムの可能な実行の組み合わせすべてを調べる、
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
118 プログラムの状態を展開するために状態の探索をDepth First Search(DFS)で行う、
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
119 プログラムの実行によって生成される状態は木構造で記録する、
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
120 同じ状態はすべて共有することでメモリ消費を減らす、
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
121 があげられる。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
122
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
123 まず、最初に状態として扱うすべての変数をBinary Tree構造で記録する。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
124 そして、検証対象のプログラムのコードセグメントを実行して、
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
125 実行に伴う状態の変化をBinary Tree構造で記録していく。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
126 このBinary Treeを状態データベースと呼ぶ。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
127 すべての可能な実行の組み合わせを実行しながらそのときの状態を
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
128 状態データベースに登録していくことで状態を展開する。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
129
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
130 以下にタブロー展開を行うためのタブローコードセグメントを示す。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
131 {\footnotesize
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
132 \begin{verbatim}
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
133 code tableau(TaskPtr list)
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
134 {
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
135 StateDB out;
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
136 if (lookup_StateDB(&st, &state_db, &out)) {
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
137 while(!(list=next_task_iterator(task_iter))) {
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
138 TaskIteratorPtr prev_iter=task_iter->prev;
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
139 if (!prev_iter) {
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
140 memory_usage();
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
141 goto ret(0),env;
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
142 }
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
143 free_task_iterator(task_iter);
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
144 task_iter=prev_iter;
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
145 }
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
146 restore_memory(task_iter->state->memory);
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
147 } else {
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
148 task_iter=create_task_iterator(list,out,task_iter);
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
149 }
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
150 goto list->phils->next(list->phils,list);
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
151 }
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
152 \end{verbatim}
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
153 }
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
154 検証対象プログラムのコードセグメントはこのtableauコードセグメントに遷移するようにする。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
155 \verb|lookup_StateDB()|関数で状態データベースからコードセグメントの実行によって
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
156 得られた状態を検索・登録していく。登録する際にそのまま登録するのではなく、
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
157 変数を記録したBinary Treeをコピーして登録していく。この際、同じ内容の変数が
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
158 あった場合は、同じ領域を指すことで状態を共有するようにする。
97f508fb5bf2 *** empty log message ***
atsuki
parents: 19
diff changeset
159
19
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
160 {\small
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
161 \begin{thebibliography}{9}
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
162 \bibitem{bib:jssst2000kono}
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
163 河野真治. ``継続を持つCの下位言語によるシステム記述''.
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
164 日本ソフトウェア科学会第17回大会, 2000.
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
165 \bibitem{bib:sigos2007}
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
166 下地篤樹, 河野真治. ``線形時相論理によるContinuation based Cプログラムの検証''.
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
167 情報処理学会システムソフトウェアとオペレーティング・システム研究会(OS), April, 2007.
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
168 \end{thebibliography}
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
169 }
aadf38a2deb2 Initial revision
atsuki
parents:
diff changeset
170 \end{document}