続・gets

高木です。こんばんは。

私は基本的には朝7:00にブログを公開する方針なのですが、いろいろ事情があって、変な時間になってしまうこともあります。
今日も変な時間に投稿します。

さて、以前の記事で、Cの関数の中では結構なじみ深いものでありながら、非推奨を経て廃止されてしまったgets関数をC++で蘇らせることをやりました。

それはそれで悪くないとは思うのですが、本来Cの関数であるgetsを、わざわざC++を導入しなければ使えないというのも辛い話です。
また、シグニチャが異なるので、完全互換というわけにはいきませんでした。

今回はその反省を踏まえ、C++ではなく純然たるCで、完全互換なgetsを実装してみたいと思います。

とはいえ、もともとある欠陥をそのまま残したのでは面白くありません。
バッファオーバーランを検知できない従来の欠陥を克服し、完全互換のgetsを実現したいと思います。
使用する言語は、C11です。

set_gets_buffer_size関数を用いて事前にバッファサイズを指定しておくことで、バッファオーバーランを回避できるようにしました。
また、バッファサイズを格納する変数gets_buffer_sizeは、_Thread_localとしているのでスレッドセーフです。

_Thread_localはC11からしか使えませんが、C99までならgets関数は使えるので、これで問題ないと判断しました。
そもそも、標準ライブラリと同名の識別子を外部結合にすると未定義の動作になりますので、(getsが廃止された)C11でなければ使えませんから。