2019/01/06

[c/c++][gcc]attribute nonnullは静的チェックか

私は、C言語ではあまりNULLチェックをしない。
初期値としてポインタにNULLを代入する、という実装していればやってもよいのだけど、そう作っていないのであれば無意味な値が入っていても非NULLになるので、やらなくてよいかなぁ、と。

ただ、自分で実装しないのでよいならやっても悪くないかな、という気もする。
Javaの@NonNullみたいなイメージだ。


なんとなくgccのオプションを見ていると、attributeにnonnullというものがあることに気付いた。
試しておくか。


01: #include <stdio.h>
02: 
03: static void print_arg(const char *pStr) __attribute__((nonnull (1)));
04: 
05: 
06: static void print_arg(const char *pStr)
07: {
08:     printf("%s\n", pStr);
09: }
10: 
11: int main(void)
12: {
13:     print_arg(NULL);
14:     return 0;
15: }

$ gcc -o tst nonnull.c
nonnull.c: In function ‘main’:
nonnull.c:13:5: warning: null argument where non-null required (argument 1) [-Wnonnull]
      print_arg(NULL);
      ^~~~~~~~~

コンパイルの段階でwarningが出るのか。
ということは、動的なチェックをするのではない・・・?

01: #include <stdio.h>
02: 
03: static void print_arg(const char *pStr) __attribute__((nonnull (1)));
04: 
05: 
06: static void print_arg(const char *pStr)
07: {
08:     printf("%s\n", pStr);
09: }
10: 
11: int main(void)
12: {
13:     const char *p = NULL;
14:     print_arg(p);
15:     return 0;
16: }

$ gcc -o tst nonnull.c
$

何も出なかったし、実行したらSegmentation faultが発生した。
最適化されて変数pなど消されてしまいそうだが、コンパイル時に出なかったので前の方でチェックしているのだろう。


まあ、動的にチェックしたとしても、じゃあNULLだったときにどう振る舞うんだ?という疑問が出てしまうので、このくらいしかできないのかもしれんな。


「変数の初期化くらいしたらいいやん」と言われたらそれまでなのだが、組み込み向けだとROMの消費を気にしてしまうので、私は減らしてしまうのだ。
まあ、言い訳だな、うん。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。