大阪市中央区 システムソフトウェア開発会社

営業時間:平日09:15〜18:15
MENU

続・gets

株式会社クローバーフィールドの経営理念
著者:高木信尚
公開日:2017/05/29
最終更新日:2018/06/20
カテゴリー:技術情報

高木です。こんばんは。

私は基本的には朝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でなければ使えませんから。

    前の記事 :
    上に戻る