yohhoyの日記

技術的メモをしていきたい日記

gets関数の最期

C標準ライブラリにおいてバッファオーバーフロー脆弱性の代名詞とされていた関数getsは、プログラミング言語Cの最新規格C11にて標準規格から削除された。
2018-09-01追記:プログラミングC++言語においてもC++14で削除された。

#include <stdio.h>

char buf[10];
gets(buf);
/* 10文字以上入力されるとバッファオーバーフロー(C99以前)
   C11ではgets関数は存在しないためill-formedとなる */

C11でもバッファサイズとファイルポインタを指定する関数fgetsはそのまま使えるため、fgets(buf, sizeof(buf), stdin)などで代替可能。

JTC1/SC22/WG14 N1570 Foreword/p6より部分引用。

6 This third edition cancels and replaces the second edition, ISO/IEC 9899:1999, as corrected by ISO/IEC 9899:1999/Cor 1:2001, ISO/IEC 9899:1999/Cor 2:2004, and ISO/IEC 9899:1999/Cor 3:2007. Major changes from the previous edition include:

  • removed the gets function (<stdio.h>)

同関数の危険性は各所で指摘されてはいたものの、C11で突然公式に削除された訳では無く、C99 TC1〜TC3*1までをまとめたJTC1/SC22/WG14 N1256において廃止予定かつ非推奨とされていた。(N1256 7.26.9/p2)

7.26.9 Input/output
2 The gets function is obsolescent, and is deprecated.

ちなみに、プログラミング言語C++の最新規格にあたるC++11ではgets関数はまだ残っている。(JTC1/SC22/WG21 N3337 27.9.2/p1)

関連URL

*1:ISO/IEC 9899:1999 に対して、これまで3回の Technical Corrigendum; ISO/IEC 9899:1999 Cor.1:2001, ISO/IEC 9899:1999 Cor.2:2004, ISO/IEC 9899:1999 Cor.3:2007 が発行されている。