書いているソースコードを見て、セキュリティとかが甘いと言われた・・・。
く、屈辱だが、意識していないので反論どころか、何も言えるものが無い。
このままじゃまずいなー、と思って探していると、こちらのサイトが見つかった。
CERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/
英語版がすらすら読めるならよかったのだが、残念ながら私には無理だったので、日本語訳してあるのが非常にありがたいので、少しずつ読んでいこう。
読むだけだと身につかないので、気になったところだけブログの記事にしていく予定だ。
長いことC言語で書いているけど、自分の中の常識で固まっている可能性が高いので、初心に帰って読んでいこう。
DCL05-C. typedef による型定義ではポインタ型を避ける
https://www.jpcert.or.jp/sc-rules/c-dcl05-c.html
なんでも、ポインタ型をtypedefすると、それにconstしても思ったようなconstにならないらしい。
えー、ほんとかなぁ。
01: #include <stdio.h> 02: #include <string.h> 03: 04: struct kuma { 05: int a; 06: char b[5]; 07: }; 08: 09: typedef struct kuma kuma_t; 10: typedef struct kuma* kumaptr_t; 11: 12: 13: static void func(const kumaptr_t Kuma) 14: { 15: Kuma->a = 20; 16: strcpy(Kuma->b, "def"); 17: } 18: 19: 20: int main(void) 21: { 22: kuma_t k; 23: k.a = 10; 24: strcpy(k.b, "abc"); 25: func(&k); 26: printf("k.a=%d\n", k.a); 27: printf("k.b=%s\n", k.b); 28: return 0; 29: }
$ gcc -o tst -Wall -W typedeptr.c
$ ./tst
k.a=20
k.b=def
むう、コンパイラがエラーを出さない時点で書き込めるのはわかったのだが、やっぱりショックだ。
static void func(const kuma_t *Kuma)
引数をこうやると、コンパイルの時点で失敗する。
疑って悪かった。
でも、Win32 APIなんかはそういう定義がたくさんあったよなぁ、と思ったら、下の方に説明があった。
constまで付けたポインタ型をtypedefしたものも用意していて、そっちを使うのだ。
そうだ、確かにCがついた型もあった。そういう理由だったのか。
まあ、ポインタ型をtypedefしないようにしておく方が簡単だな。
あ、関数ポインタがあるやん。
私はあれが苦手で、typedefしてからじゃないと仮引数なんかにできないのだ。。
これも下の方に書いてあった。
関数ポインタ型は例外だ、と。
ありがたい。
いや、別に従わなくてもいいのだが、書いてあると安心するじゃないか。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。