Open meltingrabbit opened 2 years ago
まず static_assert()
と assert()
は別物です.前者はコンパイル時にやる検証で,後者は実行時にやる検証.
で,assert()
はCからある文化ですが(実装としてはダメだったらabortするだけなので),static_assert()
はコンパイラが頑張らないといけない.そしてCはコンパイラが頑張れない時代からの言語なので当然そういうのは無い,という.
ただ,C11からはstatic_assert()
的な物体である _Static_assert()
が存在はします.
https://www.ibm.com/docs/ja/zos/2.3.0?topic=declarations-static-assert-declaration-c11
あー,完全に誤認してた. < コンパイル時
Cだと #ifdef
で落とすもんね.コンパイル時.
まあプリプロセッサ定義しか使えないんだけど...
前にコンパイル時検査したいな〜〜〜と思ったことはあって,
_Static_assert()
をC11以前では無に潰すマクロで包むみたいな曲芸をすればできなくはないなあとは思ったんですが,しかし...
assert()
は実行時に落とすわけなのでまずどうやって動かすねん/落ちた後どうすんねんという問題があるわけですが,我々にはSILSという武器があるので入れられるところに入れまくるのはかなりアリだと思っています(そしてCIでSILS回したくなってくる).
そうなんよね < SLISがある
もうちょっとで https://github.com/ut-issl/s2e-user-for-c2a-core/pull/7 をマージするので,SILSはととのう.
あとはwingsの公開を待ち,んで,wingsどうCIで動かすか...ってのはあるんだけど....
ただ,どこで落ちたか,わかりにくいよね.プロセスkillされちゃうだけだと.
そんなことはなくて,こんなかんじになります.そしてSILSではC2A普通にリンクするので素のassert()
でいい.
え,行数わかるの,まじか.あれ?いいの?っておもったけど,リリース版は NDEBUG
で落とすからいいのか.
なるほどね
#define assert(x) ( x ? (void) 0 : (fprintf(stderr,\
"ASSERTION FAILED: "#x" FILE %s,LINE %d \n", \
__FILE__,__LINE__),abort(),(void)0))
ちょっと例分かりにくかったので差し替えましたが中身も分かる.
です > リリース版は NDEBUG
で落とす
ドライバを書く時にこういう雑な assert もどきを突っ込んで当然便利だったので,こういうかんじのでも c2a-core にあるといいかもという気持ちになってきた
#define assert_eq(_Expression1, _Expression2) { \
if((_Expression1) != (_Expression2)){ \
printf(__FILE__ ":%d: assertion error: " #_Expression1 " != " #_Expression2 " = %d \r\n", __LINE__, (_Expression2)); \
} \
}
よさそう
概要
assertを入れるか検討する
詳細
みたいなのを入れてみるか検討する.
到達することを想定していない
switch default
に来たら気付けるように,みたいな?close条件
検討したら