20
|
1 \chapter{Continuation based C とメタ計算としての検証手法}
|
|
2 ソフトウェアの規模が大きくなるにつれてバグは発生しやすくなる。
|
|
3 バグとはソフトウェアが期待される動作以外の動作をすることである。
|
|
4 ここで期待された動作は仕様と呼ばれ、自然言語や論理によって記述される。
|
|
5 検証とは定められた環境下においてソフトウェアが仕様を満たすことを保証することである。
|
|
6
|
|
7 ソフトウェアの検証手法にはモデル検査と定理証明がある。
|
|
8
|
|
9 モデル検査とはソフトウェアの全ての状態を数え上げ、その状態について仕様が常に真となることを確認する。
|
|
10 モデル検査器には Promela と呼ばれる言語でモデルを記述する Spin\cite{spin} や、モデルを状態遷移系で記述する NuSMV\cite{nusmv}、C言語/C++ を記号実行する CBMC\cite{cbmc} などが存在する。
|
|
11 定理証明はソフトウェアが満たすべき仕様を論理式で記述し、その論理式が恒真であることを証明する。
|
|
12 定理証明を行なうことができる言語には、依存型証明を行なう Agda\cite{agda} や Coq\cite{coq} 、 ATS2\cite{ats2} などが存在する。
|
|
13
|
21
|
14 モデル検査器や証明でソフトウェアを検証する際、検証を行なう言語と実装に使われる言語が異なるという問題がある。
|
|
15 言語が異なれば二重で同じソフトウェアをせざるを得なくなる上、検証に用いるソースコードは状態遷移系でプログラムを記述するなど実装コードに比べて記述が困難である。
|
|
16 検証されたコードから実行可能なコードを生成可能な検証系もあるが、既存の実装に対する検証は行なえない。
|
|
17 そこで、当研究室では検証と実装が同一の言語で行なえる Continuation based C\cite{cbc} 言語を開発している。 %TODO: ref
|
|
18
|
|
19 Continuation based C (CbC)はC言語と似た構文を持つ言語である。
|
|
20 CbC では処理の単位は関数ではなく CodeSegment という単位で行なわれる。
|
|
21 CodeSegment は値を入力として受け取り出力を行なう処理単位であり、CodeSegment を接続していくことによりソフトウェアを構築していく。
|
|
22 CodeSegment の接続処理はメタ計算として定義されており、実装や環境によって切り替えを行なうことができる。
|
|
23 検証を行なうメタ計算を定義することにより、CodeSegment の定義を検証用に変更することなくソフトウェアの検証を行なうことができる。
|
|
24
|
|
25 本論文では CbC のメタ計算として検証手法の提案と CbC の型システムの定義を行なう。
|
|
26 モデル検査的な検証として、状態の数え上げを行なう有限のモデル検査と仕様の定義を CbC 自身で行なう。
|
|
27 また、証明的な検証として CbC における型システムを部分型として定義し、それを利用してCbC のプログラムが証明支援系言語 Agda 上で正しく証明可能な形で定義できることを示す。
|
|
28
|
|
29
|
20
|
30
|
|
31 \section{本論文の構成}
|