2019/01/10

[c/c++][CERT]errno_t型がない!

C言語再履修シリーズ。

・・・なのだが、書いた記事の復習もする。


[c/c++][CERT]ernor_tという型があるのか
https://hiro99ma.blogspot.com/2018/12/cccerterrort.html

DCL09-C. errno を返す関数は返り値を errno_t 型として定義する
https://www.jpcert.or.jp/sc-rules/c-dcl09-c.html


記事を書いたときは読んだだけだったのだが、errnoを使う機会が出てきたので使ってみた。
みたら、コンパイルエラー!!
打ち間違えなのかと見直したが、そうではない。
どういうことだ、いったい??



errno_t ‐ 通信用語の基礎知識
https://www.wdic.org/w/TECH/errno_t

errno_tは、Microsoftが提案し、Visual C++に追加された変数型である

えー??
いや、でもUbuntu18.04でtypedefされているのも確認したのだ。

オライリー「Cクイックリファレンス」でも、errno_t型はあるように書かれている。
ただ「セキュア関数の戻り値」について言及している箇所なので、条件があるのか?


しかし、#defineを変えても、/usr/include/errno.hを直接includeしても、全然うまくいかない。
std=c11もstd=gnu11もダメだし、__STDC_LIB_EXT1__や__STDC_WANT_LIB_EXT1__もだめだ。
なぜなんだ・・・。


https://wiki.sei.cmu.edu/confluence/display/c/DCL09-C.+Declare+functions+that+return+errno+with+a+return+type+of+errno_t

原文のCERTは、わかりやすい。
というよりも、2018年に更新されているようだから、その影響か。

#ifndef __STDC_LIB_EXT1__
   typedef int errno_t;
#endif

と書いてあるので、__STDC_LIB_EXT1__が定義されていればerrno_tが使えそうなものなのだが、うまくいかんかった(gcc v7.3.0)。


そこまでやるくらいなら、intでいいんじゃないの、と私は思った。

0 件のコメント:

コメントを投稿

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