Re: assert() and precondition and invariant
新城@筑波大学筑波です。こんにちは。
In article <cho5h1$27kh@utogw.gssm.otsuka.tsukuba.ac.jp>
kuno@gssm.otsuka.tsukuba.ac.jp writes:
> 久野です。
> assertは「検証」じゃないんですよ。抽象データ型なりをCで実現す
> るときに維持すべき条件も抽象データ型の上で考えて、それをCに翻訳
> したものをCの条件式として書くんじゃないかな。2重チェックという感
> じですかね。
検証と2重チェックか。違いがよくわかりません。
コンパイル時だと検証で、実行時だとチェックですか。
In article <3990477news.pl@rananim.ie.u-ryukyu.ac.jp>
kono@ie.u-ryukyu.ac.jp (Shinji KONO) writes:
> (FITは、なんとなくパス... 京都だったのか)
同志社大学。京都の人は京都市ではないから京都とは言わないのか
もしれない。
> assert は、いいんだけど、「assert で失敗したらどうするの?」
> っていう問題があるんですよね。もし、「失敗したら、これこれ、
> こうする」っていうのがあるなら、
> お前、それは assert ではなくて、プログラムの一部だろう
> と僕は思うし。
普通は、assert() はデバッグ時にしか働きません。デバッグが終っ
たら、消えます。
#ifdef NDEBUG
#define assert(x) /**/
#else
...
#endif
> > Pascal verifier でしたっけ。そういうの書かないとプログラムを
> > コンパイルしてくれないってのは。
>
> これは知らなかった。Proof carrying code とかいう方が業界っぽい
> かも。
Pascal verifier は、昔の話です。Pascal 全盛の時代。
Proof carrying code は、最近の話です。Cで書かれたプログラム
で、バイナリになっているので、まあ機械語になっているのですが、
それをカーネル・モジュールをロードする前に、「この範囲のアド
レスしかアクセスできません」ということを証明するという話を聞
いた時には、これは使えると思いました。
> 検証するには検証する命題を作らないといけないわけですけど、
> それを作り溜めるのが大変とかいう話があるみたいです。例えば、
> 電源が入っている間は、ボタンを押すと、何らかの反応がある
> とかって検証できたらトートロジーだと思いますか?
難しい。まず、電源切れているとプログラムが動いていないから関
係ない。すると、
ボタンを押すと、何らかの反応がある
「反応がある」のは、実時間性まで言わないと意味がないので、
この時点であいまいだけど、たとえば、1秒としましょう。
ボタンを押すと、1秒以内に何らかの反応がある
こういうシステムを作れと言われたら、作れそうな気がするけど、
証明しろと言われると、具体的にどこまで言えば証明になっている
のか、まだ曖昧で。割込みから足算して1秒以内でいいんですか。
\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報 \\
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735