comparison presentation/slide.md @ 53:fa1d602b1676

Add rbtree image
author Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
date Thu, 04 Aug 2016 18:11:02 +0900
parents 02e5ae71c319
children a0bffeced069
comparison
equal deleted inserted replaced
52:02e5ae71c319 53:fa1d602b1676
15 * 網羅的にテストできない 15 * 網羅的にテストできない
16 * ユニットテストと組み合わせて使う 16 * ユニットテストと組み合わせて使う
17 * 検証の計算システムで実行する(メタ計算) 17 * 検証の計算システムで実行する(メタ計算)
18 * Java Path Finder, Valgrind 18 * Java Path Finder, Valgrind
19 * 大規模システムは実行できない 19 * 大規模システムは実行できない
20
21 # ソフトウェアの信頼性向上手法
20 * アルゴリズムの正しさを証明する 22 * アルゴリズムの正しさを証明する
21 * Agda, Coq, Idris といった証明支援系でプログラムを記述する 23 * Agda, Coq, Idris といった証明支援系でプログラムを記述する
22 * 極めて難しい 24 * 極めて難しい
23 * 実装に対して適用できない 25 * 実装に対して適用できない
24 * ソフトウェアの仕様を記述し、その反例が無いかをチェックする 26 * ソフトウェアの仕様を記述し、その反例が無いかをチェックする
75 * メタレベルではポインタを扱っても良い 77 * メタレベルではポインタを扱っても良い
76 * TODO メタ計算の図 78 * TODO メタ計算の図
77 79
78 # CbC のメタ計算の実際 80 # CbC のメタ計算の実際
79 * プログラムで使用する Data Segment は Meta Data Segment で全て定義されている 81 * プログラムで使用する Data Segment は Meta Data Segment で全て定義されている
82
80 ``` 83 ```
81 union Data { 84 union Data {
82 struct Count { 85 struct Count {
83 int x; 86 int x;
84 } count; 87 } count;
92 unsigned int gotoCount; // メタ計算に必要なデータ 95 unsigned int gotoCount; // メタ計算に必要なデータ
93 unsigned int stepOfAddTen; 96 unsigned int stepOfAddTen;
94 }; 97 };
95 ``` 98 ```
96 99
100 # CbC のメタ計算の実際
97 * Meta Code Segment では Data Segment は struct Data という形で一様に処理される 101 * Meta Code Segment では Data Segment は struct Data という形で一様に処理される
98 * メタ計算と通常の計算は stub と meta によって接続される 102 * メタ計算と通常の計算は stub と meta によって接続される
103
99 ``` 104 ```
100 __code addTen_stub(struct Context* context) { 105 __code addTen_stub(struct Context* context) {
101 goto addTen(context, context->data[Count]); 106 goto addTen(context, context->data[Count]);
102 } 107 }
103 108
115 p.x = p.x*2; 120 p.x = p.x*2;
116 goto meta(context, ShowValue); 121 goto meta(context, ShowValue);
117 } 122 }
118 ``` 123 ```
119 124
125 # CbC のメタ計算の実際
120 * デフォルトの meta 126 * デフォルトの meta
121 * meta を変更することで平行計算や例外処理やソフトウェア検証を行なう 127 * meta を変更することで平行計算や例外処理やソフトウェア検証を行なう
122 128
123 ``` 129 ```
124 __code meta(struct Context* context, enum Code next) { 130 __code meta(struct Context* context, enum Code next) {
183 * 各ノードは赤または黒の色を持つ 189 * 各ノードは赤または黒の色を持つ
184 * ルートの色は黒である 190 * ルートの色は黒である
185 * 赤ノードは2つの黒ノードを子として持つ(よって赤ノードが続くことはない) 191 * 赤ノードは2つの黒ノードを子として持つ(よって赤ノードが続くことはない)
186 * ルートから最下位ノードへの経路に含まれる黒ノードの数はどの最下位ノードでも一定である 192 * ルートから最下位ノードへの経路に含まれる黒ノードの数はどの最下位ノードでも一定である
187 * 仕様: 最も長い経路は最も短い経路の高々2倍に収まる 193 * 仕様: 最も長い経路は最も短い経路の高々2倍に収まる
188 * todo 図を入れておこう 194
189 195 ![rbtree](./images/rbtree.svg){:width="35%"}
190 # Verification of Red-Black Tree
191 * どのような順番で要素が挿入されても常に仕様が満たされることを確認する
192 * 仕様を満たさないような挿入順番があればそれを表示する
193 * 木への挿入は有限の個数だけ行なわれる
194 196
195 # Verification Library Akasha 197 # Verification Library Akasha
196 * 本研究で作成した検証用メタ計算ライブラリ 198 * 本研究で作成した検証用メタ計算ライブラリ
197 * 実装コードの ``meta`` を上書きするだけで検証を行なうことができる 199 * 実装コードの `meta` を上書きするだけで検証を行なうことができる
198 * 深さ優先探索で有限個の要素の挿入順番を総当たりで列挙 200 * どのような順番で要素が挿入されても常に仕様が満たされることを確認する
199 * 挿入後の木はきちんとバランスしているかチェックする 201 * 仕様を満たさない挿入順番があればそれを表示
200 * Meta Data Segment に挿入順番や実行履歴を記憶させる 202 * 深さ優先探索で有限個の要素の挿入順番を総当たりで列挙
203 * 挿入後の木はきちんとバランスしているかチェックする
204 * CbC のメタ計算 Akasha では要素数13個までチェックできた
205 * 実装にわざとバグを入れた場合にはバランスしていない入力例を返した
201 206
202 # C Bounded Model Checker 207 # C Bounded Model Checker
203 * Carnegie Mellon University で開発されている ANSI-C の記号実行モデルチェッカ 208 * Carnegie Mellon University で開発されている記号実行モデルチェッカ
209 * C, C++, Java に対応
204 * CbC は `__code` を `void` に、`goto` を `return` に変えると C Syntaxになる 210 * CbC は `__code` を `void` に、`goto` を `return` に変えると C Syntaxになる
205 * Red-Black Tree を C に変換して検証 211 * コードを C に変換して検証
206 * 挿入順番は非決定的な入力 `nondet_int` を使う 212 * 挿入順番は非決定的な入力 `nondet_int` を使う
207 213 * 関数呼び出しやループは展開される
208 # Result of Verification 214 * 展開可能な最大数まで展開しても赤黒木の仕様を検証できず
209 * CbC のメタ計算 Akasha では要素数13個までチェックできた 215
210 * CBMC ではチェックできなかった 216 # Conclusion
211 217 * 動作するプログラムの記述を変更せず検証を行なえた
212 | | akasha | CBMC | 218 * テストケースの自動生成+仕様の反例表示ができた
213 |----------------------------------|:------:|:----:| 219 * CBMC では検証できない範囲の検証を行なうことができた
214 | 要素数1個までは仕様を保証 | 可 | 不可 | 220 * 総当たりでチェックしているため
215 | 要素数13個までは仕様を保証 | 可 | 不可 |
216 | 実装にバグを入れた際に反例を表示 | 可 | 不可 |
217
218 221
219 # Comparison of tools 222 # Comparison of tools
220 223
221 | | akasha | cbmc | unit test | Spin | 証明 | JavaPathFinder | valgrind | 224 | | akasha | cbmc | unit test | Spin | 証明 | JavaPathFinder | valgrind |
222 |------------------------|:----------:|:--------------:|:----------:|:------------:|:------------:|:---------------:|:--------:| 225 |------------------------|:----------:|:--------------:|:----------:|:------------:|:------------:|:---------------:|:--------:|
223 | 検証用に実装の変更 | 必要なし | 必要なし | 必要なし | 必要 | 必要なし | 必要なし | 必要なし | 226 | 検証用に実装の変更 | 必要なし | 必要なし | 必要なし | 別に記述 | 別に記述 | 必要なし | 必要なし |
224 | 検証用に記述する言語 | 実装と同じ | 実装とほぼ同じ | 実装と同じ | 実装と異なる | 実装と異なる | 必要なし | 必要なし | 227 | 検証用に記述する言語 | 実装と同じ | 実装とほぼ同じ | 実装と同じ | 実装と異なる | 実装と異なる | 必要なし | 必要なし |
225 | 仕様の検証 | 可能 | 可能 | 不可能 | 可能 | 可能 | 不可能 | 不可能 | 228 | 仕様の検証 | 可能 | 可能 | 不可能 | 可能 | 可能 | 不可能 | 不可能 |
226 | メモリリークなどの検出 | 今は不可能 | 不可能? | 不可能 | | | | 可能 | 229 | メモリリークなどの検出 | 不可能 | 可能 | 不可能 | 不可能 | 不可能 | 不可能 | 可能 |
227 | 状態の数え上げ | 可能 | 可能 | 不可能 | 可能 | ものによる | 可能 | | 230 | 状態の数え上げ | 可能 | 可能 | 不可能 | 可能 | 不可能 | 可能 | 不可能 |
228 | 反例の表示 | 可能 | 可能 | 不可能 | | | 不可能 | | 231 | 反例の表示 | 可能 | 可能 | 不可能 | 可能 | 不可能 | 不可能 | 不可能 |
229 232
230 233
231 # Conclusion and Future Works 234 # Future Works
232 * CBMC では検証できない範囲の検証を行なうことができた 235 * 挿入だけでなく削除を含む赤黒木の仕様検証
233 * 動作するプログラムの記述を変更することなく検証を行なえた 236 * 状態の抽象化による探索の効率化
234 * テストケースの自動生成+仕様の反例表示ができた 237 * ポインタへの不正アクセス検出などの機能
235 * 今後の課題 238 * 言語処理系に検証を行ないやすくする機構の導入
236 * 挿入だけでなく削除を含む赤黒木の仕様検証 239
237 * 状態の抽象化による探索の効率化 240 # CBMC Informations
238 * ポインタへの不正アクセス検出などの機能 241 * CBMC 5.4
239 * 言語処理系に検証を行ないやすくする機構の導入 242 * 実行オプション
240 243 * cbmc --unwind 1
241 # TODO: おまけ 244 * cbmc --depth 400 --property verifySpecification.assertion.1
242 * cbmc のバージョン、オプション 245 * 赤黒木のCbC実装
243 * rbtree の行数 246 * 赤黒木部分のみ: 330行
244 * 実行時間 247 * スタックやメモリのアロケータなどを含める: 640行
245 248
246 249
247 250
248 <!-- vim: set filetype=markdown.slide: --> 251 <!-- vim: set filetype=markdown.slide: -->