ut-issl / c2a-core

Satellite Flight Software: Command-Centric Architecture
MIT License
51 stars 11 forks source link

assertを入れるか検討する #255

Open meltingrabbit opened 2 years ago

meltingrabbit commented 2 years ago

概要

assertを入れるか検討する

詳細

みたいなのを入れてみるか検討する.

到達することを想定していない switch default に来たら気付けるように,みたいな?

close条件

検討したら

sksat commented 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

meltingrabbit commented 2 years ago

あー,完全に誤認してた. < コンパイル時

meltingrabbit commented 2 years ago

Cだと #ifdef で落とすもんね.コンパイル時.

まあプリプロセッサ定義しか使えないんだけど...

sksat commented 2 years ago

前にコンパイル時検査したいな〜〜〜と思ったことはあって,

みたいな曲芸をすればできなくはないなあとは思ったんですが,しかし...

sksat commented 2 years ago

assert()は実行時に落とすわけなのでまずどうやって動かすねん/落ちた後どうすんねんという問題があるわけですが,我々にはSILSという武器があるので入れられるところに入れまくるのはかなりアリだと思っています(そしてCIでSILS回したくなってくる).

meltingrabbit commented 2 years ago

そうなんよね < SLISがある

もうちょっとで https://github.com/ut-issl/s2e-user-for-c2a-core/pull/7 をマージするので,SILSはととのう.

あとはwingsの公開を待ち,んで,wingsどうCIで動かすか...ってのはあるんだけど....

meltingrabbit commented 2 years ago

ただ,どこで落ちたか,わかりにくいよね.プロセスkillされちゃうだけだと.

sksat commented 2 years ago

そんなことはなくて,こんなかんじになります.そしてSILSではC2A普通にリンクするので素のassert()でいい.

image

meltingrabbit commented 2 years ago

え,行数わかるの,まじか.あれ?いいの?っておもったけど,リリース版は NDEBUG で落とすからいいのか.

meltingrabbit commented 2 years ago

なるほどね

#define       assert(x) ( x ? (void) 0 : (fprintf(stderr,\
              "ASSERTION FAILED: "#x" FILE %s,LINE %d \n", \
              __FILE__,__LINE__),abort(),(void)0))
sksat commented 2 years ago

ちょっと例分かりにくかったので差し替えましたが中身も分かる.
です > リリース版は NDEBUG で落とす

sksat commented 1 year ago

ドライバを書く時にこういう雑な assert もどきを突っ込んで当然便利だったので,こういうかんじのでも c2a-core にあるといいかもという気持ちになってきた

#define assert_eq(_Expression1, _Expression2) { \
    if((_Expression1) != (_Expression2)){ \
        printf(__FILE__ ":%d: assertion error: " #_Expression1 " != " #_Expression2 " = %d \r\n", __LINE__, (_Expression2)); \
    } \
}
meltingrabbit commented 1 year ago

よさそう